Question

Je voudrais exporter des tables Org-mode 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 je taperais figuré dans le stackoverflow avant que je commence à réinventer la roue.

Était-ce utile?

La solution

fait le tour. Il a une vérification d'erreur minimale.

L'interface d'utilisation 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 vouliez un usage interactif, vous pouvez appeler la commande suivante pour fonctionner sur la table dans la section région. Donc, mettre la marque au début de la table, passer à la fin, et tapez:

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

Cela va insérer 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)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top