** РЕДАКТИРОВАТЬ: ** После написания этой статьи, кажется, что часть функций была непосредственно реализована в режиме уценки. Проверьте этот комментарий и ссылки в нем.
конфигурация
Есть два подхода, которые вы можете использовать.
- Вы можете написать команду, которая компилирует код уценки (используя команду оболочки) и отображает HTML в буфере.
- Вы можете сделать некоторые настройки в стиле org-la, чтобы буфер выглядел как визуализированная уценка.
Я объясняю здесь, как реализовать номер 2. Просто скопируйте весь код ниже в ваш файл инициализации.
Добавьте правила блокировки шрифтов
Эта переменная контролирует, как вы хотите, чтобы списки выглядели. Он добавляет пространство для отступа в списке и использует довольно точный пункт (если ваш шрифт может отображать его).
(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
свойство, чтобы скрыть часть ссылки, нам нужно сообщить font-lock, что оно должно стирать это свойство всякий раз, когда вы удаляете часть ссылки (таким образом, мы все равно можем ее редактировать).
(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")))))
Результаты
Вот что вы получите после первых двух наборов конфигураций:
Вот что вы получите после настройки лиц. Это спорно ли это выглядит лучше, я буду лично придерживаться одного выше.