ฉันจะใช้รสชาติ SE ของ Markdown ใน emacs ได้อย่างไร


17

ฉันต้องการใช้รสชาติ SE ของการ markdown ใน emacs ของฉัน โหมด Markdown เริ่มต้นมีคุณสมบัติบางอย่าง (รหัส backticks และเครื่องหมายย่อหน้า#ทำให้ส่วนหัวและ>เปลี่ยนแบบอักษรด้วย) แต่ฉันต้องการ:

  • * เพื่อสร้างรายการรวมถึงการเยื้อง
  • [foo](http://example.com)เพื่อแสดงเป็นfooและเปิดเบราว์เซอร์เป็นhttp://example.comเมื่อคลิก

เป็นการดีที่ฉันต้องการให้แสดงใน emacs ของฉันในรูปแบบ Markdown ตัวอย่างเช่นถ้าฉันจะเขียน:

## Header

* item 1
* item 2

         while true; do echo foo; done

End of list and more code

    while true; do echo bar; done

 See [here](http://example.com) for details

ฉันต้องการที่จะแสดงผลเช่นนี้ใน emacs ตัวเอง:


หัวข้อ

  • รายการ 1
  • รายการ 2

    while true; do echo foo; done
    

ในตอนท้ายของรายการและรหัสเพิ่มเติม

while true; do echo bar; done

ดูรายละเอียดที่นี่


สามารถทำได้และถ้าเป็นเช่นนั้นได้อย่างไร


เกี่ยวกับการบล็อกรหัสที่กำลังแสดงผล: ไม่มีการเน้นรหัสโหมด Markdown สำหรับคุณหรือไม่ คุณกำลังมองหาอะไรอยู่ที่นั่น?
Malabarba

นอกจากนี้คุณต้องการให้สิ่งนี้สามารถแก้ไขได้เช่น WYSIWYG Markdown editor หรือไม่? หรือมันเพียงพอที่จะแสดงผลลัพธ์ "รวบรวม" ในบัฟเฟอร์ที่แยกต่างหาก? หลังค่อนข้างง่ายอดีตเป็นพฤติกรรมการเข้ารหัส
Malabarba

@ Malabarba ใช่รหัสดี สิ่งที่ฉันต้องการคือ i) รายการที่เยื้องอัตโนมัติ ii) การจัดการ URL ผ่านxdg-openหรือเพียงแค่แสดงที่อยู่เป้าหมายเมื่อคลิก แต่ข้อความลิงก์เมื่อไม่: "คลิกที่นี่ " เพื่อเป็นClick [here](http://example.com)เมื่อคลิก วิธีที่รวดเร็วในการรวม URL ในเอกสารข้อความของฉัน
terdon

ตกลงจากนั้นทั้งสองสิ่งนี้สามารถทำได้ด้วยแบบอักษร - ล็อค - เพิ่ม - คำสำคัญ ฉันจะพยายามเขียนอะไรบางอย่างในวันพรุ่งนี้ถ้าไม่มีใครชนะฉัน
Malabarba

คำตอบ:


19

** แก้ไข: ** ตั้งแต่การเขียนนี้ดูเหมือนว่าส่วนหนึ่งของคุณสมบัติที่ได้รับการดำเนินการโดยตรงในโหมดมาร์กดาวน์ ตรวจสอบความคิดเห็นนี้และลิงก์ในนั้น


องค์ประกอบ

มีสองวิธีที่คุณสามารถทำได้

  1. คุณสามารถเขียนคำสั่งที่รวบรวมรหัส markdown (โดยใช้คำสั่ง shell) และแสดง html ในบัฟเฟอร์
  2. คุณสามารถปรับแต่ง a-la org-mode ได้เองเพื่อทำให้บัฟเฟอร์ดูเหมือน markdown ที่ถูกเรนเดอร์

ฉันอธิบายวิธีใช้หมายเลข 2 ที่นี่เพียงคัดลอกโค้ดด้านล่างทั้งหมดไปยังไฟล์ init ของคุณ

เพิ่มกฎการล็อคแบบอักษร

ตัวแปรนี้ควบคุมวิธีการที่คุณต้องการดูรายการ เพิ่มพื้นที่บางส่วนเพื่อเยื้องรายการและใช้สัญลักษณ์แสดงหัวข้อย่อยที่สวย (ถ้าแบบอักษรของคุณสามารถแสดงได้)

(defvar endless/bullet-appearance
  (propertize (if (char-displayable-p ?•) "  •" "  *")
              'face 'markdown-list-face)
  "String to be displayed as the bullet of markdown list items.")

นี่คือคำสั่งที่เพิ่มกฎจริงๆ มีหนึ่งรายการและอีกหนึ่งลิงก์

(require 'rx)
(defvar endless/markdown-link-regexp
    "\\[\\(?1:[^]]+\\)]\\(?:(\\(?2:[^)]+\\))\\|\\[\\(?3:[^]]+\\)]\\)"
  "Regexp matching a markdown link.")

(font-lock-add-keywords
 'markdown-mode
 '(("^ *\\(\\*\\|\\+\\|-\\|\\) "
    1 `(face nil display ,endless/bullet-appearance) prepend)
   (endless/markdown-link-regexp
    1 '(face nil display "") prepend))
 'append)

ทำให้ลิงก์สามารถแก้ไขได้

เนื่องจากเรากำลังใช้displayคุณสมบัติเพื่อซ่อนส่วนหนึ่งของลิงก์เราจำเป็นต้องบอกตัวอักษรให้ล็อคว่ามันควรจะลบคุณสมบัตินั้นทุกครั้งที่คุณลบส่วนหนึ่งของลิงค์ (ด้วยวิธีที่เรายังสามารถแก้ไขได้)

(add-hook 'markdown-mode-hook #'endless/markdown-font-lock)

(defun endless/markdown-font-lock ()
  "Configure aggressive font-locking of `markdown-mode'."
  (define-key markdown-mode-map "\C-c\C-l" #'endless/markdown-insert-link)
  (add-to-list (make-local-variable 'font-lock-extra-managed-props) 'display))

นอกจากนี้เรายังสามารถกำหนดคำสั่งให้แก้ไขได้อย่างง่ายดายผูกไว้กับC-c C-lเช่นในโหมดองค์กร

(defun endless/markdown-insert-link ()
  "Insert or edit link at point."
  (interactive)
  (if (or (looking-at endless/markdown-link-regexp)
          (and (ignore-errors (backward-up-list) t)
               (or (looking-at endless/markdown-link-regexp)
                   (and (forward-sexp -1)
                        (looking-at endless/markdown-link-regexp)))))
      (let ((data (endless/ask-for-link
                   (match-string-no-properties 1) 
                   (or (match-string-no-properties 2)
                       (match-string-no-properties 3)))))
        (if (match-string-no-properties 2)
            (replace-match (cdr data) :fixedcase :literal nil 2)
          (replace-match (cdr data) :fixedcase :literal nil 3))
        (replace-match (car data) :fixedcase :literal nil 1))
    (let ((data (endless/ask-for-link)))
      (insert "[" (car data) "](" (cdr data) ")"))))

(defun endless/ask-for-link (&optional name link)
  (cons (read-string "Text of the link: " name)
        (read-string "URL of the link: " link)))

(ไม่บังคับ) กำหนดค่าใบหน้าบางส่วน

นั่นควรจะเพียงพอสำหรับคะแนนที่คุณร้องขอ หากคุณต้องการให้บัฟเฟอร์ของคุณดูเหมือนเครื่องหมาย SE มากยิ่งขึ้น

M-x customize-group RET markdown-faces

และเปลี่ยนสิ่งที่คุณเห็นว่าเหมาะสม ฉันทำการกำหนดค่าตัวเองและนี่คือสิ่งที่ฉันได้

(custom-set-faces
 '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
 '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.7))))
 '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.4))))
 '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.1))))
 '(markdown-inline-code-face ((t (:inherit font-lock-constant-face :background "gainsboro"))))
 '(markdown-link-face ((t (:inherit link))))
 '(markdown-pre-face ((t (:inherit font-lock-constant-face :background "gainsboro")))))

ผล

นี่คือสิ่งที่คุณจะได้รับหลังจากการกำหนดค่า 2 ชุดแรก:
ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสิ่งที่คุณจะได้รับหลังจากกำหนดค่าใบหน้าเช่นกัน มันพิสูจน์ได้ว่าสิ่งนี้ดูดีกว่าฉันจะยึดติดกับสิ่งที่กล่าวมาข้างต้น
ป้อนคำอธิบายรูปภาพที่นี่


ว้าว! มันค่อนข้างใกล้เคียงแล้วที่สมบูรณ์แบบขอบคุณ นี่ตอบทุกสิ่งที่ฉันขอ แต่สำหรับจุดบราวนี่พิเศษมีวิธีที่จะทำให้ลิงก์โต้ตอบได้มากขึ้นหรือไม่? ฉันหมายถึงวิธีง่ายๆในการแยก URL เป็นไปได้ไหมที่จะสลับระหว่าง[foo]และ[foo](http://bar.com)โดยการคลิก? ฉันไม่ใส่ใจรายละเอียดมากเกินไป แต่ต้องการแสดง URL ได้อย่างง่ายดายหากต้องการ ในขณะนี้ฉันต้องลบเครื่องหมายวงเล็บอันใดอันหนึ่งเพื่อให้ปรากฏ ฉันสามารถอยู่กับสิ่งนั้นได้ แต่ฉันจะสนใจในวิธีที่ดีกว่า
terdon

@terdon Done! ..
Malabarba

ฉันจะรวมสิ่งนี้กับEdit กับ Emacsแล้วฉันจะเข้ายึด Tri-State Area!
nispio

@ Malabarba ดูเหมือนว่าจะมีข้อผิดพลาด ฉันได้รับ"Unknown rx form group-n '" . Output of --debug-init` ที่นี่ความคิดใด ๆ ?
terdon

@terdon เป็นไปได้ที่ group-n จะถูกกำหนดใน 24.4 เท่านั้นฉันจะลองตรวจสอบดู คุณสามารถลองเปลี่ยนแต่ละที่มีเพียงgroup-n X groupที่อาจยังคงทำงาน
Malabarba

5

เป็นสถานที่ที่ดีที่จะเริ่มต้นที่จะเป็นmarkdown-mode.elซึ่งสามารถดาวน์โหลดได้จากที่นี่

โหมดนี้ไม่มีการorg-modeตกแต่งสไตล์ แต่มีการเน้นไวยากรณ์และcustomizeตัวเลือกที่หลากหลาย

เพื่อให้ได้การตกแต่งสไตล์นี้ใครบางคนจะต้องเขียนส่วนขยายไปยัง markdown-mode.el การนำฟอนต์ใบหน้ามาใช้

  • ที่สุดของใบหน้า org-mode.el มีการกำหนดไว้ในorg-faces.el

  • นอกจากนี้คุณจะต้องดูว่าโหมด org แทนที่ข้อความด้วยอักขระอย่างไร รหัสที่อยู่ในองค์กรได้ entities.el นี่คือรหัสที่แทนที่ยาง\pmด้วย±


ขอบคุณฉันใช้โหมด markdown ในขณะที่ฉันพูดถึงในคำตอบของฉัน ฉันต้องการทราบวิธีการใช้งานคุณสมบัติที่ขาดหายไปและวิธีการใช้ emacs แสดงว่าแสดงผลแล้ว หรือฉันอยากจะรู้ว่ามันเป็นไปไม่ได้ที่จะแสดงมันออกมาถ้าเป็นอย่างนั้น
terdon

เป็นไปได้ที่จะทำเช่นนั้นโหมด org จะทำการตกแต่งไวยากรณ์ให้สวยงาม ให้เวลาฉันสักครู่เพื่อค้นหารหัส ฉันได้ทำโค้ดที่คล้ายกันสำหรับโหมดเมเจอร์อื่น ฉันไม่ได้ตระหนักว่าคุณได้รู้เกี่ยวกับ markdown.el
nixeagle

ฉันได้แก้ไขคำตอบเพื่อให้วิธีการเริ่มทำสิ่งที่คุณต้องการ เมื่อฉันกลับถึงบ้านฉันอาจจะตีรหัสบางอย่างที่ทำในสิ่งที่คุณต้องการ เนื่องจากเป็นโหมด org จะแก้ไขหัวเรื่องเพื่อซ่อน*ระดับ denoting และเปลี่ยนขนาดของหัวเรื่องตามตำแหน่งที่อยู่ในเอกสาร นอกจากนี้ยังสามารถลิงค์รูปแบบสวย
nixeagle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.