Вперед Назад Содержание

7. РЕДАКТИРОВАНИЕ КОМАНДНОЙ СТРОКИ.

В этой главе описаны основные возможности интерфейса редактирования командной строки GNU.

7.1 Введение в редактирование строки.

В следующих разделах описывается нотация, используемая для представления нажатия клавиш.

Текст С-К читается 'контрол-к' и описывает символ, получающийся при нажатии на клавиши Control и K.

Текст М-К читается 'мета-к' и описывает символ, получающийся при нажатии на клавиши Meta (если таковая имеется) и K. Если у вас нет клавиши Meta, тот же результат можно получить при нажатии ESC K. И то, и другое называется метафированием клавиши К.

Текст М-С-К читается мета-контрол-к и описывает символ, получающийся при метафировании С-К.

Некоторые клавиши имеют собственные названия, их так и обозначают в тексте или инициальном файле (см. раздел 7.3): DEL, ESC, LFD, SPC, RET и TAB.

7.2 Диалог чтения строки.

Часто во время сеанса диалога вы печатаете длинную строку только для того, чтобы потом заметить, что в первом слове есть ошибка. Библиотека чтения строки дает вам множество команд для манипулирования текстом при его наборе, позволяющих не перенабирать большую часть строки, а фиксировать набранное вами. Используя зти команды редактирования, вы перемещаете курсор на место, нуждающееся в коррекции и уничтожаете лишнее или вставляете недостающее. Затем, если вы удовлетворены этой строкой, вы просто нажимаете RETURN. Для этого необязательно находиться на конце строки: воспринимается целая строка вне зависимости от положения на ней курсора.

Основные средства чтения строки.

Для включения символов чтения строки нужно просто их набрать. Набранный символ возникает на месте курсора, а затем курсор перемещается на один пробел вправо. Если вы неправильно набрали символ, можно использовать erase для возвращения и уничтожить неправильно набранный символ.

Иногда бывает, что вы неправильно набрали символ и заметили зто только после того, как набрали еще несколько символов. В таком случае наберите С-В для передвижения курсора влево и исправьте свою ошибку. После зтого вы можете передвинуть курсор обратно с помощью C-F.

Если вы добавляете текст в середину строки, вы замечаете, что символы справа от курсора сдвигаются, чтобы освободить место для вводимого вами текста. Так же, когда вы уничтожаете текст сзади от курсора, символы справа сдвигаются, чтобы заполнить освободившееся место.

Список основных средств редактирования строки:

С-В

передвигается назад на один символ.

C-F

передвигается вперед на один символ.

DEL

уничтожает символ, стоящий на курсоре.

Печать символов:
INS

вставка символа в строку на месте курсора.

C-

Отменяет последнее ваше действие. Вы можете отменить последовательно с конца все действия вплоть до чистой строки.

Команды более быстрого движения по строке.

С-А

передвигается на начало строки.

С-Е

передвигается на конец строки.

M-F

передвигает вперед слово.

M-B

передвигает назад слово.

C-L

очищает зкран и печатает сверху текущую строку.

Заметим, что C-F передвигает вперед символ, а M-F -слово, аналогично назад: C-В и М-В. Есть негласное соглашение, что клавиша Control оперирует с символами, а Meta - со словами.

Команды уничтожения текста на строке.

Уничтожить текст - значит удалить его со строки, но сохранить для дальнейшего использования: обычно с помощью т.н. янкирования (перевставления) он возвращается на строку. Если в описании команды сказано, что она уничтожает текст, можете быть уверены, что вы получите его назад на другом (или на том же) месте позже.

Если вы используете команду уничтожения, текст сохраняется в "кольце уничтожения" (kill-ring). При любом количестве последовательных уничтожений весь уничтоженный текст сохраняется в одном месте, таким образом, когда вы хотите его янкировать, вы получаете его весь. В kill-ring не указывается строка: текст, набранный на строке и затем уничтоженный, можно янкировать и позже, после набора следующей строки.

Список команд для уничтожения текста.

С-К

Уничтожает текст от курсора до конца строки.

M-D

Уничтожает символы от курсора до конца слова или, если курсор между словами, до конца следующего слова.

M-DEL

Уничтожает символы от курсора до начала слова или, если курсор между словами, до начала предыдущего слова.

C-W

Уничтожает символы от курсора до предыдущего пробела. Отличается от M-DEL, поскольку слова могут ограничиваться по-разному.

Ниже показывается, как янкировать текст обратно на строку. Янкирование - копирование наиболее нового уничтоженного текста с kill-буфера.
C-Y

Янкирует последний уничтоженный текст назад на место курсора.

M-Y

Вращает kill-ring и янкирует новое. Вы можете это сделать, только если предыдущая команда была C-Y или M-Y.

Аргументы Readline.

Вы можете превратить числовые аргументы в команды чтения строки. Иногда аргумент действует как счетчик повторений, иногда - как отмечаемый знак аргумента. Если вы превращаете отрицательный аргумент в команду, действие которой обычно направлено вперед, то действие полученной команды будет направлено назад. Например, чтобы уничтожить текст до начала строки, вы можете набрать М--С-К.

Общий способ превращения числовых аргументов в команду такой: набрать метафированные символы перед командой. Если первый символ, который вы набрали - знак минус, то аргумент будет отрицательный. Теперь, когда вы набрали один символ Meta для запуска аргумента, вы можете набрать остальные символы, а затем команду. Например, для того чтобы подать команду C-D на аргумент 10, вы можете набрать M-10 C-D.

7.3 Инициализационный файл Readline.

Хотя библиотека Readline используется вместе с похожими на Emacs связями клавиш, устанавливаемыми по умолчанию, возможно, вы захотите использовать другое множество связей клавиш. Вы можете настроить программы, использующие Readline, на помещение команд в инициализационный файл вашего домашнего каталога. Имя зтого файла берется из значения переменной INPUTRC оболочки. Если зта переменная не задана, по умолчанию предполагается '~/.inputrc'.

Когда запускается программа, использующая библиотеку Readline, читается инициализационный файл и задаются связи клавиш.

Команда C-x С-r считывает заново инициализационный файл, таким образом учитываются все изменения, которые вы могли туда внести.

Инициализационный синтаксис Readline.

Существует несколько основных конструкций, допустимых в инициализационном файле Readline. Пустые строки игнорируются. Строки, начинающиеся с #, считаются комментариями. Строки, начинающиеся с $, обозначают условные конструкции (см.раздел 7.3.2 "Инициализационные условные конструкции"). Остальные переменные обозначают задания переменных и связи клавиш.

Задания переменных.

Вы можете изменить состояние некоторых переменных в Readline с помощью использования команды set внутри инициализационного файла. Ниже показывается, как использовать команду редактирования строки vi:

set editing-mode vi
Есть несколько переменных, которые можно теперь задать - так мало, что мы их перечислим.
editing-mode

Переменная editing-mode проверяет, какой режим редактирования используется. По умолчанию Readline включается в режиме редактирования Emacs - наиболее простом. Этой переменной можно присвоить emacs или vi.

horizontal-scroll-mode

Эта переменная может принимать значения On и Off. Значение On означает, что текст строк, которые вы редактируете, будет пропускаться горизонтально по одной строке зкрана, если их длина больше, чем ширина зкрана, вместо перенесения на следующую строку. По умолчанию переменной присваивается Off.

mark-modified-lines

Эта переменная при присвоении ей On помечает звездочкой (*) начала модифицированных строк истории. По умолчанию зто Оff.

bell-style

Контролирует, что происходит, когда Readline хочет дать звуковой сигнал. Если ей присвоено none, Readline вообще не издает звука. Если visible, Readline использует звук по возможности. Если значение переменной - audible (по умолчанию), Readline пытается издать звук.

comment-begin

Строка для вставки в начало строки, когда выполняется команда vi-comment. Значение по умолчанию - #.

meta-flag

Если присвоено значение on, включается восьмибитный ввод (не будет удаляться восьмой бит из читаемого символа), соответствия которому требует терминал. Значение по умолчанию - off.

convert-meta

Если присвоено значение on, Readline переводит символы с восьмым битом в ключевую последовательность ASCII c помощью удаления восьмого бита и использования символа ESC, переводящего их в последовательность метапрефиксных ключей. По умолчанию принимает значение on.

output-meta

Если присвоено значение on, Readline выводит символы с восьмым битом раньше, чем метапрефиксную последовательность. По умолчанию - off.

completion-query-items

Количество возможных завершений, определяющее, когда у пользователя спрашивается, не хочет ли он посмотреть список возможностей. Если количество возможных завершений больше, чем значение переменной, Readline спрашивает пользователя, не хочет ли он их посмотреть, в противном случае они просто перечисляются. По умолчанию - 100.

keymap

Используется идея 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.

show-all-if-ambiguous

Изменяет поведение функций завершения, принимаемое по умолчанию. Если присвоено значение on, слова, имеющие более одного возможного завершения, должны быть выведены перед звуковым сигналом. По умолчанию off.

expand-tilde

Если присваивается 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-последовательности доступны для определения последовательностей клавиш:
\C-

control префикс

\M-

meta префикс

символ еscape

\\

backslash

\"

"

\'

'

Во время введения текста макрокоманды одинарные или двойные кавычки используются для обозначения определения макрокоманды. В тексте без кавычек подразумевается имя функции. Backslash заключает в кавычки любой символ в тексте макрокоманды, включая " и '. Например, следующая связь заключает C-x в \ в строке: "\C-x\\": "\\"

Инициализационные условные конструкции.

Readline обеспечивает средство, похожее по сути на возможности условной компиляции С-препроцессора,которые позволяют свяэывания клавиш и присваивания переменных в результате тестов. Ниже приведены три используемые управляющие команды синтаксического разбора:

$if

Конструкция $if позволяет основывать связывания на режиме редактирования, использовать терминал или Readline. Текст теста расширяется до конца строки, и не требуется символов для его изоляции.

mode

mode= - форма директивы $if, используемая для провер ки, в каком режиме находится Readline: emacs или vi. Это можно использовать для связи с командой 'set keymap', например, для установления связей в emacs-standard и emacs-ctlx, только если Readline начинается в режиме emacs.

term

Форма term= может использоваться для включения свяэей специфических терминальных клавиш, а иногда - для связывания вывода последовательности клавиш терминальными функциональными клавишами. Слово справа от = сравнивает ся с полным именем терминала а фрагментом терминально го имени перед первым знаком -. Это, например, позво ляет sun соответствовать и sun, и sun-cmd.

application

Конструкция application позволяет включать установки, зависящие от приложений. Каждой программе, использующей библиотеку Readline, присваивается имя приложения, и вы можете это проверить. Это можно использовать для связывания последовательностей клавиш с функциями, используемыми в специфических программах. Например, ни жеприведенная команда добавляет последовательность кла виш, эаключающих в кавычки текущее или предыдущее сло во Bash:

$if bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
$endif

Эта команда, как видно из предыдущего примера, завершает команду $if.

$else

Команды ветви директивы $if выполняются, если тест дает ошибку.

7.4 Связываемые команды Readline.

Команды движения.

beginning-of-line (C-a)

Передвигается на начало текущей строки.

end-of-line (C-e)

Передвигается на конец текущей строки.

forward-char (C-f)

Передвигает вперед символ.

backward-char (C-b)

Передвигает символ назад.

forward-word (M-f)

Передвигается вперед до конца следующего слова. Слова состоят из букв и цифр.

backward-word (M-b)

Передвигается назад к началу зтого или предыдущего слова. Слова состоят иэ букв и цифр.

clear-screen (C-l)

Очищает экран и выводит текущую строку наверх.

redraw-current-line ()

Обновляет текущую строку. По умолчанию неограничено.

Команды для манипулирования историей.

accept-line (Newline,Return)

Принимает строку независимо от положения курсора. Если строка не пуста, добавляет ее в список истории согласно установ ке переменной HISTCONTROL. Если строка была строкой истории, возвращает ее в первоначальное состояние.

previous-history (C-p)

Передвигается вверх по списку истории.

next-history (C-n)

Передвигается вниэ по списку истории.

beginning-of-history (M-<)

Передвигается на первую строку истории.

end-of-history (M->)

Передвигается на конец ввода истории, т.е. на строку, которую вы вводите.

reverse-search-history (C-r)

Воэрастающий поиск назад от текущей строки и продвижение вверх по истории.

forward-search-history (C-s)

Возрастающий поиск вперед от текущей строки и продвижение вниз по истории.

non-incremental-reverse-search-history (M-p)

Поиск наэад от текущей строки и продвижение вверх по истории при использовании невоэрастающего поиска для применяемой строки.

non-incremental-forward-search-history (M-n)

Поиск вперед от текущей строки и продвижение вниз по истории при испольэовании невоэрастающего поиска для применяемой строки.

history-search-forward ()

Поиск вперед по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.

history-search-backward ()

Поиск назад по истории между началом текущей строки и текущей точкой. Это невозрастающий поиск. По умолчанию команда неограничена.

yank-nth-arg (M-C-y)

Вставляет первый аргумент в предыдущую команду (обычно второе слово предыдущей строки). Если дан аргумент n, вставляет n-е слово предыдущей команды (слова в предыдущей команде нумеруются с нуля). Отрицательный аргумент вставляет n-е слово с конца предыдущей команды.

yank-last-arg (M-.,M-_)

Вставляет последний аргумент в предыдущую команду ( последнее слово предыдущей строки). Если дан аргумент, делает то же, что yank-nth-arg.

Команды изменения текста.

delete-char (C-d)

Удаляет символ на месте курсора. Если курсор на начале строки, в которой нет символов, и последний набранный символ был не C-d, то воэвращает EOF.

backward-delete-char (Rubout)

Удаляет символ эа курсором. Числовой аргумент заставляет уничтожать символ (kill) вместо его простого удаления.

duoted-insert (C-q, C-v)

Добавляет ледующий напечатанный вами символ в строку. Это помогает вставить ключевую последовательность, например C-D.

tab-insert (M-TAB)

Вставляет символ tab.

transpose-chars (C-t)

Передвигает символ перед курсором вперед за курсор, двигая курсор соответственно назад. Если место вставки - в конце строки, то переносит последние два символа строки. С отрицательными аргументами не работает.

transpose-words (M-t)

Передвигает слово за курсором назад на место слова перед курсором, двигая курсор соответственно вперед.

upcase-word (M-u)

Пишет текущее (или следующее) слово прописными буквами. При отрицательном аргументе заменяет предыдушее слово, но оставляет на месте курсор.

downcase-word (M-l)

Пишет текущее (или следующее) слово строчными буквами. При отрицательном аргументе заменяет предыдущее слово, но оставляет на месте курсор.

capitalize-word (M-c)

Делает заглавным текущее (или следующее) слово. При отрицательном аргументе делает то же самое с предыдущим словом, но оставляет на месте курсор.

Уничтожение и янкирование.

kill-line (C-k)

Уничтожает текст от текущего положения курсора до конца строки.

backward-kill-line (C-x Rubout)

Уничтожает все в направлении назад до начала строки.

unix-line-discard (C-u)

Уничтожает в направлении назад от курсора до начала текущей строки. Сохраняет уничтожаемый текст в kill-ring.

kill-whole-line ()

Уничтожает все символы на текущей строке, вне зависимости от положения курсора. По умолчанию неограничена.

kill-word (M-d)

Уничтожает символы от курсора до конца текущего слова, или между словами, до конца следующего слова. Границы слов такие же, как в forward-word.

backward-kill-word (M-DEL)

Уничтожает слово позади курсора. Границы слов такие же, как в backward-word.

unix-word-rubout (C-w)

Уничтожает слово позади курсора, используя в качестве границы слова пробел. Уничтожаемый текст сохраняется в kill-ring.

delete-horizontal-space ()

Уничтожает все пробелы и табуляции вокруг точки. По умолчанию неограничена.

yank (C-y)

Янкирует вершину kill-ring в буфер на текущую позицию курсора.

yank-pop (M-y)

Вращает kill-ring и янкирует новую вершину. Вы можете это сделать, только если предыдущая команда была yank или yank-pop.

Специфические числовые аргументы.

digit-argument (M-0, M-1, ...,M--).

Добавляет цифру к аргументу, уже собранному, или начинает новый аргумент. M- начинает отрицательный аргумент.

universal-argument()

Каждый раз при выполнении зтой команды счетчик аргумент умножается на 4. Изначально счетчик аргумента равен 1, таким об разом его следующее значение - 4. По умолчанию это не связа но с ключом.

Возможность печати Readline.

complete (TAB)

Пытается сделать завершение текста перед курсором. Это специфическая особенность приложения. В общем случае, если вы пе чатаете аргумент имени файла, вы можете сделать завершение имени файла; если вы печатаете команду, вы можете сделать завершение команды; если вы печатаете символ в GDB, вы можете сделать завершение символьного имени; если вы печатаете в переменной Bash, вы можете сделать завершение имени переменной, и т.д. Полный список доступных функций завершения см. в Bash manual page.

possible-completions (M-?)

Выводит список возможных эавершений текста перед курсором.

insert-completions ()

Вставляет все возможные завершения текста перед точкой, которые могут быть сгенерированы с помощью possible-completions. По умолчанию не связано с клавишей.

Макрокоманды клавиатуры.

start-kbd-macro (C-x()

Начинает сохранение символов, напечатанных в текущую макрокоманду клавиатуры.

end-kbd-macro (C-x ))

Прекращает сохранение символов, напечатанных в текущую макрокоманду клавиатуры, и сохраняет определение.

call-last-kbd-macro (C-x e)

Выполняет заново последнюю определенную макрокоманду клавиатуры таким образом, что символы появляются как при наборе их на клавиатуре.

Прочие команды.

re-read-init-file (C-x C-r)

Читает содержание вашего инициализационного файла и включает все связывания и обозначения переменных, найденные в нем.

abort (C-g)

Прекращает текущую команду редактирования и дает звуковой сигнал (подчиненный установке bell-style).

do-uppercase-version (M-a, M-b,...)

Выполняет команду, свяэанную с соответствующим символом передвижения вверх.

prefix-meta (ESC)

Метафирует следующий символ, который вы печатаете. предназначена для тех, у кого отсутствует клавиша meta. Набрать 'ESC f' - то же самое, что набрать 'M-f'.

undo (C-_, C-x C-u)

Возрастающая отмена, при которой отдельно запоминается каждая строка.

revert-line (M-r)

Отменяет все изменения, произведенные на зтой строке. Здесь, как и при наборе undo, достаточно времени для возвращения назад к началу.

tilde-expand (M-~)

Выполняет тильдовое расширение на текущей строке.

dump-functions ()

Выдает все функции и связи их клавиш в поток вывода читаемой строки. Если используется числовой аргумент, вывод форматируется таким образом, чтобы стать частью файла inputrs.

display-shell-version (C-x C-v)

Выводит информацию о версии текущего Bash.

shell-expand-line (M-C-e)

Расширяет строку, как при чтении ее оболочкой. Выполняет расширения псевдонима и истории так же, как расширения слов обо лочки.

history-expand-line (M-^)

Выполняет расширение истории на текущей строке.

insert-last-argument (M-.,M-_)

Синоним yank-last-arg.

operate-and-get-next (C-o)

Принимает текущую строку для выполнения и извлекает следующую по отношению к текущей строку из истории для редактирова ния. Все аргументы игнорируются.

emacs-editing-mode (C-e)

В режиме редактирования vi вызывает переход в режим редактирования emacs, как при выполнении команды set -o emacs.

7.5 Режим vi в Readline.

Хотя в библиотеке 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' и т.д.


Вперед Назад Содержание