Readline (Русский)
Readline - это библиотека, созданная GNU Project, используемая Bash и другими программами с интерфейсом CLI для того, чтобы взаимодействовать с командной строкой. Перед прочтением этой статьи пожалуйста ознакомьтесь с домашней страницей проекта, т.к. здесь размещена только общая информация.
Contents
Установка
Пакет readline, скорее всего, уже установлен как зависимость Bash
Редактирование в командной строке
По умолчанию Readline использует стиль сокращений Emacs для взаимодействия с командной строкой. Однако стиль редактирования vi также поддерживается. Для включения сочетаний клавиш в стиле vi:
~/.inputrc
set editing-mode vi
Чтобы включить такой режим только для Bash:
~/.bashrc
set -o vi
Индикатор режима при вводе
Имеется два режима редактирования vi - командый и вставочный. Вы можете включить отображение текущего режима:
~/.inputrc
set show-mode-in-prompt on
Команда выше отображает строчку в вводе (по умолчанию (cmd)
/(ins)
). Ее можно отредактировать посредством переменных vi-ins-mode-string
и vi-cmd-mode-string
.
Различные формы курсора для каждого из режимов
Вы можете установить различную форму курсора для каждого мода, используя "\1 .. \2" escapes:
~/.inputrc
set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2
This will set a block shaped cursor when in command mode and a pipe cursor when in insert mode.
The Virtual Console uses different escape codes, so you should check first which term is being used:
~/.inputrc
$if term=linux set vi-ins-mode-string \1\e[?0c\2 set vi-cmd-mode-string \1\e[?8c\2 $else set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2 $endif
See software cursor for VGA for further details.
История команд
Обычно при нажатии кнопки "стрелка вверх", в приглашение командной строки подставляется последняя введенная команда вне зависимости от того, что набрал пользователь в момент нажатия. Однако, некоторые пользователи предпочитают, чтобы нажатие кнопки "стрелка вверх" вызывало список только тех команд, которые подходят к тому, что они набрали в момент нажатия.
Например, если пользователь вводил следующие команды:
ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig
who
mount
man mount
В данной ситуации, набрав ls
и нажав клавишу "стрелка вверх", введенный текст будет заменен на man mount
, то есть на последнюю выполненную команду. Если включен поиск по истории, будут показаны только последние команды, начинающиеся на ls
(текущий введенный текст), в нашем случае - ls /usr/src/linux-2.6.15-ARCH/kernel/power/Kconfig
.
Вы можете включить поиск по истории, добавив следующие строки в /etc/inputrc
или ~/.inputrc
:
"\e[A":history-search-backward "\e[B":history-search-forward
Если вы пользуетесь режимом vi, добавьте следующие строки в ~/.inputrc
(из этого поста):
set editing-mode vi $if mode=vi set keymap vi-command # these are for vi-command mode "\e[A": history-search-backward "\e[B": history-search-forward set keymap vi-insert # these are for vi-insert mode "\e[A": history-search-backward "\e[B": history-search-forward $endif
Также рекомендуется добавить следующую строка в начало файла ~/.inputrc
, если вы хотите избежать странных вещей вроде этой:
$include /etc/inputrc
В качестве альтернативы можно использовать реверсивную историю поиска путем нажатия Ctrl+R
. Реверсивная история поиска основана не на предыдущем вводе, а вместо этого ищет в буфере истории команд те, которые похожи на текущий ввод. Повторное нажатие Ctrl+R
в этом режиме отобразит предыдущую строку из буфера, которая подходит под текущее условие поиска, а нажатие Ctrl+G
отменит поиск и вернет текущую введенную строку. Таким образом, чтобы выполнить поиск среди ранее введенных команд mount
, нажмите Ctrl+R
, введите 'mount' и продолжайте нажимать Ctrl+R
до тех пор, пока не отобразится нужная вам строка.
Обратный эквивалент этого режима называется forward-search-history и по умолчанию привязан к Ctrl+S
. Имейте в виду, что большинство эмуляторов терминала переназначает комбинацию Ctrl+S
на приостановку текущей задачи до нажатия Ctrl+Q
(так называемый контроль потока XON/XOF). Для активации forward-search-history/деактивации контроля потока выполните:
$ stty -ixon
либо переназначьте комбинацию клавиш в inputrc
, например, на Alt+S
, которая ничем не занята по умолчанию:
"\es":forward-search-history
Поиск по истории
Избежание повторов
Если вы несколько раз повторяете ввод одной и той же команды, она запишется в историю ввода несколько раз. Чтобы избежать этого, добавьте в ~/.bashrc
:
export HISTCONTROL=ignoredups
Удаление пробелов в начале строки
Чтобы отключить запись в историю команд строк, начинающихся с пробелов, добавьте в ~/.bashrc
:
export HISTCONTROL=ignorespace
Если ~/.bashrc
уже содержит
export HISTCONTROL=ignoredups
замените строку на:
export HISTCONTROL=ignoreboth
Макросы
В Readline также реализована поддержка назначения клавиш на клавиатурные макросы. Вот простой пример, запустите эту команду в Bash:
bind '"\ew":"\C-e # macro"'
Или добавьте ее часть в inputrc:
"\ew":"\C-e # macro"
Теперь наберите команду и нажмите Alt
+W
. Readline отреагирует на это, как если бы была нажата комбинация Ctrl+E
(end-of-line, конец строки).
Используйте любые сочетания клавиш с макросами Readline для автоматизации часто используемых задач. Например, такой макрос при нажатии Ctrl+Alt+L
добавляет к строке " | less" и запускает команду (Ctrl+M
is equivalent to Enter
):
"\e\C-l":"\C-e | less\C-m"
Следующий макрос добавляет в начало команды "yes | " при нажатии Ctrl+Alt+Y
для того, чтобы согласиться на любой вопрос "yes/no", задаваемый командой:
"\e\C-y":"\C-ayes | \C-m"
Этот пример разрывает строку на su -c ''
, если была нажата комбинация Alt+S
:
"\es":"\C-a su -c '\C-e'\C-m"
Следующий пример добавляет в начало команды sudo
при нажатии Alt+S
. Она безопаснее, т.к. не передает нажатие клавиши {{ic|Enter}.
"\es":"\C-asudo \C-e"
В последнем примере показано, как быстро отправить команду на выполнение в бэкграунд используя сочетание Ctrl+Alt+B
и игнорируя весь ее вывод:
"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"
Советы и хитрости
Отключение ^C
После обновления readline терминал выводит на экран ^C
после нажатия Ctrl+C
. Если вы хотите отключить это, просто добавьте следующую строку в ~/.inputrc
:
set echo-control-characters off