Проблемы с символом перевода строки при использовании ansi-term в emacs
Я пытаюсь использовать ANSI-термин в Emacs (настроен для оболочки tcsh). Я вижу некоторые проблемы с символами перевода строки. Если я попробую следующее из терминала (ansi-term), я получу правильный вывод:
myterm > echo "Line1"; echo "Line2"; echo "Line3";
Line1
Line2
Line3
myterm >
Но если я попытаюсь поместить те же строки в сценарий оболочки и попытаться выполнить сценарий от ansi-term, я получу неправильный вывод
Сценарий: (тест)
#!/usr/bin/env tcsh
echo "Line1"; echo "Line2"; echo "Line3";
Запуск скрипта (теста):
myterm > ./test
Line1
Line2
Line3
myterm >
Примечание: /usr/bin/env tcsh указывает на правильную оболочку (это та же оболочка, которую я использовал при вызове ansi-term). Также выполнение скрипта из gnome-терминала также отображает правильный вывод. Я также попытался установить следующие переменные, но это не решило мои проблемы:
(set-terminal-coding-system 'utf-8-unix)
(setq default-process-coding-system '((utf-8-unix . utf-8-unix)))
1 ответ
Если вы установите stty onlcr
в вашем скрипте вы получите поведение, которое вам требуется.
Переводя команду на английский, можно сказать:
Это означает, что вы должны возвращаться и возвращаться, и переходить на новую строку.
Это обходной путь, конечно, потому что этот параметр должен быть установлен по умолчанию. Я могу видеть из вывода stty -a
что вы указали в своих комментариях, что это установлено в tcsh, который запускается в вашем отклике. Я подозреваю, что одна из возможных причин, по которой ansi-term и ваш скрипт оболочки ведут себя по-разному, связана со следующими строками в term.el
(apply 'start-process name buffer
"/bin/sh" "-c"
(format "stty -nl echo rows %d columns %d sane 2>/dev/null;
if [ $1 = .. ]; then shift; fi; exec \"$@\""
term-height term-width)
".."
command switches)))
stty
Команда в вышеупомянутом фактически устанавливает onlcr
дважды, так как
составной вариант -nl
переводит на icrnl -inlcr -igncr onlcr -ocrnl -onlret
и sane
опция переводится как cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Другая возможная причина: для не входящих в систему оболочек tcsh будет только читать /etc/csh.cshrc
и либо ~/.tcshrc
или же ~/.cshrc
когда он запускается, но для оболочек входа в систему он читает ряд других файлов, включая /etc/csh.login
~/.history
или значение $histfile
- Вы должны проконсультироваться с man-страницей для получения полной информации, включая точный порядок, в котором она читает.