Org-Mode таблицы с s-выражениями - PullRequest
4 голосов
/ 18 января 2010

Я бы хотел экспортировать из таблиц Org-Mode в s-выражения.

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

Превратится в:

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

Я планирую написать такую ​​настройку, если она еще не существует, но решила, что подключусь к переполнению стека, прежде чем начать изобретать велосипед.

1 Ответ

6 голосов
/ 23 января 2010

Это делает трюк. У него минимальная проверка ошибок.

Используемый интерфейс - это программный интерфейс:

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

В этом случае он вернет запрашиваемый вами пол.

Если вы хотите использовать интерактивно, вы можете вызвать следующую команду для работы с таблицей в регионе . Итак, установите отметку в начале таблицы, переместитесь в конец и введите:

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

Это вставит нужный sexp сразу после таблицы в текущий буфер.

Вот код:

(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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...