** EDIT: ** Desde a redação deste documento, parece que parte dos recursos foi implementada diretamente no modo de remarcação. Confira este comentário e os links nele.
Configuração
Existem duas abordagens que você pode adotar.
- Você pode escrever um comando que compila o código de remarcação (usando um comando shell) e exibe o html em um buffer.
- Você pode fazer algumas personalizações no modo organizacional para fazer com que o buffer pareça uma redução renderizada.
Eu explico aqui como implementar o número 2. Simplesmente copie todo o código abaixo para seu arquivo init.
Adicione as regras de bloqueio de fonte
Essa variável controla como você deseja que as listas sejam exibidas. Ele adiciona algum espaço para recuar a lista e usa um belo marcador (se sua fonte puder exibi-la).
(defvar endless/bullet-appearance
(propertize (if (char-displayable-p ?•) " •" " *")
'face 'markdown-list-face)
"String to be displayed as the bullet of markdown list items.")
Este é o comando que realmente adiciona as regras. Há um para listas e outro para links.
(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)
Torne o link editável
Como estamos usando a displaypropriedade para ocultar parte do link, precisamos informar ao bloqueio de fonte que ela deve apagar essa propriedade sempre que você excluir parte do link (para que ainda possamos editá-lo).
(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))
Também podemos definir um comando para editá-lo facilmente, vinculado a C-c C-l, como no modo organizacional.
(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)))
(Opcional) Configure algumas faces
Isso deve ser suficiente para os pontos solicitados. Se você deseja que seu buffer se pareça ainda mais com a redução SE, chame
M-x customize-group RET markdown-faces
e mude o que achar melhor. Eu fiz algumas configurações, e aqui está o que eu tenho.
(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")))))
Resultados
Aqui está o que você obterá após os 2 primeiros conjuntos de configurações:
Aqui está o que você obterá depois de configurar os rostos também. É discutível se isso parece melhor, eu pessoalmente vou ficar com o acima.
