![使用 emacs 编辑内存中的文本](https://linux22.com/image/1373435/%E4%BD%BF%E7%94%A8%20emacs%20%E7%BC%96%E8%BE%91%E5%86%85%E5%AD%98%E4%B8%AD%E7%9A%84%E6%96%87%E6%9C%AC.png)
是否有可能以某种方式在 emacs 中编辑内存中的文本?(即不通过文件系统。)
我正在编写一个脚本,其中我需要编辑一个命令的输出,然后在另一个命令中处理编辑后的文本。
我在想类似的事情
command1 | emacs --edit-std-in-and-write-to-stdout | command2
或者,类似
TEXT=$(command1)
emacs --edit-this $TEXT | command2
答案1
除非以批处理模式运行,否则 Emacs 不会读取标准输入。相反,您可以使用命令行选项传递 Lisp 格式,Emacs 将在初始化后立即对其进行评估:
emacs --eval '(shell-command "command1")'
这将执行command1
并将其输出捕获到名为的缓冲区中*Shell Command Output*
,然后您可以根据喜好重命名、编辑等。
command2
完成后,您可以通过以下方式将结果传递给C-x h M-| command2 RET
:C-x h
调用 mark-whole-buffer,以便区域包含您编辑的整个文本,以及M-|
调用shell-command-on-region
执行command2
并在标准输入上提供区域的内容。(如果您重新绑定了其中任何一个和弦,则只需直接通过调用相关函数即可M-x function-name RET
;与所有交互式 Emacs Lisp 函数一样,它们将使用迷你缓冲区来提示所需的参数。)
与 一样shell-command
,shell-command-on-region
将捕获标准输出到*Shell Command Output*
缓冲区,替换那里的任何内容;如果您想保留 的编辑输出command1
,请在调用 之前重命名缓冲区command2
。)
进一步说明:您可能会发现了解shell-command
和都shell-command-on-region
采用可选的输出缓冲区参数很有用,作为缓冲区或缓冲区名称;如果不存在给定名称的缓冲区,则将创建一个具有该名称的新缓冲区。有关更多信息,请参阅内部文档(C-h f function-name RET
或M-x describe-function RET function-name RET
)。