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.