Я не уверен, является ли это лишь вспомогательным сценарием очистки редактируемой в настоящий момент строки в любом терминале Unix/Linux, или это поведение на самом деле отличается, когда вы запускаете команду MySQL, или, возможно, это зависит от приложения терминала, которое я запускаю ...
Это не зависит от вашего эмулятора терминала; MySQL отличается от того, что вы думаете; и это не подмножество.
Фон
Простые программы Unix и Linux просто read()
из стандартного ввода для их ввода. Историческое соглашение состоит в том, что терминалы в Unix и Linux обычно работают в том, что в разговорной речи называется его историческим названием "приготовленный режим" и тем, что формально и правильно известно как "канонический режим". В этом режиме часть ядра, известная как дисциплина строк, выполняет все редактирование строк, и программа получает последнюю отредактированную строку только из read()
когда пользователь отправляет символ конца строки (обычно LF
) из терминал.
В каноническом режиме существует целый ряд специальных символов, которые дисциплина линии распознает и действует специально. Символ конца строки - только один. Другой - убить персонажа. Это "убивает" буфер редактирования (линейной дисциплины). Поскольку курсор может находиться только в конце строки, средство редактирования линейной дисциплины не имеет механизмов для перемещения курсора в пределах редактируемой строки, это убивает всю строку.
Еще в 1980-х и 1990-х люди хотели лучшего TUI, чем этот. Они хотели иметь возможность перемещать курсор в пределах линии. Они хотели режимы вставки / перегрузки. Они хотели командную историю.
Таким образом, появился GNU Readline и ему подобные. GNU Readline - это библиотека, которая используется рядом популярных программ, включая оболочку Bourne Again и команду mysql
. Readline переключает терминал на то, что в разговорной речи называется историческим названием "необработанный режим" (формальное название - "неканонический режим"). Программа read()
символы с терминала по мере их отправки, без какой-либо промежуточной обработки дисциплиной строки. Readline выполняет все редактирование вне ядра.
В настоящее время терминалы проводят довольно много времени в неканоническом режиме. Они делают, когда современные оболочки читают их вклад. (Не все современные оболочки используют Readline. Но у них всех есть что-то, что использует неканонический режим. Z Shell имеет свой собственный механизм, ZLE. Программы, лицензированные BSD, используют библиотеку BSD libedit
, которую Кристос Зулас взял из оболочки Tenex C для 4.4BSD или Editline.) Они делают, когда программы, которые используют ncurses
, активны. Канонический режим в основном встречается людьми, когда они делают что-то вроде случайного grep
терминала или используют cat
для создания файла из ввода терминала и стремятся быть исключением, а не нормой.
В обычном случае Readline считывает все специальные ключи из линейной дисциплины и создает привязки клавиш (сопоставления последовательностей символов с действиями редактирования), которые сопоставляют специальные символы с действиями, которые выполняются так же, как и дисциплина строк в каноническом режиме. Режим.
Вы можете увидеть, что в дисциплине строка считает специальными символами с помощью команды stty -a
. В частности, он расскажет вам, какой у вас специальный символ kill
. Обычно это Control+ U персонаж ASCII NAK
. Символично, что этот специальный символ известен как VKILL
, от имени константы, используемой для установки его в программах на C и C++.
Обычно Readline (или libedit
, или ZLE, или Editline) будет иметь привязку от символа VKILL
дисциплины строки к одному из своих действий "kill". На самом деле, если только переменная Readline bind-tty-special-characters
отключена, она будет переопределять такую привязку каждый раз, когда она вызывается для чтения новой строки ввода. Это на самом деле трудно отключить.
Есть три предостережения.
- Эти библиотеки являются библиотеками. У них есть различные программно-регулируемые ручки настройки, поэтому программы могут использовать их немного по-разному.
- Команда
mysql
может быть скомпилирована либо с GNU Readline, либо с libedit
. Если он скомпилирован с помощью libedit
то обычная привязка ключей происходит от VKILL
к действию em-kill-line
. Это убивает всю линию и делает то, что вы хотите.
- Если
mysql
скомпилирован с GNU Readline, специальный символ VKILL
обычно связывается с unix-line-discard
. Однако это не совсем то, что вы хотите, потому что оно стирает только с текущей позиции курсора до начала строки. Конечно, это неотличимо от действия дисциплины строки в каноническом режиме, если придерживаться только того, что можно сделать, потому что позиция курсора всегда является концом строки.
Ответ
- Если
mysql
был построен с Readline:
- Обычный Control+U (или любой другой
stty -a
говорит, что ваш kill
персонаж) получит вам unix-line-discard
действия Readline в. Это не совсем то, что вы хотите, потому что оно стирает только с текущей позиции курсора до начала строки.
- Действие, которое вам на самом деле нужно, - это
kill-whole-line
Readline, которая удаляет всю строку независимо от положения курсора.
- К сожалению,
kill-whole-line
не привязана ни к вашему персонажу VKILL
, ни к любому другому персонажу по умолчанию; и Readline будет сбрасывать привязку VKILL
обратно к unix-line-discard
каждый раз, когда вы запускаете новую строку ввода, если только вы не отключите bind-tty-special-chars
и не потеряете автоматическое зеркалирование того, какие специальные символы установлены в Линия дисциплины по stty
.
- Поэтому свяжите какую-либо другую последовательность символов по вашему выбору с
kill-whole-line
в вашем файле ~/.inputrc
, если вы не довольны отключением эффекта bind-tty-special-chars
.
- Если
mysql
был собран с помощью libedit
:
- Пока вы находитесь в режиме "emacs", обычный Control+U (или любой другой
stty -a
называемый вашим символом kill
) будет получать от вас действие libedit
em-kill-line
("строка уничтожения emacs"). Это именно то, что вы хотите.
- Вам не нужно ничего делать в
libedit
~/.editrc
.
- В режиме "vi" ваш персонаж
VKILL
привязан к libedit
vi-kill-line-prev
("vi kill line up to cursor").
Ничто из этого не касается вашего эмулятора терминала.
дальнейшее чтение