Странный вывод ошибок с emacs eshell (возможно, связанный с zsh?)

Я новичок в 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 ответа

  1. Это ваш компилятор пытается быть приятным и форматировать вывод, используя цвет и такие вещи, как полужирный шрифт. Что странно, это то, что он должен работать просто отлично из коробки. Попробуйте проверить 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 для примера.

    ПС. Это, вероятно, не связано, но вы должны дать режим компиляции попробовать. M-x compile.

  2. То, что вы видите, — это escape-последовательности ansi. Большинство терминальных эмуляторов интерпретируют их как различные свойства текста, такие как полужирный шрифт, различные цвета и т.д.

    Emacs обычно довольно хорошо справляется с этим, и по умолчанию должен быть выходной фильтр, который способен обрабатывать эти коды управления. Либо вы используете старую версию emacs, либо по какой-то причине выходные фильтры в eshell были изменены.

    Попробуйте запустить emacs с параметром-q, откройте eshell и запустите компиляцию. Если вы все еще видите управляющие символы, то вам нужно попробовать установить функции выходного фильтра eshell, чтобы добавить поддержку ansi-цвета. Если вы не видите управляющие коды, то что-то в вашем файле init либо удаляет, либо нарушает выходные фильтры.

    Это вряд ли связано с zsh. На самом деле, вы, вероятно, обнаружите, что emacs использует sh или bash «под потоком» в любом случае. Обратите внимание также, что emacs имеет более сложную поддержку для построения программ. Посмотрите компиляцию и тестирование программ в руководстве Emacs info. В зависимости от вашего языка, вы можете упростить процесс компиляции, чтобы сделать компиляцию программ более интерактивной с помощью простых способов запуска повторной компиляции и перехода между ошибками компилятора и вашим кодом и т. д. Это может занять немного работы изначально, особенно если ваш компилятор или язык soemthing emacs не понимает «из коробки», но это стоит того. Вы даже можете сделать некоторые действительно фанки вещи, как редактировать код локально и компилировать изменения на удаленных серверах и т.д.

    Наконец, если вы просто хотите начать и не тратить больше времени на настройку emacs прямо сейчас, вы можете посмотреть параметры компилятора. Большинство компиляторов смогут отключить управляющие коды. Ищите такие вещи, как «отключить цвета» или форматирование сообщений об ошибках и т.д.