1

Какая комбинация клавиш очистит консольную командную строку MySQL?

Я не уверен, является ли это лишь вспомогательным сценарием очистки редактируемой в настоящий момент строки в любом терминале Unix/Linux, или это поведение на самом деле отличается, когда вы запускаете команду MySQL, или, возможно, это зависит от приложения терминала, которое я запускаю ...

В любом случае, я использую Debian lenny Linux box с командной строкой MySQL, и все это делается из windows через putty.

Часто, когда я пишу SQL, я хочу просто "сбросить" текущее редактирование и начать все сначала.

Я знаю, что могу нажать End и затем достаточно Backspace, пока строка не очистится, но искала что-то быстрее ...

Я также знаю, что нажатие Ctrl+C убивает консоль mysql, и я могу затем нажать стрелку вверх, чтобы получить команду, которая выполнила консоль, и запустить ее заново. но это похоже на чрезмерное убийство (и также выводит довольно много текста на экран ...).

Благодарю.

2 ответа2

4

Некоторые полезные ярлыки:

  • Ctrl + W : удалить предыдущее слово, повторять до тех пор, пока строка не станет пустой
  • Ctrl + K : убить все после текущей позиции курсора
  • Ctrl + A : перейти к началу строки. Объедините с Ctrl + K, чтобы удалить это. Я обычно просто удерживаю Ctrl и нажимаю A и K один за другим.

Вы также можете быть не заинтересованы в этом ответе на U & L.se и в сочетаниях клавиш, показанных на рисунке ниже:

3

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

Есть три предостережения.

  1. Эти библиотеки являются библиотеками. У них есть различные программно-регулируемые ручки настройки, поэтому программы могут использовать их немного по-разному.
  2. Команда mysql может быть скомпилирована либо с GNU Readline, либо с libedit . Если он скомпилирован с помощью libedit то обычная привязка ключей происходит от VKILL к действию em-kill-line . Это убивает всю линию и делает то, что вы хотите.
  3. Если 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").

Ничто из этого не касается вашего эмулятора терминала.

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .