Readline (Русский)

From ArchWiki
Jump to: navigation, search

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Readline - это библиотека, созданная GNU Project, используемая Bash и другими программами с интерфейсом CLI для того, чтобы взаимодействовать с командной строкой. Перед прочтением этой статьи пожалуйста ознакомьтесь с домашней страницей проекта, т.к. здесь размещена только общая информация.

Установка

Пакет 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.

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

Tango-preferences-desktop-locale.pngЭта статья или раздел нуждается в переводеTango-preferences-desktop-locale.png

Примечания: пожалуйста, используйте первый аргумент шаблона для указания дополнительной информации. (обсуждение: Talk:Readline (Русский)#)

Вы можете установить различную форму курсора для каждого мода, используя "\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

Поиск по истории

Merge-arrows-2.pngThis article or section is a candidate for merging with Bash.Merge-arrows-2.png

Notes: не о Readline (Discuss in Talk:Readline (Русский)#)

Избежание повторов

Если вы несколько раз повторяете ввод одной и той же команды, она запишется в историю ввода несколько раз. Чтобы избежать этого, добавьте в ~/.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