Emacs: некоторые программы работают только в терминах, некоторые программы работают только в оболочке

Относительный новичок в Emacs здесь, просто пытаюсь адаптировать мой рабочий процесс программирования, чтобы соответствовать emacs. До сих пор я открыл для себя shell-pop и мне очень нравятся терминалы по требованию, которые всплывают, когда это необходимо для вызова нечетных команд.

Что я понимаю в Emacs, так это то, что shell это "тупой" терминал, который не поддерживает какие-либо коды управления ANSI, и это делает его несовместимым с такими вещами, как ncurses, которые пытаются рисовать сложные пользовательские интерфейсы на эмуляторе терминала. Вот почему вы не можете использовать less или же top или подобное в режиме оболочки.

Однако у меня, похоже, проблемы с ansi-term, это не главное, конец всему, чем он придуман. Конечно, у него нет проблем с запуском less или же git log или даже nano, но есть несколько вещей, которые не могут отображаться правильно, когда они работают в ansi-term, такие как apt-get а также nosetests, Я не совсем уверен, как его зовут, но apt-getВыходные данные характеризуются живым обновлением того, что отображается в самой последней строке, а затем с неизменными строками текста, прокручивающимися над этой строкой. Кажется, что-то среднее между чем-то вроде less и что-то тупее, как cat, как-то ansi-term мне это совсем не нравится, и я получаю очень искаженный вывод, когда кажется, что он выводит все только в одну строку или просто вообще теряет свое место и выводит все случайным образом. В случае nosetests, все начинается нормально, но если какие-либо библиотеки извергают какой-либо STDERR, вывод все идет в ад подобным образом.

С некоторой тряской кажется, что это можно исправить с помощью пюре C-l а также RET, но это не всегда надежно.

Кто-нибудь знает, что здесь происходит? Есть ли способ исправить ansi-term чтобы он мог все правильно отображать? Или, может быть, есть какой-то другой способ, о котором я не знаю, который намного лучше? В идеале мне бы хотелось, чтобы что-то "просто работало" так же легко, как, например, Gnome Terminal, который может запускать все вышеупомянутые программы без единого сбоя.

Спасибо!

3 ответа

Решение

Я решил эту проблему, закомментировав весь мой файл.emacs.el, а затем раскомментировав и перезапустив emacs для каждой строки в файле. Я обнаружил, что только одна строка была ответственна за проблему:

   '(fringe-mode 0 nil (fringe))

(эта строка отключает границы внутри пользовательских переменных-наборов).

Я предполагаю, что это ошибка в Emacs, из-за которой отключение fringe заставляет term-mode искажать вывод, когда любая строка вывода превышает столбцы $COLUMN.

Во всяком случае, мне не очень нравятся полосы, и кажется, что я смог хотя бы отключить левую границу, не вызывая эту проблему:

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

Может быть, apt-get делает разные вещи на основе $TERM переменная окружения. Что произойдет, если вы установите TERM=dumb? Если это заставляет вещи работать, то вы можете экспериментировать с различными значениями, пока не найдете тот, который поддерживает достаточно функций, но все еще работает.

Обратите внимание, что git 2.0.1 (25 июня 2014 г.) теперь лучше обнаруживает тупой терминал при отображении подробных сообщений.
Это может помочь Emacs лучше отображать некоторые сообщения, полученные от git, но fringe-mode Указанная выше ошибка, безусловно, является основной причиной.

Смотри коммит 38de156 Михаила Наумова ( mnaoumov )

sideband.c: не используйте последовательность управления ANSI на нетерминале

Диагностические сообщения, полученные на боковой полосе № 2 со стороны сервера, отправляются со стандартной ошибкой с последовательностью управления терминалом ANSI " \033[K ", который стирает до конца строки, добавленной в конце каждой строки.

Однако некоторые программы (например, GitExtensions для Windows) читают и интерпретируют и / или показывают сообщение, не понимая последовательности управления терминалом, в результате чего их показывают конечным пользователям.
Чтобы помочь этим программам, подавьте последовательность управления, когда стандартный поток ошибок не отправляется на tty.

Другие вопросы по тегам