emacs markdown org-mode

Edición de tablas de tuberías Markdown en Emacs



org-mode (5)

El modo Org es tan atractivo que creo que este es un caso para su orgtbl de modo secundario con sintaxis arbitraria para convertir. Una línea que contenga: -, -: o: -: tendría sus dos puntos eliminados, y una segunda línea con <l> , <c> y <r> agregados para informar el modo org de la alineación. La traducción de vuelta no debería ser demasiado difícil entonces. Lamentablemente no soy lo suficientemente bueno en Emacs para escribirlo ahora mismo. Por cierto, el analizador de rebajas de pandoc acepta + según lo generado por org-mode.

Habiéndolo examinado un poco más, creo que los ganchos existentes en modo org requieren un poco más de navegación alrededor del texto, y algunas funciones de edición están en orden. Dado que este es mi primer intento de emacs lisp, mi emacs lisp para convertir entre orgtbl y markdown es horrible, pero he logrado convertir una tabla de prueba.

Me gusta escribir en Markdown y a menudo me encuentro necesitando tablas. ¿Hay alguna buena manera de editar las tablas de tuberías de Markdown en Emacs? Me refiero a este tipo de sintaxis:

| Header | Header | Right | |--------|--------|------:| | Cell | Cell | $10 | | Cell | Cell | $20 |

Primero probé el modo de mesa de Emacs , que está bien, pero está diseñado para "tablas de cuadrícula" que no son compatibles con Markdown (digamos en Markdown de Github).

También existe el modo de tabla de modo org que se puede usar como modo secundario. Esto viene bastante cerca; pero las intersecciones ahora son reemplazadas por caracteres + y no hay soporte para los dos puntos de alineación. Así que org-tblmode primero me da algo como esto:

| Header | Header | Right | |--------+--------+-------| | Cell | Cell | $10 | | Cell | Cell | $20 |

que luego necesito editar manualmente a lo siguiente (edición de caracteres de intersección y adición de dos puntos de alineación):

| Header | Header | Right | |--------|--------|------:| | Cell | Cell | $10 | | Cell | Cell | $20 |

¿Hay algunos pueden que org-tblmode también pueda manejar esto? ¿Qué más utiliza / sugiere para editar las tablas de tuberías de Markdown en Emacs?


Enlace la función a una tecla para una conversión alineada a la derecha de una región:

(defun markdown-regexp-right (beg end) (interactive "r") (replace-regexp "-/|[^-]" "-:|/n" nil beg end) (replace-regexp "-//+-" "-|-" nil beg end) )

Esto reemplazará -+- con -|- y reemplazará -| con :| en el caso de alineación correcta.

Tenga en cuenta que / n está incluido, porque esto asegura que el otro -|- no se cambie a -:| , pero solo -| cuando le sigue una new-line .


Esto es lo que uso para tratar las tablas en el modo de reducción. Puede ser un poco truco pero funciona lo suficientemente bien para mí. Agrega un enlace local a un búfer de rebaja que, al guardar, reemplaza "- + -" con "- | -" en todo el búfer.

(require ''org-table) (defun cleanup-org-tables () (save-excursion (goto-char (point-min)) (while (search-forward "-+-" nil t) (replace-match "-|-")) )) (add-hook ''markdown-mode-hook ''orgtbl-mode) (add-hook ''markdown-mode-hook (lambda() (add-hook ''after-save-hook ''cleanup-org-tables nil ''make-it-local)))


OrgMode tiene una función agradable orgtbl-to-generic para convertir tablas orgmode a formatos extraños. Encontré un ejemplo simple que define un convertidor personalizado basado en orgtbl-to-generic : https://gist.github.com/yryozo/5807243 . También vea la explicación de ORGTBL RECIBIR / ENVIAR características aquí: http://dynamic-thinking.blogspot.ru/2009/11/orgtbl-mode.html . orgtbl-to-gfm definir la función orgtbl-to-gfm en Emacs y colocarla en su carga automática, entonces puede usar el modo orgtbl-mode modo orgtbl-mode para editar tablas.

Pequeña restricción: solo se admiten las alineaciones de la columna derecha e izquierda porque Emacs OrgMode dentro de self no admite la alineación central.

Vea la fuente de modo org de muestra anterior:

<!--- #+ORGTBL: SEND sample orgtbl-to-gfm | Column 1 | Column 2 | |---------------+----------| | | <l> | | Sample line 1 | 100 | | Sample line 2 | 200 | -->

Y el resultado en markdown convertido desde la fuente en modo org:

<!--- BEGIN RECEIVE ORGTBL sample --> | Column 1 | Column 2 | |---|---| | Sample line 1 | 100 | | Sample line 2 | 200 | <!--- END RECEIVE ORGTBL sample -->

Ambos colocados en el mismo archivo.


También me encontré con este problema exacto (soy un convertidor de emacs reciente) y escribí un pequeño script AWK que puede convertir las "tablas de cuadrícula" que mencionaste (es decir, que no utilizo tablas de modo org) en tablas GFM.

Hay un par de maneras en que puedes usar este script. Todo lo que tienes que hacer es marcar la tabla, luego escribir Cu M-| name-of-awk-script RET Cu M-| name-of-awk-script RET (Aprendí este truco de este hilo de ). Eso usará la región como el estándar de la secuencia de comandos AWK y reemplazará la región con la salida. Soy muy novato en escribir ELisp, pero también escribí un par de funciones de ayuda. La función table-gfm-export actualmente no reemplaza el texto de la misma manera que hacerlo interactivamente con Cu M-| sería, porque todavía deja la tabla original en el búfer.

(defun table-gfm-capture (start end) "convert Markdown table to Emacs table there should be no pipes beginning or ending the line, although this is valid syntax. Loses justification." (interactive "r") ;; should prompt user for justification (table-capture start end "|" "[/n][:|-]*" ''center)) (defun table-gfm-export (start end) "uses AWK script to convert Emacs table to GFM Markdown table" (interactive "r") ;; replace gfm_table_format if necessary (shell-command-on-region start end "gfm_table_format" t t) (table-unrecognize))

Una cosa interesante de este script es que también puede reconocer la justificación de las columnas utilizando algunas expresiones regulares simples. La otra función table-gfm-capture , no puede mantener la justificación, por lo que no puede cambiar libremente de un lado a otro. Este sistema está diseñado para realizar todas las ediciones en modo tabla y luego exportar a GFM al final. Es posible que Emacs ya tenga la capacidad de generar tablas de Markdown utilizando table-generate-source , pero por desgracia.

#!/usr/bin/env awk -f # -*- mode: awk -*- BEGIN { FS="|"; first=1; } function detect_justification(f) { if (match(f, /^ .* $/)) { return 0; # center-justified } else if (match(f, / $/)) { return -1; # left-justified } else { return 1; } # right-justified } function gen_field(len, just) { str = sprintf("%*s", len, ""); gsub(/ /, "-", str); if (just <= 0) { # left or center, start with : sub(/-/, ":", str); } if (just >= 0) { # right or center, end with : sub(/-$/, ":", str); } return str; } function gen_rule() { str = ""; # ignore first and last empty fields for (i=1; i < NF; i++) { len = length($i); just = detect_justification($i); str = sprintf("%s%s|", str, gen_field(len, just)); } return str; } function sanitize_line(line) { # strip outer pipes and trailing whitespace if (index(line, "|") == 1) { line = substr(line, 2); } sub(/[ |]*$/, "", line); return line; } ! /^/+/ { print(sanitize_line($0)); if (first) { print(sanitize_line(gen_rule())); first = 0; } }