Я не уверен, является ли это лишь вспомогательным сценарием очистки редактируемой в настоящий момент строки в любом терминале 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").
Ничто из этого не касается вашего эмулятора терминала.
дальнейшее чтение