用回车符覆盖emacs

用回车符覆盖emacs,emacs,Emacs,我喜欢使用start process shell命令从emacs中启动子流程,如编译、渲染或单元测试。我知道我可以通过提供缓冲区名称将输出重定向到缓冲区 (start-process-shell-command "proc-name" "output-buffer-name" command) 许多进程将使用回车符作为实时进度条,因此在终端中,进度条只占用最终输出中的一行。但是,当这个进度条被重定向到emacs缓冲区时,回车字符会被保留,因此缓冲区会显示所有状态更新,这使得读取输出非常困难 有

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

(start-process-shell-command "proc-name" "output-buffer-name" command)
许多进程将使用回车符作为实时进度条,因此在终端中,进度条只占用最终输出中的一行。但是,当这个进度条被重定向到emacs缓冲区时,回车字符会被保留,因此缓冲区会显示所有状态更新,这使得读取输出非常困难

有没有一种方法可以让emacs以终端处理回车的方式处理输出缓冲区中的回车?也就是说,将指针返回到行首并覆盖现有文本。

您可以使用

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

//foo.c
#包括
main(){
int i;
对于(i=0;i<10;i++){
printf(“计数:%d\r”,i);
fflush(stdout);
睡眠(1);
}
printf(“\n”);
}
然后,您可以让每个计数行覆盖上一行(在本例中,通过擦除整个缓冲区)

(取消过滤(过程字符串)
(使用当前缓冲区“foo”
(删除区域(点最小值)(点最大值))
(插入字符串)))
(项目
(setq程序
(启动进程“foo”“foo”“path/to/foo”))
(设置过程过滤器过程过滤器)

从seanmcl的filter函数开始,我添加了更多细节,使过滤器能够像bash shell一样处理回车和换行符

;按照bash中显示的方式填充缓冲区
(取消外壳式过滤器(过程字符串)
(let*((缓冲区(进程缓冲区进程))
(窗口(获取缓冲区窗口缓冲区)))
(带当前缓冲区)
(如果(不是(标记))(推动标记))
(交换点和标记);使用标记表示光标位置
(dolist(char(追加字符串nil))
(条件((字符等于字符?\r)
(移动第1行的开头)
((字符等于字符?\n)
(移动第1行的末尾)(换行))
(t
(如果(/=(点)(最大点));覆盖字符
(删除字符1))
(插入字符)
(交换点和标记))
(如有需要)
(使用选定的窗口)
(转到字符(最大点(()()())))