Làm cách nào tôi có thể sử dụng hương vị SE của Markdown trong emacs?


17

Tôi muốn sử dụng hương vị SE của markdown trong emacs của tôi. Chế độ Markdown mặc định có một số tính năng (backticks và mã đánh dấu thụt lề, #tạo tiêu đề và >cũng thay đổi phông chữ) nhưng tôi cũng muốn có:

  • * để làm một mục danh sách, bao gồm cả thụt lề.
  • [foo](http://example.com)để hiển thị dưới dạng foo và mở trình duyệt http://example.comkhi nhấp vào.

Lý tưởng nhất, tôi muốn điều này được hiển thị trong emacs của tôi khi được hiển thị Markdown. Ví dụ, nếu tôi viết:

## 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

Tôi muốn nó được hiển thị như thế này trong chính emacs:


Tiêu đề

  • Mục 1
  • mục 2

    while true; do echo foo; done
    

Cuối danh sách và nhiều mã hơn

while true; do echo bar; done

Xem tại đây để biết chi tiết


Điều này có thể đạt được và, nếu vậy, làm thế nào?


Về khối mã được hiển thị: không phải chế độ Markdown làm nổi bật khối mã cho bạn? Bạn đang tìm gì ở đó?
Malabarba

Ngoài ra, bạn có muốn điều này có thể chỉnh sửa được không, như trình soạn thảo WYSIWYG Markdown? Hoặc nó có đủ để hiển thị đầu ra "được biên dịch" trong một bộ đệm riêng không? Cái sau khá đơn giản, cái trước là một thứ khổng lồ mã hóa.
Malabarba

@Malabarba, vâng, mã vẫn ổn. Những gì tôi muốn là i) danh sách tự động thụt lề ii) xử lý url. Thông qua xdg-openhoặc thậm chí chỉ đơn giản là hiển thị địa chỉ đích khi nhấp vào nhưng văn bản liên kết khi không: "Nhấp vào đây " để trở thành Click [here](http://example.com)khi nhấp vào. Chỉ là một cách nhanh chóng để bao gồm liền mạch các URL trong tài liệu văn bản của tôi.
terdon

OK, sau đó cả hai có thể đạt được với font-lock-add-keyword. Tôi sẽ cố gắng viết một cái gì đó vào ngày mai, nếu không ai đánh bại tôi với nó.
Malabarba

Câu trả lời:


19

** EDIT: ** Kể từ khi viết bài này, có vẻ như một phần của các tính năng đã được triển khai trực tiếp trong chế độ đánh dấu. Kiểm tra bình luận này , và các liên kết trong đó.


Cấu hình

Có hai cách tiếp cận bạn có thể thực hiện.

  1. Bạn có thể viết một lệnh biên dịch mã đánh dấu (sử dụng lệnh shell) và hiển thị html trong bộ đệm.
  2. Bạn có thể thực hiện một số tùy chỉnh a-la org-mode để làm cho bộ đệm trông giống như đánh dấu kết xuất.

Tôi giải thích ở đây cách thực hiện số 2. Đơn giản chỉ cần sao chép tất cả các mã dưới đây vào tệp init của bạn.

Thêm quy tắc khóa phông chữ

Biến này kiểm soát cách bạn muốn danh sách nhìn. Nó thêm một số khoảng trống để thụt lề danh sách và sử dụng một dấu đầu dòng đẹp (nếu phông chữ của bạn có thể hiển thị nó).

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

Đây là lệnh thực sự thêm các quy tắc. Có một cho danh sách và một cho các liên kết.

(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)

Làm cho liên kết có thể chỉnh sửa

Vì chúng tôi đang sử dụng thuộc displaytính để ẩn một phần của liên kết, chúng tôi cần nói với khóa phông chữ rằng nó sẽ xóa thuộc tính đó bất cứ khi nào bạn xóa một phần của liên kết (theo cách đó chúng tôi vẫn có thể chỉnh sửa nó).

(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))

Chúng ta cũng có thể định nghĩa một lệnh để chỉnh sửa nó dễ dàng, ràng buộc C-c C-l, như trong chế độ org.

(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)))

(Tùy chọn) Định cấu hình một số khuôn mặt

Điều đó là đủ cho các điểm bạn yêu cầu. Nếu bạn muốn đệm của bạn trông thậm chí nhiều hơn như SE markdown, cuộc gọi

M-x customize-group RET markdown-faces

và thay đổi những gì bạn thấy phù hợp. Tôi đã tự cấu hình, và đây là những gì tôi có.

(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")))))

Các kết quả

Đây là những gì bạn sẽ nhận được sau 2 bộ cấu hình đầu tiên:
nhập mô tả hình ảnh ở đây

Đây là những gì bạn sẽ nhận được sau khi cấu hình khuôn mặt. Không thể tranh cãi liệu điều này có tốt hơn không, cá nhân tôi sẽ gắn bó với cái ở trên.
nhập mô tả hình ảnh ở đây


Ồ Điều đó khá gần hoàn hảo, cảm ơn. Điều này trả lời tất cả mọi thứ tôi yêu cầu, nhưng để có thêm điểm brownie, có cách nào để làm cho liên kết tương tác nhiều hơn không? Ý tôi là, một cách dễ dàng để trích xuất URL. Có thể chuyển đổi giữa [foo][foo](http://bar.com)bằng cách nhấp vào? Tôi không quá bận tâm về các chi tiết nhưng muốn có một cách dễ dàng hiển thị URL nếu muốn. Hiện tại, tôi phải xóa một trong các dấu ngoặc để nó xuất hiện. Tôi có thể sống với điều đó nhưng tôi sẽ quan tâm đến một cách tốt hơn.
terdon

@terdon Xong! ..
Malabarba

Tôi sẽ kết hợp điều này với Chỉnh sửa với Emacs , và sau đó tôi sẽ tiếp quản Khu vực Tri-State!
nispio

@Malabarba dường như có một lỗi ở đó. Tôi nhận được "Unknown rx form nhóm-n '" . Output of --debug-init` ở đây . Có ý tưởng nào không?
terdon

@terdon Có thể nhóm-n chỉ được xác định trong 24.4, tôi sẽ thử kiểm tra. Bạn có thể thử thay thế từng group-n X chỉ với group. Điều đó vẫn có thể làm việc.
Malabarba

5

Một nơi tốt để bắt đầu sẽ markdown-mode.elcó thể được tải xuống từ đây .

Chế độ này không cung cấp org-modekiểu làm đẹp, nhưng nó cung cấp tô sáng cú pháp và một loạt các customizetùy chọn.

Để có được vẻ đẹp phong cách này, một người nào đó sẽ cần phải viết một phần mở rộng cho markdown-mode.el thực hiện các khuôn mặt phông chữ.

  • Hầu hết các khuôn mặt của org-mode.el được xác định trong org-Fac.el .

  • Ngoài ra, bạn sẽ muốn xem cách chế độ org thay thế trực quan văn bản bằng các ký tự. Mã đó là trong org-entity.el . Đây là mã thay thế latex \pmbằng ±.


Cảm ơn, tôi đang sử dụng chế độ đánh dấu tại thời điểm này, như tôi đã đề cập trong câu trả lời của mình. Tôi muốn biết làm thế nào để thực hiện các tính năng còn thiếu và làm thế nào để các emacs hiển thị chúng như được hiển thị. Ngoài ra, tôi muốn biết rằng không thể hiển thị chúng được hiển thị nếu đó là trường hợp.
terdon

Có thể làm như vậy, chế độ org thực hiện cú pháp làm đẹp như thế. Hãy cho tôi một vài phút để tìm mã. Tôi đã thực hiện mã hóa tương tự cho một chế độ chính khác. Tôi đã không nhận ra rằng bạn đã biết về markdown.el.
nixeagle

Tôi đã chỉnh sửa câu trả lời để cung cấp một cách để bắt đầu làm những gì bạn muốn. Khi tôi về nhà, tôi có thể tạo ra một số mã thực hiện chính xác những gì bạn muốn. Như vậy, chế độ org sửa đổi các tiêu đề để ẩn các *mức biểu thị và thay đổi kích thước của tiêu đề dựa trên vị trí của nó trong tài liệu. Nó cũng có thể liên kết định dạng khá.
nixeagle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.