Ctrl + L в терминале

41

Я случайно набрал ctrl+ Lв терминале, и мое окно терминала подскочило на один «экранный» размер. Я посмотрел на сочетания клавиш в «Редактировать» -> «Сочетания клавиш» и не нашел этого сочетания клавиш.

Что делает ctrl+ Lи где это определено?

Parto
источник

Ответы:

58

ctrl+ Lпросто очистить экран терминала.

Это сочетание клавиш, эквивалентное команде clear -x. ссылка

Это свойство bash, так что вы не нашли его под сочетаниями клавиш в вашем gnome-терминале. От man bash:

clear-screen (C-l)
          Clear the screen leaving the current line  at  the  top  of  the
          screen.   With  an  argument,  refresh  the current line without
          clearing the screen.

Смотрите подробный список сочетаний клавиш Bash .

souravc
источник
О, это объясняет это.
Parto
3
Это не просто удар, хотя; Ctrl-L - это символ подачи формы. Это не так часто, но иногда вы увидите ^ L в исходном коде, разделяющем «страницы» кода. Это имело больше смысла, когда принтер интерпретировал его как управляющий символ.
Джошуа Тейлор
@JoshuaTaylor ты прав. Связанная вики статья о
Разрыве
1
^ L - это символ подачи формы в таблице ascii, но он ничего не делает, если только он не получен программой, которая обрабатывает его соответствующим образом (в этом контексте либо bash, либо эмулятор терминала).
Алексис
1
Обратите внимание , что это не является эквивалентом команды по умолчанию clear, потому что она не стирает вашу историю терминала, в то время как команда clearделает, если вы не добавите -xаргумент, так как: clear -x.
Юрислав
18

Если используемая вами оболочка не перехватывает ее, вы вводите символ «Форм подачи» в своем терминале. Если приложение терминала не перехватывает или не использует какое-либо нажатие клавиши, Ctrl+ Letter переводится в код ASCII буквы минус 64 (1). 65 - это ASCII-код «A», «L» - 12-я буква -> код 76. Если оболочка не знает, что делать с кодом, она печатает его.

Печать FF-символа привела к появлению новой страницы на линейном принтере и чистому экрану на терминале (да, тогда я использовал VT-52 со скоростью 300 бод).

Так что Ctrl+ L12, что FF. Точно так же Ctrl+ I- это TAB, и Ctrl+ Gзвонит в колокол ---, если терминал или оболочка не перехватывает его, как, например, Ctrl+ C.

Обратите внимание , с другой ответ: кажется , что Баш делать перехват CTRL- Lи делать clear. Приятно отметить, что bashавторы связали ключ с командой, которая будет делать более или менее то же самое, что код ASCII делал на старых терминалах!

С другой стороны, в моем zshсочетании CTRL- Iработает как TABи CTRL- Hкак Backspace(2).

Старый хороший ASCII ... (обратите внимание, что буква L находится в столбце 4, строке 12, она имеет код ASCII 4 * 16 + 12 = 76).

Изображение из Викисклада

Исходное изображение здесь , из статьи в Википедии об ASCII .


Примечания:

(1) Ctrlдействительно используется, чтобы очистить бит 7.

(2) это источник шутки «не удаётся удалить слово», которую вы когда-нибудь находите, например, «это была плохая ^ H ^ H ^ не такая хорошая идея» ... (обычно слово сильнее, чем плохое!)

Rmano
источник
1
Ницца. Как я могу использовать этот график между прочим? Я вижу, что буква L находится в строке 12 и столбце 4. Тогда я просто минус 32 из 124 или как вы рассчитываете код ASCII?
Parto
@AvatarParto ups, написал 32 вместо 65. Ответ исправлен. Таблица является двоичной, поэтому код является столбцом * 16 + строка.
Rmano
1
Вставка литералов ^Hs или ^Ws удобна, когда вы не можете использовать зачеркивания. :)
Blacklight Shining
8

Control-Lперехвачен и интерпретируется Баш ( на самом деле с помощью в readlineбиблиотеке , которая обрабатывает интерактивное редактирование в командной строке). Это связано с clear-screenфункцией, как писал @souravc.

Обратите внимание на значение Control-L: он определен как подача формы в таблице символов ASCII, но это ничего не значит, если какая-то программа не интерпретирует его соответствующим образом. Терминал не очищает экран, когда видит канал формы, что можно проверить, сохранив ^ L в файле и напечатав его с помощью cat. Когда bash/readlineвидит ^L, он выполняет clear-screenфункцию. Это отправляет последовательность символов, понятную вашему эмулятору терминала (как описано в termcap или terminfo), и дает эффект очистки экрана.

В очень старых принтерах, a ^Lпродвигает бумагу, начинающую печатать на следующем листе, отсюда и название «подача формы». Но современные терминалы и эмуляторы терминалов следуют более новому стандарту ANSI, в котором управляющими командами являются многосимвольные «escape-коды», которые начинаются с ^[(escape). Когда bash видит вас ^L, он, вероятно, отправляет последовательность из двух команд ESC [ H ESC [ J, которая перемещается в верхний левый угол экрана и очищает все, что находится под ним (отсюда и весь экран).

Alexis
источник
На самом деле последовательность ESC [ ESC [ Jтакже очищает историю команд, а CTRL + L последовательность - нет. Последовательность отсылаются терминалу скорее ESC [ H ESC [ 2 J, идти вперед попробуйте сами с этой командой: printf "\033[H\033[2J".
Юрислав
0

Как все уже хорошо объяснили, что такое Ctrl+ Lи что делает, но никто не объяснил, как «отменить» команду, вот несколько команд, которые вы можете набрать, чтобы вернуть вас к тому, что вы делали:

history

даст вам последние 20 команд, которые вы ввели.

tail --lines=20 /var/log/dpkg.log

даст вам последние 20 строк вывода любой установки пакета, которую вы выполняли

Fabby
источник