emacs 用回车覆盖

标签 emacs

我喜欢使用 start-process-shell-command 从 emacs 中启动子进程,例如编译、渲染或单元测试。我知道我可以通过提供缓冲区名称将输出重定向到缓冲区。

(start-process-shell-command "proc-name" "output-buffer-name" command)

很多进程会使用回车作为实时进度条,这样在终端中进度条在最终输出中只占一行。然而,当这个进度条被重定向到一个 emacs 缓冲区时,回车字符被保留,因此缓冲区显示所有状态更新,使得阅读输出变得很痛苦。

有没有办法让 emacs 像终端处理回车一样处理输出缓冲区中的回车?即,将指针返回到行首并覆盖现有文本。

最佳答案

您可以使用 a filter function 执行此操作.

这有点工作,但你只需要在输出中找到以\r 终止的行,然后在缓冲区中找到旧行,删除该行,并用新行替换它。这是一个玩具版本:

// foo.c
#include <stdio.h>
main() {
  int i;
  for (i = 0; i < 10; i++) {
    printf("  count: %d\r", i);
    fflush(stdout);
    sleep(1);
  }
  printf("\n");
}

然后您可以让每个计数行覆盖前一行(在这种情况下通过删除整个缓冲区。)

(defun filt (proc string)
  (with-current-buffer "foo"
    (delete-region (point-min) (point-max))
    (insert string)))

(progn 
  (setq proc
        (start-process "foo" "foo" "path/to/foo"))
  (set-process-filter proc 'filt))

关于emacs 用回车覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407278/

相关文章:

带有 Emacs 的 Python 3

emacs - 如何在 Emacs 中启用 Zen Coding?

emacs - 如何计算 emacs org 模式下子树的字符数?

emacs - 如何使用真实的文件名默认设置查看命令?

emacs - 如何调试使 Emacs 崩溃/使用 100% CPU 的 Emacs lisp?

Emacs multi-term 无法正确显示特殊字符

emacs lisp 如何将按钮插入临时缓冲区而不切换到它

emacs - Emacs 命令的打开定义

emacs - emacs 有有理数数据类型吗

emacs - CEDET 解析时缓冲区被终止