Эта глава описывает основные возможности интерфейса редактирования командной строки GNU.
Следующие абзацы описывают нотацию, используемую для обозначения нажатия клавиш.
Текст C-k читается как `Control-K' и описывает знак, получаемый нажатием клавиши k при нажатой клавише Control.
Текст M-k читается как `Meta-K' и описывает знак, вводимый нажатием клавиши k при нажатой клавише Meta (если у вас она имеется). На многих клавиатурах клавиша Meta надписана как ALT. На клавиатурах с двумя клавишами ALT (обычно по разные стороны от пробела), ALT на левой стороне обычно устанавливается для работы клавишей Meta. Правый ALT также может быть сконфигурирован для работы Meta, или он может быть сконфигурирован как другой модификатор, например как клавиша Compose для ввода букв с акцентами.
Если у вас нет клавиши Meta или ALT или другой клавиши, работающей как Meta, идентичное нажатие клавиш можно получить нажав сначала ESC, а затем k. Эти процессы называются метафикацией клавиши k.
Текст M-C-k читается как `Meta-Control-k' и описывает знак, получаемый посредством метафикации C-k.
Кроме того, некоторые клавиши имеют собственные имена. Именно, DEL, ESC, LFD, SPC, RET и TAB в этом тексте или в файле инициализации обозначают сами себя (см. раздел 21.3 Файл инициализации Readline). Если на вашей клавиатуре нет клавиши LFD, нажатие C-j приведет к вводу желаемого знака. Клавиша RET на некоторых клавиатурах может быть отмечена как Return или Enter.
Часто во время интерактивного сеанса вы вводите длинную строку текста и только потом замечаете, что первое слово набрано неправильно. Библиотека Readline дает вам набор команд для управления текстом во время ввода, позволяя вам лишь исправить опечатку, а не набирать заново большую часть строки. С помощью этих команд редактирования, вы перемещаете курсор в место, требующее исправления, и удаляете или вставляете текст для коррекции. Затем, когда строка полностью исправлена, вы просто нажимаете RET. Чтобы нажать RET, вам не обязательно находиться в конце строки; вся строка вводится независимо от расположения в ней курсора.
Для того, чтобы ввести знак в строку, просто нажмите его. Введенный знак появляется там, где был курсор, и затем курсор перемещается на одну позицию вправо. Если вы неверно набрали знак, вы можете использовать ваш знак уничтожения, чтобы вернуться и удалить неверный знак.
Иногда вы можете набрать знак ошибочно и не заметить ошибки, пока не напечатаете несколько других знаков. В этом случае, вы можете набрать C-b, чтобы переместить курсор влево, и затем исправить вашу ошибку. После этого, вы можете переместить курсор вправо нажатием C-f.
Когда вы добавляете текст в середину строки, знаки справа от курсора `сдвигаются вперед', чтобы освободить место для вставляемого текста. Аналогично, когда вы удаляете текст за курсором, знаки справа от него `сдвигаются назад', занимая пустое пространство, созданное в результате удаления текста. Ниже следует список команд первой необходимости для редактирования вводимого текста.
(В зависимости от вашей конфигурации, клавиша Backspace может быть настроена удалять знак слева от курсора, а DEL удалять знак под курсором, как C-d, вместо знака, расположенного от курсора слева.)
Приведенная выше таблица описывает только самые базовые последовательности клавиш, которые могут вам понадобиться для редактирования строки ввода. Для удобства, в дополнение к C-b, C-f, C-d и DEL были добавлены многие другие команды. Вот некоторые из них, предназначенные для более быстрого перемещения по строке.
Заметьте, что C-f перемещает курсор вперед на один знак, в то время как M-f перемещает вперед на слово. Это своего рода соглашение, что при нажатии клавиши Сontrol производятся действия над знаками, а при нажатии клавиши Meta -- над словами.
Уничтожение текста означает уничтожение текста из строки, но сохранение его для дальнейшего использования, обычно для восстановления (повторной вставки) обратно в строку. (`Вырезать' и `вставить' являются более современными жаргонными синонимами для `уничтожить' и `восстановить'.)
Если в описании команды сказано, что она `уничтожает' текст, то вы можете быть уверены, что позже его можно будет получить обратно в другом (или том же самом) месте.
Когда вы используете команду уничтожения, текст сохраняется в кольцевом списке уничтожений. Любое число последовательных уничтожений сохраняет весь уничтоженный текст вместе, так что когда вы восстанавливаете его назад, вы получите все. Список уничтожений не имеет привязки к строкам; текст, уничтоженный вами в предыдущей строке ввода, доступен для восстановления позже, когда вы вводите другую строку.
Вот список команд для уничтожения текста.
Вот как можно восстановить текст обратно в строку. Восстановление означает копирование последнего уничтоженного текста из буфера уничтожений.
Вы можете передавать числовые параметры командам Readline. Иногда параметр действует как счетчик повторений, иногда он является знаком минус, если аргумент отрицателен. Если вы передаете отрицательный параметр команде, которая обычно действует в прямом направлении, то она будет действовать в обратном направлении. Например, чтобы уничтожить текст до начала строки, вы можете набрать `M-- C-k'.
Общий способ передачи числовых параметров команде состоит в наборе Meta-цифр перед командой. Если первая набранная `цифра' есть знак минус (`-'), тогда знак аргумента будет отрицательным. Если вы набрали одну мета-цифру для начала параметра, вы можете набрать оставшиеся цифры и потом команду. Например, чтобы передать команде C-d параметр 10, вы можете набрать `M-1 0 C-d'.
Readline предоставляет команды для поиска в истории команд строк, содержащих указанную подстроку. Существует два режима поиска: наращиваемый и ненаращиваемый.
Наращиваемый поиск начинается до того, как пользователь закончит ввод
строки поиска. По мере ввода очередных знаков строки поиска, Readline
отображает следующий элемент из истории, соответствующий строке,
введенной на данный момент. Наращиваемый поиск требует ровно столько
знаков, сколько требуется для нахождения желаемого элемента истории.
Для поиска определенной строки в истории в обратном направлении, введите
C-r. Ввод C-s производит поиск в прямом направлении.
Знаки, присутствующие в значении переменной isearch-terminators
,
используются для завершения наращиваемого поиска. Если этой переменной
не было присвоено значение, знаки ESC и C-J будут завершать
наращиваемый поиск. C-g прерывает наращиваемый поиск и
восстанавливает исходную строку. Когда поиск завершается, элемент
истории, содержащий искомую строку, становится текущей строкой.
Для нахождения других подходящих элементов списка истории, введите соответственно C-r или C-s. Это произведет поиск вперед или назад в истории до следующего элемента, соответствующего введенной строке поиска. Любая другая последовательность клавиш, привязанная к команде Readline, завершит поиск и выполнит эту команду. Например, RET завершит поиск и примет эту строку, таким образом выполняя команду из списка истории.
Ненаращиваемый поиск считывает строку поиска целиком, до начала поиска соответствующих строк истории. Строка поиска может быть введена пользователем или являться частью содержимого текущей строки.
Хотя библиотека Readline поставляется с установленным по умолчанию набором
привязок клавиш, аналогичному Emacs, возможно использование
другого набора привязок. Любой пользователь может настраивать
программы, которые используют Readline, помещая команды в файл
inputrc, обычно в своем домашнем каталоге. Имя этого
файла берется из переменной среды INPUTRC
. Если
эта переменная не установлена, по умолчанию берется файл `~/.inputrc'.
Когда запускается программа, использующая библиотеку Readline, файл инициализации считывается, и устанавливаются привязки клавиш.
Кроме того, команда C-x C-r считывает файл инициализации заново, так что изменения, которые вы могли cделать к этому времени, вступают в силу.
Существуют всего несколько конструкций, которые допускаются в файле инициализации Readline. Пустые строки игнорируются. Строки, начинающиеся с `#', являются комментариями. Строки, начинающиеся с `$', обозначают условные конструкции (см. раздел 21.3.2 Условные конструкции инициализации). Другие строки обозначают установку переменных и привязки клавиш.
set
в
файле инициализации. Вот как можно изменить привязку клавиш Emacs,
используемую по умолчанию, для использования команд редактирования
строки vi
:
set editing-mode viОсновная часть поведения при выполнении изменяется с помощью следующих переменных.
bell-style
comment-begin
"#"
.
completion-ignore-case
completion-query-items
100
.
convert-meta
disable-completion
self-insert
. По умолчанию `off'.
editing-mode
editing-mode
контролирует, какой набор привязок клавиш
используется. По умолчанию, Readline запускается в режиме
редактирования Emacs, где нажатия клавиш очень похожи на Emacs. Эта
переменная может быть установлена или в `emacs', или в `vi'.
enable-keypad
expand-tilde
horizontal-scroll-mode
input-meta
meta-flag
является синонимом для этой переменной.
isearch-terminators
keymap
keymap
: emacs
,
emacs-standard
, emacs-meta
, emacs-ctlx
, vi
,
vi-command
и vi-insert
. vi
эквивалентно
vi-command
; emacs
эквивалентно emacs-standard
.
Значение по умолчанию emacs
. Значение переменной
editing-mode
также влияет на раскладку по умолчанию.
mark-directories
mark-modified-lines
output-meta
print-completions-horizontally
show-all-if-ambiguous
visible-stats
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"В этом примере, C-u привязана к функции
universal-argument
,
а C-o привязана к выполнению макрокоманды, записанной с правой
стороны (то есть, вставить текст `> output' в строку).
"\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'.
\C-
\M-
\e
\\
\"
\'
\a
\b
\d
\f
\n
\r
\t
\v
\nnn
ASCII
которого есть nnn
(от одной до трех цифр)
\xnnn
ASCII
которого есть nnn
(от одной до трех цифр)
"\C-x\\": "\\"
Readline реализует возможности, аналогичные по смыслу возможностям условной компиляции препроцессора Си, позволяющие производить привязки клавиш и установку переменных в результате тестов. Вот четыре директивы, используемые анализатором.
$if
$if
позволяет производить привязки в зависимости от
режима редактирования, используемого терминала, или приложения,
использующего Readline. Содержимое теста продолжается до конца строки;
для его ограничения не требуются никакие знаки.
mode
mode=
директивы $if
используется для проверки в
каком из режимов находится Readline: emacs
или vi
. Это
может быть использовано, например, вместе с командой `set keymap'
для установки привязок в наборы emacs-standard
и
emacs-ctlx
, только если Readline запускается в режиме
emacs
.
term
term=
может использоваться для включения привязок клавиш,
уникальных для какого-либо терминала, возможно для привязки вывода
последовательности клавиш к функциональным клавишам терминала. Слово,
стоящее справа от `=', сравнивается как с полным названием
терминала, так и с частью названия, идущей до первого `-'. Это
позволяет, например, опознавать как sun
, так и sun-cmd
.
application
$if Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" $endif
$endif
$if
.
$else
$if
выполняются, если проверка
заканчивается неудачей.
$include
$include /etc/inputrc
Вот пример файла inputrc. Он иллюстрирует привязки клавиш, присвоение значений переменным и синтаксис условий.
# Этот файл управляет поведением редактирования строки ввода в # программах, использующих библиотеку Gnu Readline. Среди таких программ # FTP, Bash и Gdb. # # Вы можете заново считать файл inputrc с помощью C-x C-r. # Строки, начинающиеся с '#', являются комментариями. # # Сначала, включим все общесистемные привязки и переменные из # /etc/Inputrc $include /etc/Inputrc # # Установка различных привязок для режима emacs. set editing-mode emacs $if mode=emacs Meta-Control-h: backward-kill-word Текст после имени функции игнорируется # # Стрелки в режиме малой клавиатуры # #"\M-OD": backward-char #"\M-OC": forward-char #"\M-OA": previous-history #"\M-OB": next-history # # Стрелки в режиме ANSI # "\M-[D": backward-char "\M-[C": forward-char "\M-[A": previous-history "\M-[B": next-history # # Стрелки в восьмибитном режиме малой клавиатуры # #"\M-\C-OD": backward-char #"\M-\C-OC": forward-char #"\M-\C-OA": previous-history #"\M-\C-OB": next-history # # Стрелки в восьмибитном режиме ANSI # #"\M-\C-[D": backward-char #"\M-\C-[C": forward-char #"\M-\C-[A": previous-history #"\M-\C-[B": next-history C-q: quoted-insert $endif # Привязки старого стиля. Устанавливается по умолчанию. TAB: complete # Макрокоманды, удобные при взаимодействии с оболочкой $if Bash # редактирование пути "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" # Подготовка к вводу слова в кавычках -- вставляет открывающуюся и # закрывающуюся двойные кавычки и помещает курсор сразу за открывающей "\C-x\"": "\"\"\C-b" # вставляет обратную косую черту (testing backslash escapes in sequences # and macros) "\C-x\\": "\\" # Заключает в кавычки текущее или предыдущее слово "\C-xq": "\eb\"\ef\"" # Добавляет привязку для обновления строки "\C-xr": redraw-current-line # Редактирование переменной в текущей строке "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" $endif # использовать визуальный звонок, если он доступен set bell-style visible # не урезать знаки при чтении до 7 бит set input-meta on # позволяет ввод знаков iso-latin1 вместо их преобразования к # последовательностям с Meta-префиксом # prefix-meta sequences set convert-meta off # отображает знаки непосредственно с установленным восьмым битом, а не # в виде знаков с Meta-префиксом set output-meta on # если существует более 150 возможных завершений слова, запросить # пользователя, хочет ли он видеть их все set completion-query-items 150 # Для FTP $if Ftp "\C-xg": "get \M-?" "\C-xt": "put \M-?" "\M-.": yank-last-arg $endif
Этот раздел описывает команды 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)
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)
yank-last-arg (M-., M-_)
yank-nth-arg
. Последовательные вызовы yank-last-arg
перемещают назад по списку истории, вставляя последний аргумент каждой
строки по очереди.
delete-char (C-d)
delete-char
, возвращает EOF.
backward-delete-char (Rubout)
forward-backward-delete-char ()
quoted-insert (C-q, C-v)
tab-insert (M-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)
kill-line (C-k)
backward-kill-line (C-x Rubout)
unix-line-discard (C-u)
kill-whole-line ()
kill-word (M-d)
forward-word
.
backward-kill-word (M-DEL)
backward-word
.
unix-word-rubout (C-w)
delete-horizontal-space ()
kill-region ()
copy-region-as-kill ()
copy-backward-word ()
backward-word
. Эта команда по умолчанию не
привязана.
copy-forward-word ()
forward-word
. Эта команда по умолчанию не
привязана.
yank (C-y)
yank-pop (M-y)
yank
или yank-pop
.
digit-argument (M-0, M-1, ... M--)
universal-argument ()
universal-argument
заканчивает числовой аргумент, а в
противном случае он игнорируется.
В особом случае, если непосредственно за этой командой следует или
цифра, или знак минус, аргумент для следующей команды умножается на
четыре. Изначально аргумент равен единице, так что выполнение этой
функции первый раз делает его равным четырем, второй раз -- шестнадцати,
и так далее. По умолчанию эта функция не привязана к клавише.
complete (TAB)
possible-completions (M-?)
insert-completions (M-*)
possible-completions
.
menu-complete ()
complete
, но замещает завершаемое слово одним
совпадением из списка возможных завершений. Повторяемое выполнение
menu-complete
обходит список возможных завершений, вставляя
каждое совпадение по очереди. В конце списка завершений издается
звуковой сигнал и восстанавливается исходный текст. Аргумент n
перемещает на n позиций вперед в списке совпадений; отрицательный
аргумент может использоваться для перемещения по списку назад. Эта
команда предназначается для привязки к TAB, но по умолчанию не
привязана.
delete-char-or-list ()
delete-char
). Если курсор находится в конце строки,
поведение аналогично 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, M-x, ...)
prefix-meta (ESC)
undo (C-_, C-x C-u)
revert-line (M-r)
undo
, чтобы вернуться в
начало.
tilde-expand (M-~)
set-mark (C-@)
exchange-point-and-mark (C-x C-x)
character-search (C-])
character-search-backward (M-C-])
insert-comment (M-#)
comment-begin
, и эта строка вводится, как если бы был введен знак
новой строки.
dump-functions ()
dump-variables ()
dump-macros ()
Хотя библиотека Readline не имеет полного набора функций редактирования
vi
, она все же содержит достаточно для простого редактирования
строки. Режим vi
Readline функционирует так, как определено в
стандарте POSIX 1003.2.
Для интерактивного переключения между режимами редактирования
emacs
и vi
, используйте команду M-C-j
(toggle-editing-mode
).
По умолчанию, Readline использует режим emacs
.
Когда вы вводите строку в режиме vi
, вы уже находитесь в режиме
`вставки', как если бы вы набрали `i'. Нажатие ESC
переключает вас в `командный' режим, в котором вы можете редактировать
текст строки стандартными клавишами перемещения vi
, перемещаться
к предыдущим строкам истории посредством `k' и к последующим
строкам посредством `j', и так далее.