使用EmacsClient创建包含文本的新缓冲区

时间:2010-03-17 18:50:30

标签: emacs elisp

我有一个程序可以将文本发送到任何其他程序进行进一步分析(例如sed,grep等)。我希望它将数据发送到Emacs并在那里进行分析。我该怎么办? EmacsClient默认采用文件名,这是一个数据字符串而不是文件,我真的不想创建和删除文件只是为了向Emacs发送数据。

EmacsClient有一个“eval”命令行选项,让您执行lisp代码而不是打开文件。是否有一个简单的lisp函数,它将使用给定的文本打开一个新的缓冲区?

编辑:我正在寻找类似的东西:

emacsclientw.exe -eval (open-new-buffer 'hello world')

新的缓冲区将自动显示“hello world”一词。我不确定如何设置缓冲区的名称。希望能自动编号。

2 个答案:

答案 0 :(得分:6)

这就是你要求的:

emacsclient -e '(open-buffer-with "some\nstuff\nhere")'

(defun open-buffer-with (txt)
  "create a new buffer, insert txt"
  (pop-to-buffer (get-buffer-create (generate-new-buffer-name "something")))
  (insert txt))

显然,您可以自定义open-buffer-with以执行您想要的操作。

您可能需要查看类似的问题:How do I get basic App<->Emacs integration?

答案 1 :(得分:2)

这种做法怎么样?

emacsclient -e '
  (progn
    (pop-to-buffer (generate-new-buffer "Piped")) 
    (insert (decode-hex-string "
    '$(perl -e 'print unpack "H*", qq("Hello, World!")'
    )'")))
'

为了显示目的,我插入了新行来分解这条很长的行。

当我从终端窗口运行时,在我的Emacs窗口中打开一个名为Piped的新缓冲区,其中包含文本"Hello, World!"(带引号)。当我再次运行它时,另一个名为Piped<2>的缓冲区打开,文本相同。

十六进制转义(使用任何其他高级语言,而不仅仅是Perl可能很容易实现)是用于转义引号,否则会终止向(insert)提供的字符串常量。

这种方法在命令行上通过Emacsclient将文本提供给Emacs,因此很长的输入文本可能会给它带来问题。更通用的解决方案可能能够分解长输入数据并将其提供给跨多个Emacsclient调用的Emacs。