【问题标题】:On Emacs, getting the output of a command sent to a buffer via Emacs-Lisp在 Emacs 上,通过 Emacs-Lisp 获取发送到缓冲区的命令输出
【发布时间】:2011-07-02 05:29:40
【问题描述】:

我想在 ELisp 中编写一个小脚本:

  1. 向给定缓冲区发送命令
  2. 得到它的输出
  3. 解析它
  4. 将其发送到另一个缓冲区

我在第 2 点上苦苦挣扎:我无法获得命令的输出。例如,如果我有一个 shell 缓冲区,我可以使用

(process-send-string "shell" "help\n")

向我的 shell 缓冲区发送“帮助”。然后它将显示可用命令的列表。但是我怎样才能让这个列表在其他地方使用呢?

谢谢,

S4m

【问题讨论】:

    标签: emacs


    【解决方案1】:

    (buffer-string) 返回当前缓冲区的内容,所以(with-current-buffer <buf> (buffer-string)) 将返回<buf> 的内容。

    【讨论】:

    • 这可行,但 的内容可能非常大,然后会减慢我的 emacs。
    • 我不确定您是说我的回答没有回答您的问题,还是您的原始问题被误导了,您不再希望将命令的输出作为其中之一发送到缓冲区步骤。如果您希望完全避免使用缓冲区,可以尝试使用process filter function,但我不确定它会有多大帮助;我不相信缓冲区是这里的瓶颈。
    • dfan,您对我的问题的回答。我刚试过: (send-command-to-buffer "shell" "help" (with-current-buffer "shell" (buffer-string)) 但它返回缓冲区中的整个文本。当然我可以解析它以删除最后一个命令之前的内容,但我发现它不是最理想的,因为我无法控制缓冲区中文本的大小。另外,(with-current-buffer "shell" (buffer-string )) 不起作用,我必须改用“shell”。
    • 我明白了。然后我会在将进程输出发送到缓冲区之前清除缓冲区,或者使用进程过滤器功能。
    • 或者您可以在输出到old-point-max 之前保存缓冲区的大小,然后使用(buffer-substring old-point-max (point-max)) 仅检索该点之后的文本。
    【解决方案2】:

    我不知道确切的 emacs 命令用于此操作,但一种选择是执行以下操作:

    • 在命令行下方的shell缓冲区中设置标记
    • 执行命令。
    • 将点移动到文件末尾并删除该处和标记之间的文本。
    • 移动到目标缓冲区并将文本拉到那里。

    【讨论】:

      【解决方案3】:

      您是否考虑过使用shell-commandshell-command-to-string 函数?

      不要像您问的那样“将命令发送到缓冲区”,但它们都允许通过将为此目的启动的进程运行命令,并将输出转储到目标缓冲区或收集它变成一个字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多