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

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