Эта глава описывает основные возможности интерфейса редактирования командной строки GNU.
Следующие параграфы описывают нотацию, используемую для обозначения нажатия клавиш.
Текст C-k читается как `Control-K' и описывает знак, полученный нажатием клавиши k при нажатой клавише Control.
Текст M-k читается как `Meta-K' и описывает знак, введенный нажатием клавиши k при нажатой клавише META (если у вас она имеется). Если у вас нет клавиши Meta, идентичное нажатие клавиш можно получить нажав сначала ESC, а затем k. Эти процессы называются метафикацией клавиши k.
Текст M-C-k читается как `Meta-Control-k' и описывает знак, полученный посредством метафикации C-k.
Кроме того, некоторые клавиши имеют собственные имена. Именно, DEL, ESC, LFD, SPC, RET и TAB в этом тексте или в файле инициализации обозначают сами себя (см. раздел 20.3 Файл инициализации Readline).
Часто во время интерактивного сеанса вы вводите длинную строку текста только для того, чтобы заметить, что первое слово набрано неправильно. Библиотека Readline дает вам набор команд для управления текстом во время ввода, позволяя вам лишь исправить опечатку, а не набирать заново большую часть строки. С помощью этих команд редактирования, вы перемещаете курсор в место, требующее исправления, и удаляете или вставляете текст для коррекции. Затем, когда строка полностью исправлена, вы просто нажимаете RET. Чтобы нажать RET вам не обязательно находиться в конце строки; вся строка вводится независимо от расположения в ней курсора.
Для того, чтобы ввести знак в строку, просто нажмите его. Введенный знак появляется там, где был курсор, и затем курсор перемещается на одну позицию вправо. Если вы неверно набрали знак, вы можете использовать ваш знак уничтожения, чтобы вернуться и удалить неверный знак.
Иногда вы можете пропустить символ, который хотели набрать, и не заметить этого, пока вы не напечатали несколько других знаков. В этом случае, вы можете набрать C-b, чтобы переместить курсор влево, и затем исправить вашу ошибку. После этого, вы можете переместить курсор вправо нажатием C-f.
Когда вы добавляете текст в середину строки, символы справа от курсора `сдвигаются вперед', чтобы освободить место для вставляемого текста. Аналогично, когда вы удаляете текст за курсором, символы справа от него `сдвигаются назад', занимая пустое пространство, созданное в результате удаления текста. Ниже следует список команд первой необходимости для редактирования вводимого текста.
Эта таблица описывает только самые базовые возможные клавиши, которые могут вам понадобиться для редактирования строки ввода. Для удобства, в дополнение к 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 отображает следующий элемент из истории, соответствующий строке, введенной на данный момент. Наращиваемый поиск требует ровно столько символов, сколько требуется для нахождения желаемого элемента истории. Символы, присутствующие в значении переменной isearch-terminators, используются для завершения наращиваемого поиска. Если этой переменной не было присвоено значение, знаки ESC и C-J будут завершать наращиваемый поиск. C-g прерывает наращиваемый поиск и восстанавливает исходную строку. Когда поиск завершается, элемент истории, содержащий искомую строку, становится текущей строкой. Для нахождения других подходящих элементов списка истории, введите соответственно C-s или C-r. Это произведет поиск вперед или назад в истории до следующего элемента, соответствующего введенной строке поиска. Любая другая последовательность клавиш, привязанная к команде Readline, завершит поиск и выполнит эту команду. Например, RET завершит поиск и примет эту строку, таким образом выполняя команду из списка истории.
Ненаращиваемый поиск считывает строку поиска целиком, до начала поиска соответствующих строк истории. Строка поиска может быть введена пользователем или являться частью содержимого текущей строки.
Хотя библиотека Readline поставляется с установленным по умолчанию набором
привязок клавиш, аналогичному emacs
, возможно использование
другого набора привязок. Любой пользователь может настраивать
программы, которые используют Readline, помещая команды в файл
inputrc в своем домашнем каталоге. Имя этого
файла берется из переменной среды INPUTRC
. Если
эта переменная не установлена, по умолчанию берется файл `~/.inputrc'.
Когда запускается программа, использующая библиотеку Readline, файл инициализации считывается и устанавливаются привязки клавиш.
Кроме того, команда C-x C-r считывает файл инициализации заново, так что изменения, которые вы могли cделать к этому времени, вступают в силу.
Существуют всего несколько конструкций, которые допускаются в файле инициализации Readline. Пустые строки игнорируются. Строки, начинающиеся с `#', являются комментариями. Строки, начинающиеся с `$', обозначают условные конструкции (см. раздел 20.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
\xnnn
"\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', и так далее.