** 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 display
propriedade 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.