Readline (Русский)
Readline - это библиотека, созданная GNU Project, используемая Bash и другими программами с интерфейсом CLI для того, чтобы взаимодействовать с командной строкой. Перед прочтением этой статьи пожалуйста ознакомьтесь с домашней страницей проекта, т.к. здесь размещена только общая информация.
Contents
Редактирование в командной строке
По умолчанию Readline использует стиль сокращений Emacs для взаимодействия с командной строкой. Однако стиль редактирования vi также поддерживается. Так или иначе, библиотека предлагает огромный набор клавиатурных сокращений для редактирования вводимых данных без использования клавиш управления курсором.
Если вы являетесь пользователем vi или vim, возможно, вы захотите добавить следующую строку в ~/.inputrc
для включения сочетаний клавиш в стиле vi:
set editing-mode vi
Другой способ включить vi-сочетания клавиш - дописать следующую строку в ~/.bashrc
:
set -o vi
Полезная информация по каждому стилю сокращений: vi-стиль; emacs-стиль.
История команд
Обычно при нажатии кнопки "стрелка вверх", в приглашение командной строки подставляется последняя введенная команда вне зависимости от того, что набрал пользователь в момент нажатия. Однако, некоторые пользователи предпочитают, чтобы нажатие кнопки "стрелка вверх" вызывало список только тех команд, которые подходят к тому, что они набрали в момент нажатия.
Например, если пользователь вводил следующие команды:
-
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