** EDIT: ** Починаючи з цього написання, здається, що частина функцій була безпосередньо реалізована в режимі розмітки. Перегляньте цей коментар та посилання на нього.
Конфігурація
Можна скористатися двома підходами.
- Ви можете написати команду, яка компілює код розмітки (за допомогою команди оболонки) і відображає html у буфері.
- Ви можете зробити кілька налаштувань , а-ля орг-режим , щоб зробити буферний зовнішній вигляд , як надана уцінка.
Я пояснюю тут, як реалізувати номер 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
, як у 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)))
(Необов’язково) Налаштуйте деякі обличчя
Цього повинно вистачити для запитуваних балів. Якщо ви хочете, щоб ваш буфер виглядав ще більше, як розмітка 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")))))
Результати
Ось що ви отримаєте після перших двох наборів конфігурацій:
Ось що ви отримаєте після налаштування облич. Сперечається, чи краще це виглядає, я особисто буду дотримуватися вищезгаданого.