Как разморозить после случайного нажатия Ctrl-S в терминале?


728

Это ситуация, которая случается со мной довольно часто: после того, как я нажимаю (с другим намерением) Ctrl-Sв терминале, взаимодействие (вход или выход) с ним останавливается. Это, вероятно, своего рода «замок прокрутки» или что-то в этом роде.

Как после этого разморозить терминал?

( На этот раз, я работал с apt-shellвнутри bashвнутренней urxvt--not уверены , какой из них отвечает за специальную обработку Ctrl-S: Я искал историю команд в обратном направлении с C-r, как обычно для Readline, но тогда я хотел пойти «назад "переходит через историю с обычным - по крайней мере, в Emacs - C-s( 1 , 2 , 3 ), но это привело к зависанию терминала. Ну, прокрутка / просмотр страниц для просмотра прошлых вещей все еще работает в терминале, но никакого взаимодействия с процессами там бегу.)


23
Я работал vimи нажал Ctrl-S, чтобы сохранить свои изменения. Uh-ohXD
ADTC

4
Почему это существует в первую очередь?
neverMind9

Ответы:


862

Ctrl-Q

Чтобы вообще отключить это, stty -ixonвставьте скрипт запуска. Чтобы любой ключ снова начал работать, используйте stty ixany.

PS: это не терминал или оболочка, которая делает это, но драйвер терминала ОС.


8
Спасибо! Кстати, там они предложили Ctrl-C; это тоже работает? (И в другом месте , они предложили Ctrl-Q, так же, как и вы.)
imz - Иван Захарящев

23
Ctrl-C работает, но он также посылает сигнал прерывания, который обычно не требуется. (Между прочим, все ключи, используемые для этих вещей, настраиваются с помощью stty.)
ak2

2
Я помню, как пробовал эту комбинацию на моем Apple] [клон, и она тоже сработала - Ctrl-Sа потом Ctrl-Qвозобновить.
sashoalm

19
СЛАВА БОГУ !! Это что-то беспокоило меня годами. Не уверен, почему VIM просто не реализовал это как родной ярлык для сохранения вместо того, что бы он ни делал. Полезно знать, что из-за естественного использования комбинации клавиш CTRL + S (сохранить ярлык) можно выйти из тюрьмы, которая представляет собой замороженный экран VIM, который применим практически во всех приложениях, КРОМЕ VIM.
Краанг Прайм

8
@SanuelJackson Ctrl-S «Сохранить ярлык» применяется практически во всех приложениях DESKTOP, КРОМЕ vim. И кроме Emacs. И нано. И любое другое «приложение», которое вы можете запустить на терминале, именно потому, что оно уже используется терминалом для управления потоком. По той же причине вы не найдете приложение для рабочего стола Linux, использующее сочетания клавиш Ctrl-Alt-FN: потому что оно уже используется системой.
герлос

383

Ctrl- Qэто действительно ответ. Я думал, что добавлю небольшую историю этого, которая слишком длинна, чтобы вписаться в рамки правильного ответа ak2 .

Еще в темные времена терминал был большой частью оборудования, которое подключалось к удаленному устройству (первоначально другому терминалу, потому что телетайпам было намного легче научиться работать, чем к телеграфному ключу) по длинному проводу или по телефонным линиям с модемами. Ко времени разработки Unix код ASCII уже был хорошо установлен (хотя конкурирующий код EBCDIC от IBM все еще был силой, с которой нужно считаться).

Самые ранние терминалы хранили распечатанную запись каждого полученного символа. Пока символы поступают не быстрее, чем печатающая головка может их набрать, по крайней мере. Но как только терминалы на основе ЭЛТ стали возможными, возникла проблема, заключающаяся в том, что на ЭЛТ помещалось всего около 25 строк, а 25 строк по 80 символов представляли достаточно ОЗУ, и никто всерьез не задумывался о предоставлении большего объема ОЗУ для символов, которые прокручивались сверху. экран.

Таким образом, требовалось некоторое соглашение, чтобы сигнализировать, что отправляющая сторона должна сделать паузу, чтобы позволить читателю догнать.

7-битный код ASCII имеет 33 кодовых пункта, предназначенных для управляющих символов (от 0 до 31 и 127). Некоторые из них были действительно хорошо установленные цели, такие как NUL(лидер пустой бумажной ленты для нарезания резьбы, щелей и стыков), DEL( «перечеркнутым» символы на бумажной ленте , указанные пробивать все семь отверстий), BEL(динь!), CR, LF, И TAB, Но четыре были определены в явном виде для управления самого терминального устройства ( DC1к DC4аке Ctrl + Q, Ctrl + R, Ctrl + S и Ctrl + T).

Мое предположение состоит в том, что некоторые инженеры думали, что (как мнемоника), «S» для «Стоп» и «Q» для «Продолжить» были не слишком плохими, и им присвоено DC3значение «пожалуйста, прекратите отправку» и DC1«хорошо» , продолжить отправку сейчас ".

Даже это соглашение было уже хорошо разработано к тому времени, когда Unix покинул гнездо в Bell Labs, чтобы выйти в мир.

Соглашение известно как управление потоком программного обеспечения и чрезвычайно распространено в реальных последовательных устройствах. Это нелегко реализовать правильно, так как это предотвращает использование любого из этих символов для каких-либо других целей в канале связи, и сигнал Стоп должен обрабатываться перед любыми ожидающими принятыми символами, чтобы избежать отправки больше, чем может получить принимающая сторона ручка.

Если это целесообразно, использование дополнительных сигналов вне полосы из последовательного потока данных для управления потоком является чрезвычайно предпочтительным. На подключениях с прямым проводом, которые могут предоставить дополнительные сигнальные провода, вы найдете аппаратное рукопожатие в использовании, которое освобождает эти символы для других целей.

Конечно, сегодняшнее окно терминала не использует реальный физический последовательный порт, имеет полосы прокрутки и вообще не нуждается в программном подтверждении связи. Но конвенция сохраняется.

Я вспоминаю утверждение о том, что Ричард Столлман получал жалобы на его сопоставление Ctrl + S с инкрементным поиском в первых выпусках emacs, и что он был довольно не симпатичен любому пользователю, который должен был зависеть от 7-битного, управляемого программным потоком соединения.


2
Спасибо ... очень интересно ... Мне было интересно: с какой стати кто-то решил продолжить процесс с "Q", который обычно используется (сейчас) для Quit ... Группа QRST объясняет это .....
Peter.O

13
Большое спасибо за эту историю. Я недавно отключил управление потоком по умолчанию в эмуляторе терминала, который я поддерживаю, но мне пришлось довольно быстро его восстанавливать после голосовых протестов традиционалистов Unix, которые все еще используют его. Вместо этого я установил бит ixany, так что по крайней мере люди, которые нажимают ^ S, не зная о ^ Q, не застревают.
ak2

3
@RBerteig Я столкнулся с чем-то похожим, узнав о backspace и delete. Backspace официально ^ H, а удаление ^? Некоторые люди, такие как разработчики Emacs (опять же, Столлман?), Хотели, чтобы ^ H был доступен для общих целей, таких как ярлыки, такие как Справка. Экранирующая последовательность ^ [[3 ~ или что-то подобное было создано для замены ^? и Backspace теперь стал старым символом удаления ^ ?. Фактически, я видел ncurses, специально пропатченные в дистрибутивах Linux для перераспределения этих ключей в terminfo, тогда как ncurses во FreeBSD не исправлен, что вызывает некоторую досадную путаницу, приводящую к тому, что backspace не работает.
penguin359

23
Раньше я удивлялся, почему у DEL был код 127, а не сгруппированы с другими управляющими символами, пока я сначала не играл с бумажной лентой и ASR33. Как только я понял, что это имеет эффект пробивания всех отверстий, что означало, что он может быть перегружен любым ранее пробитым персонажем, чтобы удалить его, это имело смысл.
RBerteig

3
@SanuelJackson Прошло некоторое время с тех пор, как я присмотрелся, но vimrc по умолчанию, поставляемый с Windows, отображал <Cs> в ": update" в течение многих лет. Я также уверен, что видел это в некоторых дистрибутивах для gvim и в прошлом. Если вы используете vim в терминале, эта история все еще очень актуальна. Современные эмуляторы терминала по-прежнему реализуют ключи управления потоком, поэтому, даже если vim отобразит их, он никогда не увидит их, если каждый пользователь не сделает все возможное, чтобы отключить управление потоком, как описано в принятом ответе.
Дрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.