¿Cómo puedo usar el sabor SE de Markdown en emacs?

17

Me gustaría usar el sabor SE de Markdown en mis emacs. El modo Markdown predeterminado tiene algunas características (backticks y código de marca de sangría, #crea un encabezado y >también cambia la fuente) pero también me gustaría tener:

  • * para hacer un elemento de la lista, incluida la sangría.
  • [foo](http://example.com)para aparecer como foo y abrir un navegador http://example.comal hacer clic en él.

Idealmente, me gustaría que esto se muestre en mis emacs como Markdown. Por ejemplo, si tuviera que escribir:

## Header

* item 1
* item 2

         while true; do echo foo; done

End of list and more code

    while true; do echo bar; done

 See [here](http://example.com) for details

Me gustaría que se representara así en emacs:


Encabezamiento

  • Objeto 1
  • elemento 2

    while true; do echo foo; done
    

Fin de la lista y más código

while true; do echo bar; done

Ver aquí para más detalles


¿Se puede lograr esto y, de ser así, cómo?

terdon
fuente
Sobre el bloque de código que se representa: ¿el modo Markdown no resalta los bloques de código para usted? ¿Qué estabas buscando allí?
Malabarba
Además, ¿quieres que esto sea editable, como un editor WYSIWYG Markdown? ¿O es suficiente para mostrar la salida "compilada" en un búfer separado? El último es bastante simple, el primero es un gigante de la codificación.
Malabarba
@Malabarba, sí, el código está bien. Lo que me gustaría es i) listas con sangría automática ii) manejo de URL. Ya sea a través xdg-openo incluso simplemente mostrando la dirección de destino cuando se hace clic, pero el texto del enlace cuando no se hace: "Haga clic aquí " para convertirse Click [here](http://example.com)cuando se hace clic. Solo una forma rápida de incluir URL sin problemas en mis documentos de texto.
terdon
OK, entonces ambos se pueden lograr con font-lock-add-keyword. Trataré de escribir algo mañana, si nadie me gana.
Malabarba

Respuestas:

19

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

  1. Puede escribir un comando que compila el código de descuento (usando un comando de shell) y muestra el html en un búfer.
  2. 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 displaypropiedad 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:
ingrese la descripción de la imagen aquí

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.
ingrese la descripción de la imagen aquí

Malabarba
fuente
¡Guauu! Eso es casi perfecto, gracias. Esto responde a todo lo que pedí, pero para puntos adicionales de brownie, ¿hay alguna manera de hacer que el enlace sea más interactivo? Quiero decir, una forma fácil de extraer la URL. ¿Sería posible alternar entre [foo]y [foo](http://bar.com)haciendo clic? No me importan demasiado los detalles, pero me gustaría una manera de mostrar fácilmente la URL si lo desea. Por el momento, tengo que eliminar uno de los corchetes para que aparezca. Puedo vivir con eso, pero estaría interesado en una mejor manera.
terdon
@terdon Done! ..
Malabarba
¡Combinaré esto con Editar con Emacs , y luego me haré cargo del Área Tri-Estatal!
nispio
@Malabarba parece haber un error allí. Obtengo "Unknown rx form group-n '" . Output of --debug-init` aquí . ¿Alguna idea?
terdon
@terdon Es posible que group-n solo se defina en 24.4, intentaré comprobarlo. Puede intentar reemplazar cada uno de los group-n X con solo group. Eso aún podría funcionar.
Malabarba
5

Un buen lugar para comenzar sería el markdown-mode.elque se puede descargar desde aquí .

Este modo no ofrece org-modeembellecimiento de estilo, pero ofrece resaltado de sintaxis y un conjunto de customizeopciones.

Para obtener este estilo de embellecimiento, alguien necesitaría escribir una extensión para markdown-mode.el implementando font-faces.

  • La mayoría de las caras de org-mode.el están definidas en org-faces.el .

  • Además, querrá ver cómo el modo org reemplaza visualmente el texto con caracteres. Ese código está en org-entity.el . Este es el código que reemplaza el látex \pmcon ±.

nixeagle
fuente
Gracias, estoy usando el modo Markdown en este momento, como mencioné en mi respuesta. Me gustaría saber cómo implementar las características que faltan y también cómo hacer que emacs las muestre como representadas. Alternativamente, me gustaría saber que es imposible mostrarlos renderizados si ese es el caso.
terdon
Es posible hacerlo, org-mode hace embellecimiento de sintaxis así. Dame unos momentos para encontrar el código. He hecho una codificación similar para otro modo mayor. No me di cuenta de que ya sabías sobre markdown.el.
nixeagle
He editado la respuesta para proporcionar una manera de comenzar a hacer lo que quieres. Cuando llegue a casa, podría obtener un código que haga exactamente lo que quieres. Tal como está, el modo org modifica los títulos para ocultar los *niveles de denotación y cambia el tamaño del título en función de dónde se encuentra en el documento. También es capaz de formatear enlaces bonitos.
nixeagle