emacs-将org-table导出到buffer
org-mode 的 table 相当好用,究其根本,他可以被无缝引用到 elisp 代码块中,作为一个存储数据的变量。
然而,有的时候我们想将 org-table 与第三方表格软件协作。默认的 org-table-export 函数会将光标所在的 org-table 导出为一个文件,稍后就用 Excel/WPS 等软件打开。不过,我们可以采取更简单的办法转移数据。
(defun my/org-table-export-to-buffer (format)
"将当前 Org 表格按指定 FORMAT 导出到 buffer。
FORMAT 可以是 \"tsv\", \"csv\", \"orgtbl-to-html\" 等。
如果导出 buffer 已经显示在某个窗口中,则重用该窗口更新内容,否则创建新窗口。"
(interactive
(list (read-string (format "导出格式 (默认 %s): "
org-table-export-default-format)
nil nil org-table-export-default-format)))
(unless (org-table-p) (user-error "光标不在 Org 表格内"))
(let* ((table (org-table-to-lisp))
(func-symbol (intern (if (string-prefix-p "orgtbl-to-" format)
format
(concat "orgtbl-to-" format))))
(func (symbol-function func-symbol))
(result (funcall func table '(:raw t)))
(buf-name "*Org Table Export*")
(buf (get-buffer-create buf-name))
(win (get-buffer-window buf))) ; 检查是否已有窗口显示该 buffer
;; 更新 buffer 内容(允许临时修改只读 buffer)
(with-current-buffer buf
(let ((inhibit-read-only t))
(erase-buffer)
(insert result)
(goto-char (point-min))
(set-buffer-modified-p nil)
(read-only-mode 1))) ; 重新设为只读
;; 显示 buffer:优先重用已有窗口,否则新建
(if win
(progn
(select-window win) ; 切换到已有窗口
(message "已更新表格导出内容"))
(switch-to-buffer-other-window buf)
(message "表格已导出到 buffer: %s" buf-name))))
上面的函数可以将光标所在的表格导出到 buffer ,默认是 tsv 格式,也就是用制表符分割列、换行符分割行。这样一来,就可以直接把里面的内容复制,并在表格软件里粘贴了。
如果需要导出为 csv 格式,也可以在运行后的提示框中手动输入。