Readline (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
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
по умолчанию
. Чтобы настроить этот эффект в других эмуляторах, выберите подходящие
коды терминала
[
устаревшая ссылка
2025-08-16 ⓘ]
и присвойте их переменным
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
Смотрите также
Редактирование в режиме vi
Редактирование в режиме emacs