Библиотека READLINE в bash

Это библиотека которая обрабатывает чтение входящих данный когда используется интерактивная оболочка, когда при её вызове не была использована опция —noediting. Строка редактирования также используется когда используется опция -e со встроенной командой read. По умолчанию строка редактирования команды аналогична используемой в Emacs. Кроме того доступна также строка редактирования в стиле vi. Строка редактирования может быть включена в любое время с помошью -o emacs или -o vi опций встроенной команды set(Встроенные команды я буду описывать в одной из будущих статей). Чтобы отключить возможность редактирования после запуска командного интерпритатора используйте опции +o emacs или +o vi встроенной команды set.

Обозначения Readline

 

В этом разделе используется Emacs стиль обозначения клавиш. Клавиша Control с указанной клавишей, видом C-клавиша, например C-n значит Control-N. Кроме того мета клавиши обозначаются M-клавиша, так M-x значит Meta-X. (На клавиатурах без клавиши meta, M-x значит ESC x, тоесть нажимаете клавишу ESC затем клавишу X. Таким образом ESC реализует префикс meta. Комбинация M-C-x значит ESC-Control-x, или же нажмите Escape, затем удерживая клавишу Control нажмите клавишу x.)

Командам readline могут быть заданы числовые аргументы, которые обычно действуют в качестве счётчика повторов. Иногда они обозначают значимость аргумента. Передача отрицательного аргумента команды которая действует в прямом направлении(например kill-line) вызывают эту команду для действий в обратном направлении. Команды чьё поведение с аргументами отклоняется от этого, приведены ниже.

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

Инициализации readline

 

Настройка библиотеки readline производится при помощи подстановки команд в файле инициализации (файл inputrc). Имя файла берётся из значения переменной INPUTRC. Если переменная не установлена, по умолчанию ~/.inputrc. Когда программа которая использует библиотеку readline запускается, читается файл инициализации, привязываются горячие клавиши и устанавливаются переменные. Существует только несколько основных конструкций, допускающихся в файле инициализации readline. Пустые строки игнорируются. Строки начинающиеся с # являются комментариями. Строки начинающиеся с $ обозначают условные конструкции. Иные строки обозначают горячие клавиши и настройки переменных.

 

По умолчанию, привязку горячих клавиш можно изменить при помощи файла inputrc. Другие программы которые используют эту библиотеку, могут добавлять свои собственные команды и привязки горячих клавиш.

 

Например поместив в файл inputrc :

 

M-Control-u: universal-argument

 

или

 

C-Meta-u: universal-argument

 

мы назначим комбинации M-C-u команду universal-argument библиотеки readline.

 

Следующие символьные имена распознаются: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, и TAB.

 

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

 

Горячие клавиши readline

 

Синтаксис управлением горячими клавишами в файле inputrc прост. Все что для этого требуется это имя команды или макро текст и ключевая последовательность к которой он должен быть привязан. Имя может быть использовано одним из двух способов: как символическое имя ключа, возможно с использованием Meta- или Control- префиксов, или как последовательность клавиш.

 

Когда используется форма имя_клавиши:имя_функции или макроподстановка, имя_клавиши задается просто английским языком.

 

Для примера:

 

Control-u: universal-argument

Meta-Rubout: backward-kill-word

Control-o: «> output»

 

В приведённом примере, C-u связан с функцией universal-argument, M-DEL связана с функцией backward-kill-word и C-o связано с макроподстановкой указанной в правой части, тоесть C-o приведет к вставке > output.

 

Во второй форме, «комбинация-клавиш»: имя-функции или макроподстановка, комбинация клавиш отличается от использованного выше имя-клавиша тем, что может задаваться в двойных кавычках. Некоторые стили ключей GNU Emacs могут быть использованы, как в следующем примере, но преобразования символов не признаются.

 

«\C-u»: universal-argument

«\C-x\C-r»: re-read-init-file

«\e[11~»: «Function Key 1»

 

В этом примере C-u снова привязывает функцию universal-argument. C-x C-r связан с функцией re-read-init-file, и ESC [ 1 1 ~ должна вставить текст «Function Key 1».

 

Полный набор управляющих последовательностей в GNU Emacs стиле представлен ниже.

 

\C- префикс Control

\M- meta префикс

\e управляющий символ

\\ обратная косая черта

\» символ «

\’ символ ‘

 

В дополнение к последовательности стиля GNU Emacs, существует второй набор управляющих последовательностей начинающийся с обратной косой черты:

 

\a оповещения (звонок)

\b возврат на одну позицию

\d удалить

\f подача страницы

\n новая строка

\r возврат каретки

\t горизонтальная табуляция

\v вертикальная табуляция

\nnn восьмибитный символ, значение которого восьмеричное значение nnn(от одной до трех цифр)

\xHH восьмибитный символ, значение которого шестнадцатеричное значение HH(одна или две шестнадцатеричные цифры)

 

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

 

Bash позволяет отобразить или изменить текущие горячие клавиши readline, при помощи встроенной команды bind. Режим редактирования можно переключать во время интерактивного использования используя опцию -o встроенной команды set(встроенные команды я буду описывать в дальнейшем).

 

Переменные readline

 

Библиотека readline имеет переменные, которые могут быть использованы для дальнейшей настройки её поведения. Переменные могут быть установлены в файле inputrc с помощью формы:

 

set имя-переменной значение

 

Если не указано другое, переменные библиотеки readline могут принимать значения Вкл или Выкл(без учета регистра). Непризнанные имена переменных игнорируются. Когда читается значение переменной, пустые или нулевые значения «on» (caseinsensitive) и «1» эквивалентны On. Все иные значения эквивалентны Off.

 

Переменные и их значения по умолчанию:

 

bell-style (audible)

Контролирует что происходит когда readline должна подать звуковой сигнал терминала. Если установлено значение none, readline никогда не подает звуковой сигнал. Если установлено visible, readline использует визуальный сигнал, если таковой имеется. Если установлено audible, readline пытается выдавать звуковой сигнал терминала.

 

bind-tty-special-chars (On)

Если установлено On, readline пытается связать управляющие символы специальных драйверов ядра терминала с их эквивалентами в библиотеке readline.

 

comment-begin («#»)

Строка которая выставляется когда readline выполняет команду insert-comment. Эта команда связана с M-# в Emacs режиме и # в командном режиме vi.

 

completion-ignore-case (Off)

Если установлено значение On, readline выполняет соответствия имен файлов и завершение без учёта регистра.

 

completion-prefix-display-length (0)

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

 

completion-query-items (100)

Определяет когда пользователь получает запрос о просмотре числа возможных завершений порождённых командой possible-completions. Он может быть установлен в любое целочисленное значение большее или равное нулю. Если количество возможных завершений больше или равно значению этой переменной, пользователя спрашивают, желает ли он посмотреть их, в ином случае они просто перечисляются в терминале.

 

convert-meta (On)

Если установлено значение On, readline будет преобразовывать символы с установленным восьмым битом в последовательность клавиш ASCII, лишив восьмой бит профикса и управляющего символа( в действительности используя управляющий символ как meta префикс).

 

disable-completion (Off)

Если установлено значение On, readline не станет выполнять завершения слов. Символы завершения будут вставлены в строку, как будто они были нанесены специально.

 

editing-mode (emacs)

Определяет будет ли readline запускаться с набором управляющих клавиш аналогичных Emacs или vi. В editing-mode может быть установлен либо Emacs либо vi.

 

echo-control-characters (On)

Если установлено значение On, операционные системы показывают что они поддерживают readline, эхо-символы, символы соответствующие сигналу генерируемому с клавиатуры.

 

enable-keypad (Off)

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

 

enable-meta-key (On)

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

 

expand-tilde (Off)

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

 

history-preserve-point (Off)

Если значение установлено On, код истории пытается поставить точку в том же месте каждой строки истории для полученной с помощью previous-history(предыдущей истории) или next-history(следующей истории).

 

history-size (0)

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

 

horizontal-scroll-mode (Off)

Когда значение установлено On, readline использует одну линию для показа, прокрутки входящего сигнала горизонтально в одной строке экрана, когда строка становится больше нежели ширина экрана, а не переходит на новую строку.

 

input-meta (Off)

Если установлено значение On, readline будет поддерживать восьмибитные символы на входе(тоесть он не будет сбрасывать старший бит из символов во время чтения), независимо от того, поддерживает ли терминал восьмибитные символы. Имя meta-flag является синонимом для этой переменной.

 

isearch-terminators («C-[C-J»)

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

 

keymap (emacs)

Установка текущей раскладки горячих клавиш readline. Допускаются имена раскладок emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command и vi-insert. vi эквивалентно vi-command: emacs является эквивалентом emacs-standard. По умолчанию установлено значение Emacs, так же значение в режиме редактирования влияет на горячие клавиши.

 

mark-directories (On)

Если установлено значение On, к завершённым именам каталогов добавляется косая черта.

 

mark-modified-lines (Off)

Если установлено значение On, строки истории которые были изменены отображаются со звездочкой вначале (*).

 

mark-symlinked-directories (Off)

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

 

match-hidden-files (On)

Эта переменная, если она включена, указывает readline ограничить список файлов, чьи имена начинаются с ‘.‘(скрытые файлы) когда выполняется завершение имени файла. Если установлено Off, имена ведущие к ‘.‘ должны подаваться пользователем в имени файла для завершения.

 

menu-complete-display-prefix (Off)

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

 

output-meta (Off)

Если установлено значение On, readline будет отображать символы с установленным восьмым битом непосредственно, а не как meta-prefixed(мета-префикс) управляющей последовательности.

 

page-completions (On)

Если установлено значение On, readline использует внутренний more-like pager(пейджер) для отображения на экран возможных завершений.

 

print-completions-horizontally (Off)

Если установлено значение On, readline будет отображать дополнения отсортированные горизонтально в алфавитном порядке, а не вниз по экрану.

 

revert-all-at-newline (Off)

Если установлено значение On, readline отменяет все изменения в линии истории, перед выполнением когда выполняется accept-line(принятие строки). По умолчанию строки истории могут быть изменены и через вызовы readline.

 

show-all-if-ambiguous (Off)

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

 

show-all-if-unmodified (Off)

Это изменяет поведение по умолчанию функции завершения способом подобным show-all-if-ambiguous. Если установлено значение On, слова которые имеют более чем одно возможное завершение, без какого-либо частичного завешения(возможных завершений не разделяющих общий префикс) вызывают список возможных завершений мгновенно, а не подают сигнал о этом.

 

skip-completed-text (Off)

Если установлено значение On, это изменяет поведение по умолчанию при вставке одного совпадения в строке. Это только активные завершения в середине слова. Если включено, readline не вставляет символы из завершения которые совпадают с символами после точки в слове завершения, таким образом перечисленные слова следующие за курсором, не дублируются.

 

visible-stats (Off)

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

 

Условные конструкции Readline

 

Библиотека readline реализует возможности сходные по духу с условной компиляцией из препроцессора языка C, который позволяет назначать горячие клавиши или присваивать значения переменным в зависимости от условий.

Существуют четыре парсер директивы:

 

$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 выполняются если условие проверки не выполнено.

 

$include

Данная директива принимает в виде аргумента имя файла и читает команды и привязки клавиш в этом файле. Например следующая директива указывает читать файл /etc/inputrc:

 

$include /etc/inputrc

 

Поиск в Readline

 

Readline предоставляет команды для поиска строк в истории команд, (Историю команд я буду описывать в дальнейшем), содержащих заданную строку. Существует два режима поиска: инкрементный и не инкрементный.

 

Инкрементный поиск начинается до того как пользователь оканчивает ввод строки поиска. Как только набирается каждый символ строки, Readline отображает следующую запись в истории соответствующую набранной строке до этого момента. Инкрементный поиск требует ввода стольких символов, сколько необходимо для того чтобы найти необходимую запись истории. Символы значения переменной isearch-terminators используются для того чтобы прекратить инкрементный поиск. Если этой переменной значение не было присвоено, символы Escape и Control-J будут прекращать инкрементный поиск. Control-G прерывает инкрементный поиск и восстанавливает оригинальную строку. Когда поиск будет завершён, запись истории содержащая строку поиска, становится текущей.

 

Чтобы найти иные соответствующие записи в списке истории нажмите Control-S или Control-R по мере необходимости. Будет осуществляться поиск назад или вперед в истории в течении записи соответствующей уже набранному фрагменту строки. Любая иная последовательность клавиш связанных с командами библиотеки readline, завершит поиск и выполнит эту команду. К примеру, нажав клавишу Enter вы завершите поиск и выполните команду из списка истории.

 

Readline запоминает последнюю строку инкрементного поиска. Если дважды набирается Control-R то следующие символы набираются в конце найденной строки без определения новой строки поиска.

 

Неинкрементный поиск читает всю строку поиска, прежде чем начать искать соответствующие строки истории. Строка поиска может быть введена пользователем или быть частью содержимого текущей строки.

 

Имена команд Readline

 

Ниже приведён список команд и последовательность ключей (клавиш) по умолчанию связанных с ними. Названия команд для которых не установлена последовательность ключей(клавиш), по умолчанию ни к какой комбинации не привязаны. С последующих описаниях точка относится к текущей позиции курсора, а метка относится к позиции курсора сохраненной командой set-mark. Текст между точкой и меткой, называют регионом.

 

Команды для перемещения

 

beginning-of-line (C-a)

перемещение в начало текущей строки

 

end-of-line (C-e)

перемещение в конец строки

 

forward-char (C-f)

перемещение на символ вперед

 

backward-char (C-b)

перемещение на символ назад

 

forward-word (M-f)

передвижение до конца следующего слова. Слова состоят из алфавитно-цифровых символов(букв и цифр). В Linux системах свойства клавиши Meta может выполнять ESC единоразовым нажатием. Это значит что чтобы ввести комбинацию M-f, Вам необходимо нажать, но не зажимать, ESC, затем нажать клавишу f.

 

backward-word (M-b)

возвращение к началу текущего или предыдущего слова. Слова состоят из алфавитно-цифровых символов(букв и цифр). В Linux системах свойства клавиши Meta может выполнять ESC единоразовым нажатием.

 

shell-forward-word

двигаться до конца следующего слова. Слова разделяются метасимволами не заключенными в кавычки.

 

shell-backward-word

вернуться к началу текущего или предыдущего слова. Слова разделяются метасимволами не заключенными в кавычки.

 

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-ое слово из предыдущей команды(слова в предыдущей команде нумеруются с 0). В случае если аргумент отрицательный, вставляется N-ое слово с конца предыдущей команды. Как только вычисляется аргумент n, аргумент извлекается, как если бы было задано расширение истории «!n«.

 

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

вставляет последний аргумент предыдущей команды(последнее слово предыдущей записи истории). С числовыми аргументами ведет себя так же как и yank-nth-arg. Последовательные вызовы yank-last-arg, двигают по списку истории вставляя последнее слово последнего аргумента очередной строки. Любой числовой аргумент, подставляемый на эти последовательные вызовы определяет направление для перемещения по истории. Отрицательный аргумент переключает направление по истории(вперед или назад). Средства для расширения истории используются для извлечения последнего аргумента, как если бы было задано расширение истории «!$«.

 

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

расширение строки как это делает shell. Она выполняет псевдонимы(alias) и расширения истории, а так же подстановки слов. Описание расширения истории будет описано в дальнейшем.

 

history-expand-line (M-^)

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

 

magic-space

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

 

alias-expand-line

выполняет расширение псевдонимов(alias) в текущую строку. Расширения псевдонимов описывалось в статье ранее.

 

history-and-alias-expand-line

расширение истории и псевдонимов(alias) в текущей строке.

 

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

синоним для yank-last-arg.

 

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

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

 

edit-and-execute-command (C-xC-e)

вызвать редактор в текущую командную строку и выполнить результат команды оболочки. Bash пытается вызвать $VISUAL, $EDITOR и emacs в качестве редактора, в таком порядке.

 

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

 

delete-char (C-d)

удаляет символ в точке. Если точка находится в начале строки, а последний нажатый символ не привязан к команде delete-char, возвращается EOF.

 

backward-delete-char (Rubout)

удаляет символ перед курсором. Когда задаётся числовой аргумент, сохраняет удалённый текст в буфере kill ring.

 

forward-backward-delete-char

удаляет символ на месте курсора, если курсор не находится на конце линии, в случае же если курсор в конце линии то удаляется символ перед курсором.

 

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

добавить следующий символ на строку буквально. Так можно добавлять такие символы как C-q, например.

 

tab-insert (C-v TAB)

вставить символ табуляции

 

self-insert (a, b, A, 1, !, …)

вставить набранный символ

 

transpose-chars (C-t)

перетащить символ перед курсором за курсор, курсор так же в свою очередь передвигается на одну позицию. Если курсор находится в конце строки, то это переносит два символа перед точкой. Отрицательные аргументы не имеют никакого эффекта.

 

transpose-words (M-t)

перетаскивает слово за слово после которого стоит курсор. Курсор переносится в конец перенесенного слова. Если курсор находится в конце строки, перемещается два последние слова в строке.

 

upcase-word (M-u)

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

 

downcase-word (M-l)

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

 

capitalize-word (M-c)

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

 

overwrite-mode

переключает режим перезаписи. С явным положительным аргументом, переключается в режим замены. С явным не положительным числовым аргументом, переключает в режим вставки. Данная команда влияет только на emacs режим, vi делает перезаписи иначе. Каждый вызов библиотеки readline() начинается в режиме вставки. В режиме замены символы заключённые в самостоятельную вставку меняют текст в месте курсора, а не нажатием текста в правом крае. Связано с backward-delete-char. По умолчанию команда не привязана.

 

Удаление и вставка

 

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-Rubout)

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

 

shell-kill-word (M-d)

удаляет от курсора в конец текущего слова или если курсор находится между словами до конца следующего слова. Границы слов такие же что используются при shell-forward-word.

 

shell-backward-kill-word (M-Rubout)

удаляет слово перед курсором. Границы слов такие же что используются при shell-backward-word.

 

unix-word-rubout (C-w)

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

 

unix-filename-rubout

удаляет слово за курсором, в качестве границ слова используются пробелы и косая черта. Текст помещается в буфер kill-ring.

 

delete-horizontal-space (M-\)

удаляются все пробелы и табуляции вокруг курсора.

 

kill-region

удалить текст в текущей области.

 

copy-region-as-kill

копировать текст в области в буфер обмена.

 

copy-backward-word

копировать слово перед курсором в буфер обмена. Границы слова такие же что и при backward-word.

 

copy-forward-word

копирует слово следующее за курсором в буфер обмена. Границы слова такие же как при forward-word.

 

yank (C-y)

восстановить верхний элемент буфера kill ring в месте курсора.

 

yank-pop (M-y)

прокручивает буфер kill ring и вставляет новый верхний элемент. Работает только после команды yank или yank-pop.

 

Числовые аргументы

 

digit-argument (M-0, M-1, …, M—)

добавляет цифру к накопленному аргументу либо начинает новый аргумент. M— начинает отрицательный аргумент.

 

universal-argument

Это ещё один способ задать аргумент. Если за этой командой следует одна или несколько цифр, возможно со знаком минус, эти цифры определяют аргумент. Если после команды следуют цифры, выполнение universal-argument завершает числовой аргумент, в ином же случае игнорируется. Как частный случай, если за командой следует символ не являющийся цифрой или знаком минус, аргумент count для следующей команды умножается на четыре. Изначально аргумент count один, так выполнение этой функции в первый раз делает количество аргументов четыре, второй раз количество аргументов шестнадцать и тд

 

Завершение

 

complete (TAB)

пытается завершить текст, введённый до текущей позиции. Bash пытается выполнить завершение текста как переменную (если текст начитается с «$»), если текст начинается с «~» как имя пользователя, если же текст начинается с «@» имя хоста или как команду включая псевдонимы и функции. Если ни одним из способов завершить строку не удаётся, выполняется попытка завершения имени файла.

 

possible-completions (M-?)

выдаёт возможные завершения текста перед текущей позицией.

 

insert-completions (M-*)

вставляет все завершения текста преред позицией, порождаемые командой possible-completions.

 

menu-complete

похоже на команду complete, но заменяет слово на первое возможное завершение из списка возможных. Повторное выполнение menu-complete вставляет следующий элемент из списка возможных завершений. В конце списка завершений подаётся сигнал, (в зависимости от настроек) и восстанавливается исходный текст. Аргумент «n» вызывает переход к позиции в списке под номером «n», отрицательный аргумент может быть использован для перемещения по списку назад. Эта команда предназначена для привязки к TAB, но не привязана по умолчанию.

 

menu-complete-backward

идентично menu-complete но движение происходит назад по списку возможных завершений, как будто menu-complete был задан отрицательный аргумент. Данная команда не привязана по умолчанию.

 

delete-char-or-list

удаляет символ перед курсором, если курсор не находится в начале или конце строки (аналогично delete-char). В случае же нахождения курсора в конце строки ведёт себя аналогично команде possible-completions. Данная команда по умолчанию не привязана.

 

complete-filename (M-/)

пытается завершить введённый текст до текущей позиции как имя файла.

 

possible-filename-completions (C-x /)

выдаёт возможные завершения текста до текущей позиции курсора, интерпретируемого как имя файла.

 

complete-username (M-~)

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

 

possible-username-completions (C-x ~)

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

 

complete-variable (M-$)

пытается завершить введённый текст до текущей позиции, рассматривая его в качестве переменной shell.

 

possible-variable-completions (C-x $)

выдаёт возможные завершения текста до текущей позиции, рассматривая его в качестве переменной shell.

 

complete-hostname (M-@)

пытается завершить введённый текст до текущей позиции как имя хоста.

 

possible-hostname-completions (C-x @)

выдаёт возможные завершения текста до текущей позиции как имя хоста.

 

complete-command (M-!)

пытается завершить введённый текст до текущей позиции, интерпретируя как имя команды. Завершение команды пытается последовательно согласовать текст с псевдонимами, зарезервированными словами, функциями shell, встроенными командами shell, и именами исполняемых файлов.

 

possible-command-completions (C-x !)

выдаёт возможные завершения текста до текущей позиции, интерпретируя как имя команды.

 

dynamic-complete-history (M-TAB)

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

 

dabbrev-expand

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

 

complete-into-braces (M-{)

выполняет завершение имени файла и вставляет список возможных дополнений заключённых в фигурные скобки, чтобы он мог быть выполнен командным интерпритатором (Подстановку значений в фигурных скобках я описывал ранее)

 

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

 

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)

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

 

abort (C-g)

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

 

do-uppercase-version (M-a, M-b, M-x, …)

если символ «x» в нижнем регистре вводится вместе с клавишей Meta, выполняется команда которая связана с данным символом в верхнем регистре.

 

prefix-meta (ESC)

рассматривает следующий символ, как символ перед которым введен символ Meta. (ESC f) эквивалентно Meta-f.

 

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

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

 

revert-line (M-r)

отмена всех сделанных изменений в текущей строке. Это похоже на выполнение команды undo достаточное количество раз для возвращения строки в исходное состояние.

 

tilde-expand (M-&)

выполняет замену тильды для текущего слова.

 

set-mark (C-@, M-)

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

 

exchange-point-and-mark (C-x C-x)

меняет местами метку с текущей позицией. Текущая позиция устанавливается в сохраненную позицию, а старое положение курсора запоминается как метка.

 

character-search (C-])

читается символ и курсор перемещается к следующему появлению этого символа. Отрицательный аргумент означает поиск предыдущего вхождения.
character-search-backward (M-C-])

Читается символ, и курсор перемещается к предыдущему появлению этого символа. Отрицательный аргумент означает поиск следующих вхождений.

 

skip-csi-sequence

читает достаточно символов, чтобы прочесть многоклавишные последовательности, такие как определены для ключей Home и End. Такие последовательности начинаются с управления индикатором последовательности (CSI), как правило, ESC-[. Если эта последовательность связана с «\[«, ключи получения такой последовательности не будут иметь никакого эффекта, если явно не связаны с командой readline вместо вставки посторонних символов в буфер редактирования. Ключи по умолчанию с этим не связаны, обычно связаны с ESC-[.

 

insert-comment (M-#)

бесчисловой аргумент, значение readline переменной comment-begin вставляется в начало текущей строки. Если аргумент является числовым, то эта команда действует как переключатель: если символы в начале строки не соответствуют значению comment-begin вставляется значение, в ином случае символы в comment-begin удаляются с самого начала строки. В любом случае строка воспринимается как символ новой строки, если была напечатана. Значение по умолчанию comment-begin вызывает эту команду сделав текущую строку комментарием shell. Если аргумент является числовым, символ комментария удаляется, строка будет выполнена.

 

glob-complete-word (M-g)

слово перед курсором рассматривается как шаблон для имён файлов, со звёздочкой «*» прилагается неявно. Этот шаблон используется для создания списка соответствующих имен файлов для возможных завершений.

 

glob-expand-word (C-x *)

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

 

glob-list-expansions (C-x g)

отображается список расширений которые были порождены glob-expand-word, и строка перерисовывается. Если аргумент является числовым к имени файлов добавляется звёздочка.

 

dump-functions

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

 

dump-variables

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

 

dump-macros

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

 

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

показать информацию о текущей версии экземпляра bash.

 

Программируемое дополнение

 

Когда автозавершение слов пытается использоваться для команд, для которых завершение спецификации (compspec) было определено с использованием встроенной команды complete, вызываются программируемые объекты завершения.

 

Во первых имя команды определяется. Если слово команды является пустой строкой (попытка ввести завершение в начале пустой строки), любой comspec, определяется с использованием опции завершения -E. Если comspec были определены для этой команды, comspec, используется для генерации списка возможных вариантов для слова. Когда слово команды является полным путём, comspec для полного пути ищется в первую очередь. Если comspec для полного пути не найдено, comspec пытается найти для части после последней косой черты. Если эти поиски не приводят к comspec, любой comspec определяется с использованием опции -D для завершения по умолчанию.

 

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

 

Используются первые действия определённые как comspec. Только совпадения которые имеют префикс слово во время завершения, возвращаются. Когда используется опция -f или -d для файла или каталога завершения имен, переменная FIGNORE используется для фильтрации совпадений. Любые дополнения указанные в расширении имен путей шаблонов для опции -G генерируются далее. Слова генерируемого шаблона, не обязательно совпадают с завершаемым словом. Переменная shell GLOBIGNORE не используется для фильтрации по поиску, используется переменная FIGNORE.

 

Рассматривается следующая строка указанная в качестве аргумента опции -W. Строка сначала разделяет используемые символы в специальной переменной IFS, в качестве разделителей. Цитирования shell заслуживаются. Затем каждое слово расширяется с помощью фигурных скобок, расширений тильды, параметров и расширений переменных, подстановки команд и арифметических выражений как описывалось ранее в разделе Расширения. Результаты разделяются используя правила описанные ранее в разделе Разбиение слов. Результат расшиения, является префикс соответствующий завершающемуся в настоящий момент слову, и подходящим словам становятся возможны завершения. После того как эти совпадения были сгенерированы любая функция shell или команда указанная с параметрами -F и -C вызывается. Когда вызывается команда или функция COMP_LINE, COMP_POINT, COMP_KEY, и COMP_TYPE переменным присваивается значение, как было описано ранее в разделе Переменные shell. Если функция shell была вызвана, переменные COMP_WORDS и COMP_CWORD также устанавливается. Когда вызывается функция или команда, первый аргумент это имя команды, аргумент который в настоящее время завершен, второй это слово заверщающееся, а третий аргумент представляет собой предшествующее слово заверщающейся текущей командной строки. Нет фильтрации генерируемых добавлений заверщающегося слова, функция или команда имеет полную свободу в создании совпадений.

 

Любая функция, заданная с -F вызывается в первую очередь. Функцию может использовать любой из объектов из shell оболочки, в том числе встроенная команда compgen, для создания совпадений. Она должна поставить возможные завершения в переменной массива COMPREPLY.

 

Далее любая команда определяемая при помощи опции -C вызывается в среде эквивалентной команде substitution. Она должна распечатать список завершений, по одному в строке, на стандартный вывод. Обратная косая черта может быть использована чтобы избежать новой строки при необходимости.

 

После всех возможных завершений генерируется любой фильтр, указанный с опцией -X применяемой к списку. Фильтр шаблона который используется для расширения имен файлов: & в шаблоне заменяется текстом завершенного слова. Буквальное &, может быть с обратной косой чертой: обратная косая черта удаляется перед попыткой совпадения. Любой завершение, соответствующее шаблону будет удалено из списка. Ведущий ! отрицательный шаблон: в этом случае любое завершение не соответствующее шаблону будет удалено.

 

Наконец, любой префикс и суффикс указывающийся с опциями -P и -S добавляется каждому члену списка завершения и результат возвращается в readline кода завершения, как список возможных завершений. Если ранее применяемые действия не генерируют никаких совпадений, и опция -o dirnames поставляется для завершения, когда compspec был определён, происходит попытка завершения имени каталога.

 

Если опция -o plusdirs поставляется для завершения, когда compspec был определён, происходит попытка завершения имени каталога и любые совпадения добавляются к результатам других действий.

 

По умолчанию, если compspec найден, все, что он генерирует возвращается к коду завершения как полный набор возможных завершений. По умолчанию bash не производит попытки завершений, и в readline по умолчанию отключено завершения имени файла. Если опция -o bashdefault поставляется для завершения, когда compspec был определён, попытки пополнений bash завершаются если compspec не генерирует совпадения. Если опция -o default была поставлена для завершения, когда compspec был определен, завершение readline’s по умолчанию будет выполняться если compspec не генерирует совпадений. Когда compspec указывает желательное имя каталога завершения, программируемые функции завершения заставляют readline добавить косую черту к именам, которые являются символическими ссылками на каталоги, с учётом значений переменной mark-directories библиотеки readline, независимо от установки переменной mark-symlinked-directories библиотеки readline. Существует некоторая поддержка для динамической модификации завершений. Это особенно полезно при использовании в комбинации с завершением по умолчанию указанного с complete -D. Это возможно для функций shell, выполненных в качестве обработчиков завершения, чтобы указать завершение, следует повторно вернуть код завершения 124. Если shell функция возвращает 124 и изменяет compspec связанный с командой на которой в настоящее время происходит попытка завершения(поставляется в качестве первого аргумента, когда выполняется функция), программируемое дополнение возобновляется с самого начала, с попыткой найти новый compspec для этой команды. Это даёт набор завершений, которые будут построены динамично, как попытка завершения, а не загружаются все сразу.

 

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

 

_completion_loader()

{

. «/etc/bash_completion.d/$1.sh» >/dev/null 2>&1 && return 124

}

complete -D -F _completion_loader 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *