typora作为文字处理工具很方便,
比如从维基百科上读到一个regex表格.
可以直接复制到typora文档中, 作为后续的素材
复制到org文档中,是这样
心怀妄想的问一下,
org中能够实现typora中那样的便利的格式复制与黏贴
typora作为文字处理工具很方便,
比如从维基百科上读到一个regex表格.
可以直接复制到typora文档中, 作为后续的素材
复制到org文档中,是这样
心怀妄想的问一下,
org中能够实现typora中那样的便利的格式复制与黏贴
挺有用的特性。
需要 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:
这个功能好哇, 非mac用户只能垂涎.
试了下,貌似可行,除了表格,列表和链接自动转换应该也挺有用。演示复制一个 HTML 表格,粘贴为 Markdown 表格:
(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)))))))
很实用......
X11也行
(gui-get-selection nil 'text/html)
复制的数据较大时,这个命令很慢(卡死 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 分钟
(length x)
;; => 262804
(benchmark-run 1 (seq-partition x 2))
;; => (303.95736 2494 293.93334300000055)
所以弃用 seq-partition
,直接索引,快了很多
(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)