使用emacs eshell的奇怪错误输出(可能与zsh相关?)

时间:2016-12-27 07:24:01

标签: bash emacs zsh eshell

我是Emacs的新手,我正在尝试使用eshell。不幸的是,例如,当我在C文件中出错时,我会收到一些奇怪的错误输出(这只是一个例子;特定错误并不重要):

^[[1m2-2.c:18:18: ^[[0m^[[0;1;31merror: ^[[0m^[[1mexpected ';' after expression^[[0m
    c = getchar()
^[[0;1;32m                 ^
^[[0m^[[0;32m                 ;
^[[0m^[[1m2-2.c:21:5: ^[[0m^[[0;1;31merror: ^[[0m^[[1muse of undeclared identifier 's'^[[0m
    s[i] = c;
^[[0;1;32m    ^
^[[0m2 errors generated.

我不确定这一切意味着什么。我正在使用zsh,而不是正常的bash,所以也许这与它有关?

如果我在普通终端中运行相同的文件,当然我仍会收到错误,但它是可读的。

2 个答案:

答案 0 :(得分:0)

这是你的编译器试图很好并使用颜色和粗体字体之类的东西格式化输出。奇怪的是,它应该可以正常工作。尝试检查eshell-output-filter-functions变量:

C-h v eshell-output-filter-functions

对我来说,变量的值是

(eshell-postoutput-scroll-to-bottom eshell-handle-control-codes eshell-handle-ansi-color eshell-watch-for-password-prompt)

如果您遗漏了列表中的某些元素,请尝试手动添加:

(add-to-list 'eshell-output-filter-functions 'eshell-handle-ansi-color)
(add-to-list 'eshell-output-filter-functions 'eshell-handle-control-codes)

如果您使用的是旧版本的Emacs,则不会有eshell-handle-control-codes这样的功能,您必须自己定义它们。有关示例,请参阅this wiki页面。

PS。这可能是无关的,但您应该尝试编译模式。 M-x compile

答案 1 :(得分:0)

您所看到的是ansi转义序列。大多数终端仿真器会将这些解释为不同的文本属性,例如粗体,各种颜色等。

Emacs通常非常擅长处理这个问题,默认情况下,应该有一个能够处理这些控制代码的输出过滤器。无论是运行旧版本的emacs还是出于某种原因,eshell中的输出过滤器都已更改。

尝试使用-q开关运行emacs并打开eshell并运行编译。如果仍然看到控制字符,则需要尝试设置eshell输出过滤器函数以添加ansi-color支持。如果您没有看到控制代码,那么init文件中的某些内容就是删除或破坏输出过滤器。

这种情况不太可能与zsh有关。事实上,你可能会发现emacs正在使用sh或bash'无论如何。另请注意,emacs对构建程序有更复杂的支持。在Emacs信息手册中查看编译和测试程序。根据您的语言,您可以简化编译过程,使编译程序更具交互性,以简单的方式触发重新编译并在编译器错误和代码之间跳转等。最初可能需要一些工作,特别是如果您的编译器或语言是如此,emacs不能理解'开箱即用,但它是值得的。您甚至可以做一些非常时髦的事情,比如在本地编辑代码并在远程服务器上编译更改等。

最后,如果您只是想继续,而不是花更多时间调整emacs,那么您可以查看编译器选项。大多数编译器都有办法禁用控制代码。寻找像“关闭颜色”这样的东西。或错误信息格式化等。