2010-01-18 4 views
4

Je souhaite exporter des tables Org-Mode vers des s-expressions.Table de mode Org en s-expressions

| first | second | thrid | 
|--------+--------+--------| 
| value1 | value2 | value3 | 
| value4 | value5 | value6 | 

se transformerait en:

((:FIRST "value1" :SECOND "value2" :THIRD "value3") 
(:FIRST "value4" :SECOND "value5" :THIRD "value6")) 

Je prévois d'écrire une telle configuration, si elle n'existe pas encore, mais pensé que je tape dans le stackoverflow avant que je commence à réinventer la roue.

Répondre

6

Cela fait l'affaire. Il a une vérification d'erreur minimale.

L'interface à utiliser est soit l'interface de programmation:

(org-table-to-sexp <location-of-beginning-of-table> <location-of-end-of-table>) 

Dans ce cas, il retournera l'sexp vous avez demandé.

Si vous souhaitez une utilisation interactive, vous pouvez appeler la commande suivante pour opérer sur la table dans le region. Donc, mettre la marque au début de la table, passer à la fin, et le type:

M-x insert-org-table-to-sexp 

Cela insérera le sexp désiré immédiatement après la table dans le tampon courant.

Voici le code:

(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))) 
+0

Je ne sais pas comment j'utiliser cette fonction. Je l'ai ajouté à mon .emacs eval'd mais je ne comprends pas comment je l'utiliserais. Si vous pouviez vous étendre sur la façon d'utiliser cela, je l'apprécierais vraiment. – Wraithan

+0

@Chris J'ai ajouté une commande interactive que vous pouvez simplement taper. Je pense que la question plus large est: comment voulez-vous l'utiliser? –

Questions connexes