** EDYCJA: ** Od czasu tego pisania wydaje się, że część funkcji została bezpośrednio zaimplementowana w trybie markdown. Sprawdź ten komentarz i zawarte w nim linki.
Konfiguracja
Istnieją dwa podejścia, które możesz zastosować.
- Możesz napisać polecenie, które kompiluje kod przeceny (za pomocą polecenia powłoki) i wyświetla html w buforze.
- Możesz wprowadzić pewne modyfikacje w trybie a-la org, aby bufor wyglądał jak renderowany przecena.
Wyjaśniam tutaj, jak zaimplementować numer 2. Po prostu skopiuj cały poniższy kod do pliku inicjującego.
Dodaj reguły blokowania czcionek
Ta zmienna kontroluje wygląd list. Dodaje trochę miejsca do wcięcia listy i używa dość punktora (jeśli twoja czcionka może to wyświetlić).
(defvar endless/bullet-appearance
(propertize (if (char-displayable-p ?•) " •" " *")
'face 'markdown-list-face)
"String to be displayed as the bullet of markdown list items.")
To polecenie faktycznie dodaje reguły. Jest jeden dla list i jeden dla linków.
(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)
Udostępnij link do edycji
Ponieważ używamy tej display
właściwości do ukrywania części linku, musimy powiedzieć blokadzie czcionek, że powinna ona usunąć tę właściwość za każdym razem, gdy usuniesz część linku (w ten sposób nadal możemy go edytować).
(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))
Możemy również zdefiniować polecenie do łatwej edycji, powiązane C-c C-l
, jak w trybie 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)))
(Opcjonalnie) Skonfiguruj niektóre twarze
To powinno wystarczyć na punkty, o które prosiłeś. Jeśli chcesz, aby bufor wyglądał jeszcze bardziej jak obniżka SE, zadzwoń
M-x customize-group RET markdown-faces
i zmień to, co uważasz za stosowne. Skonfigurowałem się i oto, co mam.
(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")))))
Wyniki
Oto, co otrzymasz po pierwszych 2 zestawach konfiguracji:
Oto, co otrzymasz po skonfigurowaniu twarzy. Można się spierać, czy to wygląda lepiej, ja osobiście trzymam się powyższego.