Frage

Ich würde für den Export wie von Org-Mode Tabellen s-Ausdrücke.

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

würde sich in:

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

Ich plane, eine solche Einrichtung zu schreiben, wenn es noch nicht existiert, aber ich dachte, in die Stackoverflow tippen würde, bevor ich das Rad neu zu erfinden beginnen.

War es hilfreich?

Lösung

Dies funktioniert der Trick. Es hat nur minimale Fehlerprüfung.

Die Schnittstelle zur Anwendung ist entweder die programmatische Schnittstelle:

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

In diesem Fall ist es werde die sexp zurückkehren Sie angefordert haben.

Wenn Sie eine interaktive Nutzung möchten, können Sie den folgenden Befehl aufrufen auf den Tisch arbeiten in der Region . Also, stellen Sie die Markierung am Anfang der Tabelle, verschieben bis zum Ende, und geben Sie:

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

Das wird die gewünschte sexp unmittelbar nach der Tabelle in den aktuellen Puffer einfügen.

Hier ist der 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)))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top