Mac OS X Terminal.app иногда иногда начинает интерпретировать переводы строк по-разному! Это можно исправить?

Несколько раз у меня Mac OS X Terminal находился в странном состоянии, в результате чего переводы строки не интерпретируются, как обычно. Как будто они делают часть перевода строки, а не возврат каретки. Например, я обычно вижу что-то вроде этого:

% git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#

Но когда Терминал заканчивается в этом странном режиме, я получаю это вместо:

% git status
# On branch master
                  # Untracked files:
                                    #   (use "git add <file>..." to include in what will be committed)
                                                                                                      #

Я могу создать новое окно терминала, чтобы исправить это, но это немного раздражает. Я хотел бы сохранить то же самое окно активным, если это возможно, на случай, если мне что-то понадобится в буфере прокрутки. Есть ли что-то, что я могу сделать, чтобы исправить вещи на месте, когда это идет не так, как это?

(Я не знаю, уместно ли это, но я обычно получаю это при выходе из emacs. Время от времени я делаю что-то не так и выбираю другую команду случайно вместо C-x C-c, Мои пальцы отменяют это, прежде чем я даже понял, что происходит, поэтому я не знаю, какой это может быть команда, но как только emacs ушел, терминал находится в этом забавном новом режиме.)

2 ответа

Решение

Когда эта проблема возникнет снова, введите в терминале следующую команду:

reset

Это должно сбросить настройки терминала по умолчанию и, надеюсь, решить вашу проблему.

Когда ранние терминалы (и принтеры) получали символ LF (ASCII 10), они перемещали курсор (печатающую головку) на следующую строку, не перемещая ее по горизонтали. Таким образом, последовательность символов / слов, разделенных только LF, сформирует то, что похоже на лестничную клетку. Это то, что вы видите.

Когда программе требуется перейти к началу следующей строки, они устанавливают CR (ASCII 13) и LF на терминал. CR перемещает курсор в начало текущей строки, а LF переходит на следующую строку.

Драйвер tty в системах Unix имеет необязательную выходную постобработку, которая обычно включена, которая преобразует выходной LF в комбинацию CR и LF.

Проблема, которую вы видите, состоит в том, что у tty, который использует ваш эмулятор терминала, отключена эта часть пост-обработки вывода. Вы можете повторно обработать выходную постобработку и преобразование LF → CR LF с помощью этой команды:

stty opost onlcr

Этот тип обработки вывода часто отключается в "полноэкранных" терминальных программах, чтобы они лучше контролировали курсор. Таким образом, если такая программа падает (или уничтожается) таким образом, что она не может восстановить настройки tty, то вы, скорее всего, окажетесь в "режиме ступеньки". Так как есть другие настройки tty, которые могут быть затронуты после такого сбоя, вам может понадобиться что-то более тщательное, чтобы очистить эффекты. Вы можете сбросить текущие настройки tty на разумные значения по умолчанию с помощью следующей команды:

stty sane

reset Команда делает многое из того, что stty sane выполняет также отправку различных последовательностей управления сбросом / инициализацией в эмулятор терминала.

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