Emacs:有些程序只在ansi术语中工作,有些程序只使用shell



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

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

然而,我似乎在使用ansi-term时遇到了问题,这并不是人们所说的全部。当然,运行lessgit log甚至nano都没有问题,但当它们在ansi-term中运行时,有一些东西似乎无法正常显示,例如apt-getnosetests。我不太确定它的名字是什么,但apt-get的输出的特点是实时更新最后一行显示的内容,然后在该行上方滚动出不变的文本行。它似乎介于less和更愚蠢的cat之间。不知怎的,ansi-term根本不喜欢这样,我得到了非常混乱的输出,它似乎只在一行上输出所有内容,或者通常只是失去了它的位置,然后随机地输出所有内容。在nosetests的情况下,它一开始还可以,但如果任何库喷出任何STDERR,输出都会以类似的方式进入地狱。

经过一些修改,似乎可以通过混合C-lRET来解决这个问题,但它并不总是可靠的。

有人知道这里发生了什么吗?有没有办法修复ansi-term,使其能够正确显示所有内容?或者可能还有其他我不知道的模式更好吗?理想情况下,我想要像Gnome Terminal这样"简单有效"的东西,它可以运行上面提到的所有程序,而不会出现任何问题。

谢谢!

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

   '(fringe-mode 0 nil (fringe))

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

我想这是Emacs中的一个错误,当任何输出行超过$COLUMN列时,禁用边缘会导致术语模式严重混淆它的输出。

无论如何,我真的不太喜欢边缘,而且似乎我至少能够在不触发这个问题的情况下禁用左边缘:

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

也许apt-get会根据$TERM环境变量做不同的事情。如果设置TERM=dumb会发生什么?如果这能让事情正常运行,那么你可以尝试不同的值,直到你找到一个支持足够多功能但仍然有效的值。

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

参见Michael Naumov提交的38de156(mnaoumov

sideband.c:不在非终端上使用ANSI控制序列

在边带#2上从服务器端接收到的诊断消息被发送到具有ANSI终端控制序列的标准错误";CCD_ 24";擦除到每行末尾附加的行末尾。

然而,一些程序(例如Windows的GitExtensions)在不理解终端控制序列的情况下读取和解释和/或显示消息,导致它们被显示给最终用户
为了帮助这些程序,当标准错误流没有发送到tty时,抑制控制序列。

相关内容

  • 没有找到相关文章

最新更新