Readline (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Readline. Дата последней синхронизации: 11 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Readline — библиотека GNU Project, которую Bash и другие программы с CLI-интерфейсом используют для взаимодействия с командной строкой. Подробнее см. readline(3).

Установка

Вероятнее всего, пакет readline уже установлен как зависимость Bash.

Режим редактирования

По умолчанию Readline использует для взаимодействия с командной строкой комбинации клавиш в стиле Emacs. Чтобы выбрать стиль vi, добавьте следующую строку в файл ~/.inputrc:

~/.inputrc
set editing-mode vi

Если вы хотите задать этот режим только для Bash, отредактируйте ~/.bashrc:

~/.bashrc
set -o vi

Индикатор режима в приглашении

Редактирование в стиле vi имеет два режима: командный и вставки. Настроить отображение индикатора режима можно следующей опцией:

~/.inputrc
set show-mode-in-prompt on

Теперь в вашем приглашении будет отображаться строка-индикатор (по умолчанию — (cmd)/(ins)), которую можно модифицировать переменными vi-ins-mode-string и vi-cmd-mode-string.

Разные формы курсора для режимов

Форма курсора выбирается с помощью escape-последовательностей "\1 .. \2":

~/.inputrc
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2

Здесь для командного режима выбран курсор-блок, а для режима вставки — вертикальная линия. Чтобы это работало, необходимо включить индикатор режима редактирования (см. #Индикатор режима в приглашении).

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

~/.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

Подробнее см. документацию о программном курсоре для VGA.

Быстрое перемещение по словам

Xterm поддерживает перемещение по словам клавишами Ctrl+Left и Ctrl+Right по умолчанию. Чтобы настроить этот эффект в других эмуляторах, выберите подходящие коды терминала и присвойте их переменным backward-word и forward-word в файле ~/.inputrc.

Например, для urxvt:

~/.inputrc
"\e[1;5D": backward-word
"\e[1;5C": forward-word

История команд

Обычно нажатие клавиши "стрелка вверх" выводит последнюю команду вне зависимости от того, что было (частично) введено на данный момент. Более практично будет искать только те прошлые команды, которые совпадают с текущим вводом.

Например, пользователь вводил следующие команды:

  • 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
# для командного режима vi
"\e[A": history-search-backward
"\e[B": history-search-forward
j: history-search-forward
k: history-search-backward
set keymap vi-insert
# для режима вставки vi
"\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/XOFF). Для активации forward-search-history либо отключите управление потоком выполнения:

$ stty -ixon

либо назначьте в inputrc другую комбинацию. Например, можно использовать Alt+S:

"\es": forward-search-history

Быстрое завершение

При автодополнении (tab completion) одиночное нажатие клавиши tab пытается дополнить команду. Если частичное дополнение невозможно, двукратное нажатие покажет все возможные завершения.

Можно изменить двойное нажатие на одиночное:

~/.inputrc
set show-all-if-unmodified on

Либо же можно настроить, чтобы такое одиночное нажатие выполняло оба действия: дополнение слова и показ всех возможных завершений, если полное дополнение невозможно:

~/.inputrc
set show-all-if-ambiguous on

Цветное завершение

Включить цветное отображение имён файлов можно опцией colored-stats. При желании можно настроить подсветку одинакового префикса в списке возможных завершений опцией colored-completion-prefix. Например:

~/.inputrc
# Цвет файла в зависимости от типа
# Может вызвать мерцание текста в некоторых терминалах (например, xterm)
set colored-stats On
# Добавление символа для обозначения типа
set visible-stats On
# Пометить каталоги-ссылки
set mark-symlinked-directories On
# Цветовое выделение общего префикса
set colored-completion-prefix On
# Цветовое выделение общего префикса и завершение с помощью меню
set menu-complete-display-prefix On

Макросы

Readline позволяет привязывать клавиатурные макросы на клавиши. Например, выполните эту команду в Bash:

bind '"\ew": "\C-e # macro"'

или добавьте строку внутри одиночных кавычек в inputrc:

"\ew": "\C-e # macro"

Теперь введите любую строку и нажмите Alt+W. Readline будет действовать как при нажатии Ctrl+E (end-of-line) с добавлением в конце строки " # macro".

Макросы позволяют автоматизировать часто используемые идиомы. Например, добавление "| less" к строке и "нажатие" Ctrl+M (эквивалент Enter) по комбинации Ctrl+Alt+L:

"\e\C-l": "\C-e | less\C-m"

Добавление префикса 'yes |' по нажатию Ctrl+Alt+Y, в результате чего программа получит утвердительный ответ на любой вопрос "да/нет":

"\e\C-y": "\C-ayes | \C-m"

Добавление префикса su -c '' по нажатию Alt+S:

"\es": "\C-a su -c '\C-e'\C-m"

Добавление префикса sudo по нажатию Alt+S. Несколько безопаснее, чем предыдущий пример, потому что не происходит нажатия Enter:

"\es": "\C-asudo \C-e"

Наконец, быстрый перевод программы в фоновый режим выполнения с удалением всего вывода по комбинации Ctrl+Alt+B.

"\e\C-b": "\C-e > /dev/null 2>&1 &\C-m"

Отключение отображения клавиши control

Readline выдаёт в терминал строку ^C при нажатия Ctrl+C. Чтобы это отключить, просто добавьте следующие строки в ~/.inputrc:

set echo-control-characters off

Смотрите также