Org-mode 中如何方便地复制硬折行的文本到其他应用

大佬能展开细说下这个怎么实现吗?我看了filter-buffer-substring-function的相关文档,还是没搞懂怎么用这个让yank-pop自动join line

我目前的方案是这样的 @SPQR

(defun eli/org2plaintxt (string)
  "Export string to HTML, and convert it into plain text."
  (let ((string (org-export-string-as string 'html t)))
    (shell-command-to-string
     (format "echo \"%s\" | pandoc --from=html --to=plain" string))))

(defun eli/join-line (string)
  (if (and (memq major-mode '(org-mode
                              mu4e-view-mode
                              Info-mode
                              elfeed-show-mode
							  nov-mode))
           current-prefix-arg)
	  (thread-last
		string
		eli/org2plaintxt
		(replace-regexp-in-string "\\([A-Za-z0-9]\\)\n" "\\1 ")
		(replace-regexp-in-string "\n" "" ))
    string))

(advice-add 'buffer-substring--filter :filter-return #'eli/join-line)

我的使用场景多是从 org-mode 等模式中复制纯文本到其他应用,因此去除了 org-mode 的一些标记,需要时 C-u M-w 就好了,没有什么记忆负担。

不知道大家是怎么复制硬折行下的文本的?

5 个赞

相当好用,用上了。感谢大佬分享。 :grinning:

顺便捉个小虫: add-advice → advice-add

1 个赞

感谢大佬解答,受大佬启发我糊了一个功能差不多但是不用pandoc的版本

(defun eli/org2plaintxt (string)
  (cl-flet ((drop-markup (_ content _) (identity content)))
    (cl-letf (((symbol-function #'org-ascii-bold) #'drop-markup)
              ((symbol-function #'org-ascii-italic) #'drop-markup)
              ((symbol-function #'org-ascii-strike-through) #'drop-markup)
              ((symbol-function #'org-ascii-underline) #'drop-markup))
      (let ((org-ascii-bullets nil)
            (org-ascii-underline nil)
            (org-ascii-verbatim-format "%s"))
        (org-export-string-as string 'ascii t)))))
2 个赞

试一下这个插件?

描述

This module copies selected regions in org-mode as formatted text on the clipboard that can be pasted into other applications. When not in org-mode, the htmlize library is used instead.

2 个赞

试用了一下 在 macos上使用完美。能够自动转换成相当美观的格式。

试用了一下,这个包没有处理硬折行吧?

不能确保能百分百正确理解你的硬折行。我试了一下,如下的 org 我复制到 mac 的备忘录里面会变压缩成一行

* heading 1
line 1
line 2
line 3

会变成

Table of Contents

    1. heading 1

1. heading 1

line 1 line 2 line 3

1 个赞

嗯,多谢提醒。我也贴到notes.app里看了一下,确实处理了硬折行了。

谢谢大佬,恕我愚钝,我还是不太懂怎么使用这段代码,这些加入配置文件后,然后执行 C-u M-w 自动就能够把去掉了硬折行的 plain text 加入剪切板了吗?我在一段话上试了一下,复制出来是一个 "<p> 标志

你可以用这个版本,原来的用了 pandoc 转换

1 个赞

谢谢!这个版本可以了。

还有一个小问题,就是比如下面的段落

sentence sentence sentence
sentence
1. abc
2. bcd
3. cdf
sentence

用这个方案复制出来是 sentence sentence sentence sentence 1. abc 2. bcd 3. cdf sentence ,有办法可以识别到其中有的折行其实是真正的分段落吗?也就是希望输出是:

sentence sentence sentence sentence
1. abc
2. bcd
3. cdf
sentence
(defun eli/join-line (string)
  (if (and (memq major-mode '(org-mode
                              mu4e-view-mode
                              Info-mode
                              elfeed-show-mode
							  nov-mode))
           current-prefix-arg)
	  (eli/org2plaintxt string)
    string))
1 个赞

谢谢大佬,完美解决了问题,太6了 :+1: