0

我是 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,所以也许这与它有关?

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

4

2 回答 2

0

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

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

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

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

最后,如果您只是想立即开始而不是花更多时间调整 emacs,您可以查看编译器选项。大多数编译器都有办法禁用控制代码。寻找“关闭颜色”或错误消息格式等内容。

于 2016-12-28T00:44:18.510 回答
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,您必须自己定义它们。有关示例,请参见此 wiki 页面

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

于 2016-12-27T14:31:47.780 回答