org文档完整格式复制与黏贴网页中的表格等

typora作为文字处理工具很方便,

比如从维基百科上读到一个regex表格.

可以直接复制到typora文档中, 作为后续的素材

复制到org文档中,是这样

心怀妄想的问一下,

org中能够实现typora中那样的便利的格式复制与黏贴

1 个赞

挺有用的特性。

需要 Emacs 支持读取剪切板中的 HTML 类型的数据,然后你把 HTML 转换成 Markdown、Org mode 代码插入。跟插入图片类似,Emacs Mac Port 就支持直接插入剪切板中的图片,如果用 Emacs Mac Port 的话,可以给其开发者发个 Feature Request,然后类似这个

(gui-get-selection 'CLIPBOARD 'NSHTMLType)

应该能返回 HTML 数据,macOS 应该有提供了相应的 API。


AppleScript 貌似也能获得 HTML 数据,或许也可以试试用 Pandoc 转换成 Markdown、Org mode:

1 个赞

org-table-create-or-convert-from-region ,留意空格。视频演示

1 个赞

这个功能好哇, 非mac用户只能垂涎.

试了下,貌似可行,除了表格,列表和链接自动转换应该也挺有用。演示复制一个 HTML 表格,粘贴为 Markdown 表格:

11

(defun yank-html-from-clipboard ()
  "Yank HTML from clipboard as Org or Markdown code."
  (interactive)
  (let* ((result
          (condition-case err
              ;; hex-encoded string:
              ;;           < m e t a ......>
              ;; «data HTML3C6D657461......3E»
              (do-applescript "the clipboard as «class HTML»")
            (error
             ;; assume it's user's fault
             (user-error "Can't get HTML data from the clipboard: %s"
                         (error-message-string err)))))
         (data (substring result 10 -1))
         (html (decode-coding-string
                (apply #'unibyte-string
                       (mapcar (lambda (x) (string-to-number x 16))
                               (seq-partition data 2)))
                'utf-8))
         (target (if (derived-mode-p 'org-mode)
                     "org"
                   ;; the official Markdown doesn't support table?
                   "gfm")))
    (insert
     (with-temp-buffer
       (if (zerop (call-process-region html nil "pandoc" nil t nil
                                       ;; https://stackoverflow.com/a/35812743/2999892
                                       "-f" "html-native_divs-native_spans"
                                       "-t" target))
           (buffer-string)
         (error "pandoc failed: %s" (buffer-string)))))))
2 个赞

很实用......

X11也行

(gui-get-selection nil 'text/html)
1 个赞

复制的数据较大时,这个命令很慢(卡死 Emacs),目测是下面这个解码的锅:

试了下下面这样也慢

;; 3C6D6574613E => <meta>
(decode-coding-string
 (mapconcat
  (lambda (x)
    (unibyte-string (string-to-number x 16)))
  (seq-partition data 2)
  "")
 'utf-8)

更新:(seq-partition x 2) 太慢了

我复制了下 Emacs China 首页,得到数据 262804 字符长度,seq-partition 居然需要 5 分钟 :snail:

(length x)
;; => 262804

(benchmark-run 1 (seq-partition x 2))
;; => (303.95736 2494 293.93334300000055)

所以弃用 seq-partition,直接索引,快了很多 :racehorse:

(benchmark-run 1
  (with-temp-buffer
    (set-buffer-multibyte nil)
    (let* ((i 0))
      (while (> (length x) (+ 2 i))
        (insert (string-to-number (substring x i (+ 2 i)) 16))
        (cl-incf i 2)))
    (decode-coding-region (point-min) (point-max) 'utf-8 t)))
;; => (0.26392 1 0.11180400000000645)
1 个赞