tavolo Org-Mode per s-espressioni
-
21-09-2019 - |
Domanda
Vorrei esportare dalle tabelle Org-mode per s-espressioni.
| first | second | thrid |
|--------+--------+--------|
| value1 | value2 | value3 |
| value4 | value5 | value6 |
si trasformerebbe in:
((:FIRST "value1" :SECOND "value2" :THIRD "value3")
(:FIRST "value4" :SECOND "value5" :THIRD "value6"))
Ho intenzione di scrivere una tale impostazione, se non esiste ancora ma Ho pensato di sfruttare lo StackOverflow prima di iniziare reinventare la ruota.
Soluzione
Questo fa il trucco. Ha il controllo degli errori minimi.
L'interfaccia di utilizzo è l'interfaccia programmatica:
(org-table-to-sexp <location-of-beginning-of-table> <location-of-end-of-table>)
In questo caso tornerà la sexp richiesto.
Se si voleva un uso interattivo, è possibile chiamare il seguente comando per operare sul tavolo del regione . Quindi, impostare il segno all'inizio della tabella, spostarsi alla fine, e digitare:
M-x insert-org-table-to-sexp
che inserisce il sexp desiderato immediatamente dopo la tabella nel buffer corrente.
Ecco il codice:
(defun org-table-to-sexp-parse-line ()
"Helper, returns the current line as a list of strings"
(save-excursion
(save-match-data
(let ((result nil)
(end-of-line (save-excursion (end-of-line) (point))))
(beginning-of-line)
(while (re-search-forward "\\([^|]*\\)|" end-of-line t)
(let ((match (mapconcat 'identity (split-string (match-string-no-properties 1)) " ")))
(if (< 0 (length match))
;; really want to strip spaces from front and back
(push match result))))
(reverse result)))))
(require 'cl)
(defun org-table-to-sexp (b e)
"Parse an org-mode table to sexp"
(save-excursion
(save-match-data
(goto-char b)
(let ((headers (mapcar
(lambda (str)
(make-symbol (concat ":" (upcase str))))
(org-table-to-sexp-parse-line)))
(sexp nil))
(forward-line 1) ;skip |--+--+--| line
(while (< (point) e)
(forward-line 1)
(let ((line-result nil))
(mapcar* (lambda (h e)
(push h line-result)
(push e line-result))
headers
(org-table-to-sexp-parse-line))
(if line-result
(push (reverse line-result)
sexp))))
sexp))))
(defun insert-org-table-to-sexp (b e)
"Convert the table specified by the region and insert the sexp after the table"
(interactive "r")
(goto-char (max b e))
(print (org-table-to-sexp b e) (current-buffer)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow