Emacs:有些程序只能在ansi-term中工作,有些程序只能在shell中工作

时间:2012-09-08 03:09:25

标签: shell emacs terminal ansi-term

相对Emacs新手在这里,只是尝试调整我的编程工作流程以适应emacs。到目前为止,我已经发现了shell-pop,我非常喜欢按需点播终端,这些终端在需要时可以弹出奇怪的命令。

到目前为止我对Emacs的理解是shell是一个“哑”终端,不支持任何ansi控制代码,这使得它与ncurses之类的东西不兼容,这些ncurses试图在a上绘制复杂的UI。终端模拟器。这就是为什么你不能在shell模式下使用lesstop或类似的原因。

然而,我似乎遇到了ansi-term的问题,这不是最终的结果,而是它已被破解。当然,运行lessgit log甚至是nano都没有问题,但有些事情在{{{}}运行时似乎无法正常显示1}},例如ansi-termapt-get。我不确定它的名称是什么,但nosetests的输出的特点是实时更新最后一行显示的内容,然后在该行上方滚动出不变的文本行。似乎是apt-get之类的东西和像less之类的东西。不知何故,cat完全不喜欢这个,我得到非常混乱的输出,它似乎只输出一行上的所有东西,或者只是丢失它的位置并随机输出所有东西。在ansi-term的情况下,它开始正常,但如果任何库喷出任何STDERR,输出都会以类似的方式进入地狱。

通过混搭nosetestsC-l,可以解决这个问题,但这并不总是可靠的。

有人知道这里发生了什么吗?有没有办法解决RET以便它可以正确显示所有内容?或者是否有一些我不知道的其他模式更好?理想情况下,我喜欢像“Gnome Terminal”那样毫不费力地“正常工作”的东西,它可以在没有单一打嗝的情况下运行上述所有程序。

谢谢!

3 个答案:

答案 0 :(得分:3)

我通过注释掉我的整个.emacs.el解决了这个问题,然后取消注释并重新启动文件中每一行的emacs。我发现只有以下几行才能解决这个问题:

   '(fringe-mode 0 nil (fringe))

(此行禁用自定义变量内部的条纹)。

我想这是Emacs中的一个错误,当任何输出行超过$ COLUMN列时,禁用边缘会导致term-mode导致输出非常糟糕。

无论如何,我根本不喜欢这些边缘,似乎我能够至少禁用左边缘而不会引发这个问题:

(set-fringe-mode (cons 0 8))

答案 1 :(得分:1)

也许apt-get基于$TERM环境变量做了不同的事情。如果设置TERM=dumb会怎样?如果这可以使事情有效,那么您可以尝试使用不同的值,直到找到支持足够功能但仍然有效的值。

答案 2 :(得分:0)

请注意,git 2.0.1(2014年6月25日)现在可以在显示详细消息时更好地检测哑终端。
可能帮助Emacs更好地显示从git收到的一些消息,但上面报告的fringe-mode错误肯定是主要原因。

commit 38de156

Michael Naumov (mnaoumov)

sideband.c:不要在非终端

上使用ANSI控制序列
  

从服务器端在#2边带上收到的诊断消息通过ANSI终端控制序列" \033[K"发送到标准错误。擦除到每行末尾附加的行尾。

     

但是,某些程序(例如GitExtensions for Windows)在不了解终端控制序列的情况下读取和解释和/或显示消息,从而将其显示给最终用户。
  为了帮助这些程序,在没有将标准错误流发送到tty时,压制控制序列。