** EDITAR: ** Desde este escrito, parece que parte de las características se han implementado directamente en modo de reducción. Mira este comentario y los enlaces que contiene.
Configuración
Hay dos enfoques que puede tomar.
- Puede escribir un comando que compila el código de descuento (usando un comando de shell) y muestra el html en un búfer.
- Puede realizar algunas personalizaciones a-la org-mode para hacer que el búfer se vea como un descuento reducido.
Explico aquí cómo implementar el número 2. Simplemente copie todo el código a continuación a su archivo de inicio.
Agregar las reglas de bloqueo de fuente
Esta variable controla cómo desea que se vean las listas. Agrega algo de espacio para sangrar la lista, y usa un punto bonito (si su fuente puede mostrarlo).
(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 es el comando que realmente agrega las reglas. Hay uno para listas y otro para enlaces.
(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)
Hacer el enlace editable
Debido a que estamos usando la display
propiedad para ocultar parte del enlace, necesitamos decirle a font-lock que debe borrar esa propiedad cada vez que elimine parte del enlace (de esa manera aún podemos editarlo).
(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))
También podemos definir un comando para editarlo fácilmente, vinculado C-c C-l
, como en el modo 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)))
(Opcional) Configurar algunas caras
Eso debería ser suficiente para los puntos que solicitó. Si desea que su búfer se parezca aún más al descuento de SE, llame
M-x customize-group RET markdown-faces
y cambia lo que creas conveniente. Hice algunas configuraciones yo mismo, y esto es lo que obtuve.
(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
Esto es lo que obtendrá después del primer conjunto de 2 configuraciones:
Esto es lo que obtendrá después de configurar caras también. Es discutible si esto se ve mejor, personalmente me quedaré con el anterior.