В этой главе описаны основные возможности интерфейса редактирования командной строки GNU.
В следующих разделах описывается нотация, используемая для представления нажатия клавиш.
Текст С-К читается 'контрол-к' и описывает символ, получающийся при нажатии на клавиши Control и K.
Текст М-К читается 'мета-к' и описывает символ, получающийся при нажатии на клавиши Meta (если таковая имеется) и K. Если у вас нет клавиши Meta, тот же результат можно получить при нажатии ESC K. И то, и другое называется метафированием клавиши К.
Текст М-С-К читается мета-контрол-к и описывает символ, получающийся при метафировании С-К.
Некоторые клавиши имеют собственные названия, их так и обозначают в тексте или инициальном файле (см. раздел 7.3): DEL, ESC, LFD, SPC, RET и TAB.
Часто во время сеанса диалога вы печатаете длинную строку только для того, чтобы потом заметить, что в первом слове есть ошибка. Библиотека чтения строки дает вам множество команд для манипулирования текстом при его наборе, позволяющих не перенабирать большую часть строки, а фиксировать набранное вами. Используя зти команды редактирования, вы перемещаете курсор на место, нуждающееся в коррекции и уничтожаете лишнее или вставляете недостающее. Затем, если вы удовлетворены этой строкой, вы просто нажимаете RETURN. Для этого необязательно находиться на конце строки: воспринимается целая строка вне зависимости от положения на ней курсора.
Для включения символов чтения строки нужно просто их набрать. Набранный символ возникает на месте курсора, а затем курсор перемещается на один пробел вправо. Если вы неправильно набрали символ, можно использовать erase для возвращения и уничтожить неправильно набранный символ.
Иногда бывает, что вы неправильно набрали символ и заметили зто только после того, как набрали еще несколько символов. В таком случае наберите С-В для передвижения курсора влево и исправьте свою ошибку. После зтого вы можете передвинуть курсор обратно с помощью C-F.
Если вы добавляете текст в середину строки, вы замечаете, что символы справа от курсора сдвигаются, чтобы освободить место для вводимого вами текста. Так же, когда вы уничтожаете текст сзади от курсора, символы справа сдвигаются, чтобы заполнить освободившееся место.
Список основных средств редактирования строки:
передвигается назад на один символ.
передвигается вперед на один символ.
уничтожает символ, стоящий на курсоре.
вставка символа в строку на месте курсора.
Отменяет последнее ваше действие. Вы можете отменить последовательно с конца все действия вплоть до чистой строки.
передвигается на начало строки.
передвигается на конец строки.
передвигает вперед слово.
передвигает назад слово.
очищает зкран и печатает сверху текущую строку.
Уничтожить текст - значит удалить его со строки, но сохранить для дальнейшего использования: обычно с помощью т.н. янкирования (перевставления) он возвращается на строку. Если в описании команды сказано, что она уничтожает текст, можете быть уверены, что вы получите его назад на другом (или на том же) месте позже.
Если вы используете команду уничтожения, текст сохраняется в "кольце уничтожения" (kill-ring). При любом количестве последовательных уничтожений весь уничтоженный текст сохраняется в одном месте, таким образом, когда вы хотите его янкировать, вы получаете его весь. В kill-ring не указывается строка: текст, набранный на строке и затем уничтоженный, можно янкировать и позже, после набора следующей строки.
Список команд для уничтожения текста.
Уничтожает текст от курсора до конца строки.
Уничтожает символы от курсора до конца слова или, если курсор между словами, до конца следующего слова.
Уничтожает символы от курсора до начала слова или, если курсор между словами, до начала предыдущего слова.
Уничтожает символы от курсора до предыдущего пробела. Отличается от M-DEL, поскольку слова могут ограничиваться по-разному.
Янкирует последний уничтоженный текст назад на место курсора.
Вращает kill-ring и янкирует новое. Вы можете это сделать, только если предыдущая команда была C-Y или M-Y.
Вы можете превратить числовые аргументы в команды чтения строки. Иногда аргумент действует как счетчик повторений, иногда - как отмечаемый знак аргумента. Если вы превращаете отрицательный аргумент в команду, действие которой обычно направлено вперед, то действие полученной команды будет направлено назад. Например, чтобы уничтожить текст до начала строки, вы можете набрать М--С-К.
Общий способ превращения числовых аргументов в команду такой: набрать метафированные символы перед командой. Если первый символ, который вы набрали - знак минус, то аргумент будет отрицательный. Теперь, когда вы набрали один символ Meta для запуска аргумента, вы можете набрать остальные символы, а затем команду. Например, для того чтобы подать команду C-D на аргумент 10, вы можете набрать M-10 C-D.
Хотя библиотека Readline используется вместе с похожими на Emacs связями клавиш, устанавливаемыми по умолчанию, возможно, вы захотите использовать другое множество связей клавиш. Вы можете настроить программы, использующие Readline, на помещение команд в инициализационный файл вашего домашнего каталога. Имя зтого файла берется из значения переменной INPUTRC оболочки. Если зта переменная не задана, по умолчанию предполагается '~/.inputrc'.
Когда запускается программа, использующая библиотеку Readline, читается инициализационный файл и задаются связи клавиш.
Команда C-x С-r считывает заново инициализационный файл, таким образом учитываются все изменения, которые вы могли туда внести.
Существует несколько основных конструкций, допустимых в инициализационном файле Readline. Пустые строки игнорируются. Строки, начинающиеся с #, считаются комментариями. Строки, начинающиеся с $, обозначают условные конструкции (см.раздел 7.3.2 "Инициализационные условные конструкции"). Остальные переменные обозначают задания переменных и связи клавиш.
Вы можете изменить состояние некоторых переменных в Readline с помощью использования команды set внутри инициализационного файла. Ниже показывается, как использовать команду редактирования строки vi:
set editing-mode vi
Есть несколько переменных, которые можно теперь задать - так мало,
что мы их перечислим.
Переменная editing-mode проверяет, какой режим редактирования используется. По умолчанию Readline включается в режиме редактирования Emacs - наиболее простом. Этой переменной можно присвоить emacs или vi.
Эта переменная может принимать значения On и Off. Значение On означает, что текст строк, которые вы редактируете, будет пропускаться горизонтально по одной строке зкрана, если их длина больше, чем ширина зкрана, вместо перенесения на следующую строку. По умолчанию переменной присваивается Off.
Эта переменная при присвоении ей On помечает звездочкой (*) начала модифицированных строк истории. По умолчанию зто Оff.
Контролирует, что происходит, когда Readline хочет дать звуковой сигнал. Если ей присвоено none, Readline вообще не издает звука. Если visible, Readline использует звук по возможности. Если значение переменной - audible (по умолчанию), Readline пытается издать звук.
Строка для вставки в начало строки, когда выполняется команда vi-comment. Значение по умолчанию - #.
Если присвоено значение on, включается восьмибитный ввод (не будет удаляться восьмой бит из читаемого символа), соответствия которому требует терминал. Значение по умолчанию - off.
Если присвоено значение on, Readline переводит символы с восьмым битом в ключевую последовательность ASCII c помощью удаления восьмого бита и использования символа ESC, переводящего их в последовательность метапрефиксных ключей. По умолчанию принимает значение on.
Если присвоено значение on, Readline выводит символы с восьмым битом раньше, чем метапрефиксную последовательность. По умолчанию - off.
Количество возможных завершений, определяющее, когда у пользователя спрашивается, не хочет ли он посмотреть список возможностей. Если количество возможных завершений больше, чем значение переменной, Readline спрашивает пользователя, не хочет ли он их посмотреть, в противном случае они просто перечисляются. По умолчанию - 100.
Используется идея Readline текущей таблицы клавиш для команд, связанных с ними. Имена, принимаемые keymap: emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command и vi-insert. vi зквивалентно vi-command, еmacs emacs-standard. По умолчанию emacs. Также при умолчании keymap используется значение editing-mode.
Изменяет поведение функций завершения, принимаемое по умолчанию. Если присвоено значение on, слова, имеющие более одного возможного завершения, должны быть выведены перед звуковым сигналом. По умолчанию off.
Если присваивается on, при попытке Readline завершить слово выполняется тильдовое расширение. По умолчанию - off.
Cинтаксис связей клавиш в инициализационном файле очень прост. Прежде всего вы должны знать имя команды, которую хотите изменить. Следующие страницы содержат таблицы имен команд, связей клавиш по умолчанию и краткие описания того, что делают команды.
Как только вы узнаете имя команды, напишите имя ключа, двоеточие и имя команды в строке инициализационного файла. Имя клавиши можно написать разными способами, в зависимости от того, как вам удобней.
keyname: имя функции или макрокоманда
Кeyname - имя ключа, записанное по-английски. Например:
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: ">&output"
В вышеприведенном примере 'C-u' связано с функцией
universal-argument, и 'C-o' связано с выполнением макрокоманды, записанной на правой стороне (чтобы вставить текст '>&output' в строку.
keyseq: имя функции или макрокоманда.
Keyseq отличается от keyname в пределах строки, определяющей целую
последовательность ключей, заключенностью последовательности ключей в
двойные кавычки. Могут использоваться некоторые клавиши GNU Еmacs, как
в приведенном ниже примере, но специальные символьные имена не узнаются.
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": Function Key 1"
B приведенном примере 'C-u' ограничено функцией universal-argument
(так же, как в первом примере), 'C-x C-r' ограничено функцией
re-read-init-file, и 'ESC [1 1~' ограничено для вставки текста
'Function Key1'. Следующие escape-последовательности доступны для определения последовательностей клавиш:
control префикс
meta префикс
символ еscape
backslash
"
'
Readline обеспечивает средство, похожее по сути на возможности условной компиляции С-препроцессора,которые позволяют свяэывания клавиш и присваивания переменных в результате тестов. Ниже приведены три используемые управляющие команды синтаксического разбора:
Конструкция $if позволяет основывать связывания на режиме редактирования, использовать терминал или Readline. Текст теста расширяется до конца строки, и не требуется символов для его изоляции.
mode= - форма директивы $if, используемая для провер ки, в каком режиме находится Readline: emacs или vi. Это можно использовать для связи с командой 'set keymap', например, для установления связей в emacs-standard и emacs-ctlx, только если Readline начинается в режиме emacs.
Форма term= может использоваться для включения свяэей специфических терминальных клавиш, а иногда - для связывания вывода последовательности клавиш терминальными функциональными клавишами. Слово справа от = сравнивает ся с полным именем терминала а фрагментом терминально го имени перед первым знаком -. Это, например, позво ляет sun соответствовать и sun, и sun-cmd.
Конструкция application позволяет включать установки, зависящие от приложений. Каждой программе, использующей библиотеку Readline, присваивается имя приложения, и вы можете это проверить. Это можно использовать для связывания последовательностей клавиш с функциями, используемыми в специфических программах. Например, ни жеприведенная команда добавляет последовательность кла виш, эаключающих в кавычки текущее или предыдущее сло во Bash:
$if bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
Эта команда, как видно из предыдущего примера, завершает команду $if.
Команды ветви директивы $if выполняются, если тест дает ошибку.
Передвигается на начало текущей строки.
Передвигается на конец текущей строки.
Передвигает вперед символ.
Передвигает символ назад.
Передвигается вперед до конца следующего слова. Слова состоят из букв и цифр.
Передвигается назад к началу зтого или предыдущего слова. Слова состоят иэ букв и цифр.
Очищает экран и выводит текущую строку наверх.
Обновляет текущую строку. По умолчанию неограничено.
Принимает строку независимо от положения курсора. Если строка не пуста, добавляет ее в список истории согласно установ ке переменной HISTCONTROL. Если строка была строкой истории, возвращает ее в первоначальное состояние.
Передвигается вверх по списку истории.
Передвигается вниэ по списку истории.
Передвигается на первую строку истории.
Передвигается на конец ввода истории, т.е. на строку, которую вы вводите.
Воэрастающий поиск назад от текущей строки и продвижение вверх по истории.
Возрастающий поиск вперед от текущей строки и продвижение вниз по истории.
Поиск наэад от текущей строки и продвижение вверх по истории при использовании невоэрастающего поиска для применяемой строки.
Поиск вперед от текущей строки и продвижение вниз по истории при испольэовании невоэрастающего поиска для применяемой строки.
Поиск вперед по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.
Поиск назад по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.
Вставляет первый аргумент в предыдущую команду (обычно второе слово предыдущей строки). Если дан аргумент n, вставляет n-е слово предыдущей команды (слова в предыдущей команде нумеруются с нуля). Отрицательный аргумент вставляет n-е слово с конца предыдущей команды.
Вставляет последний аргумент в предыдущую команду ( последнее слово предыдущей строки). Если дан аргумент, делает то же, что yank-nth-arg.
Удаляет символ на месте курсора. Если курсор на начале строки, в которой нет символов, и последний набранный символ был не C-d, то воэвращает EOF.
Удаляет символ эа курсором. Числовой аргумент заставляет уничтожать символ (kill) вместо его простого удаления.
Добавляет ледующий напечатанный вами символ в строку. Это помогает вставить ключевую последовательность, например C-D.
Вставляет символ tab.
Передвигает символ перед курсором вперед за курсор, двигая курсор соответственно назад. Если место вставки - в конце строки, то переносит последние два символа строки. С отрицательными аргументами не работает.
Передвигает слово за курсором назад на место слова перед курсором, двигая курсор соответственно вперед.
Пишет текущее (или следующее) слово прописными буквами. При отрицательном аргументе заменяет предыдушее слово, но оставляет на месте курсор.
Пишет текущее (или следующее) слово строчными буквами. При отрицательном аргументе заменяет предыдущее слово, но оставляет на месте курсор.
Делает заглавным текущее (или следующее) слово. При отрицательном аргументе делает то же самое с предыдущим словом, но оставляет на месте курсор.
Уничтожает текст от текущего положения курсора до конца строки.
Уничтожает все в направлении назад до начала строки.
Уничтожает в направлении назад от курсора до начала текущей строки. Сохраняет уничтожаемый текст в kill-ring.
Уничтожает все символы на текущей строке, вне зависимости от положения курсора. По умолчанию неограничена.
Уничтожает символы от курсора до конца текущего слова, или между словами, до конца следующего слова. Границы слов такие же, как в forward-word.
Уничтожает слово позади курсора. Границы слов такие же, как в backward-word.
Уничтожает слово позади курсора, используя в качестве границы слова пробел. Уничтожаемый текст сохраняется в kill-ring.
Уничтожает все пробелы и табуляции вокруг точки. По умолчанию неограничена.
Янкирует вершину kill-ring в буфер на текущую позицию курсора.
Вращает kill-ring и янкирует новую вершину. Вы можете это сделать, только если предыдущая команда была yank или yank-pop.
Добавляет цифру к аргументу, уже собранному, или начинает новый аргумент. M- начинает отрицательный аргумент.
Каждый раз при выполнении зтой команды счетчик аргумент умножается на 4. Изначально счетчик аргумента равен 1, таким об разом его следующее значение - 4. По умолчанию это не связа но с ключом.
Пытается сделать завершение текста перед курсором. Это специфическая особенность приложения. В общем случае, если вы пе чатаете аргумент имени файла, вы можете сделать завершение имени файла; если вы печатаете команду, вы можете сделать завершение команды; если вы печатаете символ в GDB, вы можете сделать завершение символьного имени; если вы печатаете в переменной Bash, вы можете сделать завершение имени переменной, и т.д. Полный список доступных функций завершения см. в Bash manual page.
Выводит список возможных эавершений текста перед курсором.
Вставляет все возможные завершения текста перед точкой, которые могут быть сгенерированы с помощью possible-completions. По умолчанию не связано с клавишей.
Начинает сохранение символов, напечатанных в текущую макрокоманду клавиатуры.
Прекращает сохранение символов, напечатанных в текущую макрокоманду клавиатуры, и сохраняет определение.
Выполняет заново последнюю определенную макрокоманду клавиатуры таким образом, что символы появляются как при наборе их на клавиатуре.
Читает содержание вашего инициализационного файла и включает все связывания и обозначения переменных, найденные в нем.
Прекращает текущую команду редактирования и дает звуковой сигнал (подчиненный установке bell-style).
Выполняет команду, свяэанную с соответствующим символом передвижения вверх.
Метафирует следующий символ, который вы печатаете. предназначена для тех, у кого отсутствует клавиша meta. Набрать 'ESC f' - то же самое, что набрать 'M-f'.
Возрастающая отмена, при которой отдельно запоминается каждая строка.
Отменяет все изменения, произведенные на зтой строке. Здесь, как и при наборе undo, достаточно времени для возвращения назад к началу.
Выполняет тильдовое расширение на текущей строке.
Выдает все функции и связи их клавиш в поток вывода читаемой строки. Если используется числовой аргумент, вывод форматируется таким образом, чтобы стать частью файла inputrs.
Выводит информацию о версии текущего Bash.
Расширяет строку, как при чтении ее оболочкой. Выполняет расширения псевдонима и истории так же, как расширения слов обо лочки.
Выполняет расширение истории на текущей строке.
Синоним yank-last-arg.
Принимает текущую строку для выполнения и извлекает следующую по отношению к текущей строку из истории для редактирова ния. Все аргументы игнорируются.
В режиме редактирования vi вызывает переход в режим редактирования emacs, как при выполнении команды set -o emacs.
Хотя в библиотеке Readline нет полного набора функций редактирования vi, в ней достаточно средств для простого редактирования строки. Режим vi в Readline действует так же, как определенный в Posix 1003.2 стандарт.
Для диалогового перехода из режима редактирования Emacs в Vi и обратно можно использовать команды set -o emacs и set -o vi (см. раздел 4.5. "Встроенная команда set"). Readline по умолчанию находится в режиме emacs.
Когда вы вводите строку в режиме vi, вы уже находитесь в режиме "вставки", как если бы вы нажали 'i'. Нажатие ESC переводит вас в режим "команды", в котором вы можете редактировать текст строки с помощью стандартных клавиш движения режима vi: перемещаться к предыдущим строкам истории, используя 'k', к следующим - 'j' и т.д.