Например:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Я знаю только биты и кусочки, например , обозначения \e
escape и C-
for Ctrl, но что это за цифры ( 1
) и буквы ( Z
)? Каковы ;
, [
и -
знаки для?
Есть только метод проб и ошибок, или есть полный список кодов ключей bash и объяснение их синтаксиса?
bind -p
.Ответы:
Это последовательности символов, отправленные вашим терминалом при нажатии данной клавиши. Ничего общего с bash или readline как таковым, но вы захотите узнать, какую последовательность символов посылает данная клавиша или комбинация клавиш, если вы хотите сконфигурировать
readline
что-то сделать при нажатии данной клавиши.Когда вы нажимаете Aклавишу, обычно терминалы отправляют
a
символ (0x61). Если вы нажмете<Ctrl-I>
или<Tab>
, то обычно отправляете^I
символ, также известный какTAB
или\t
(0x9). Большинство функциональных и навигационных клавиш обычно посылают последовательность символов, которая начинается с^[
(control- [), также известного какESC
или\e
(0x1b, 033 восьмеричное), но точная последовательность изменяется от терминала к терминалу.Лучший способ узнать, что посылает клавиша или комбинация клавиш для вашего терминала, - запустить
sed -n l
и набрать его, а затем Enterна клавиатуре. Тогда вы увидите что-то вроде:Первая строка вызвана локальным терминалом,
echo
выполняемым терминальным устройством (это может быть ненадежно, поскольку настройки терминального устройства могут повлиять на это).Вторая строка выводится
sed
.$
Не должны быть включены, это только , чтобы показать вам , где конец линии.Выше это означает , что Ctrl-Up(который я нажал) отправить 6 символов
ESC
,[
,1
,;
,5
иA
(0x1b 0x5b 0x31 0x3B 0x35 0x41)База
terminfo
данных записывает количество последовательностей для ряда общих ключей для ряда терминалов (на основе$TERM
значения).Например:
Скажет вам, какая последовательность перехода отправляется
rxvt
после нажатия Deleteклавиши.Вы можете посмотреть, какой ключ соответствует данной последовательности с вашим текущим терминалом
infocmp
(здесь предполагается, чтоncurses
infocmp):Комбинации клавиш, например Ctrl-Up, не имеют соответствующих записей в
terminfo
базе данных, поэтому, чтобы узнать, что они отправляют, либо прочитайте исходный код или документацию для соответствующего терминала, либо попробуйте это с помощьюsed -n l
метода, описанного выше.источник
\e-1\C-i
закладка в обратном направлении, такcontrol
иi
вставляет вкладку иescape
затем-1
говорит Баш , чтобы сделать это в обратном направлении один раз (я вытаращил это и нашел некоторые вещи оdigit-arguments
).$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
, как ваш терминал отправляет\e[OD
(kcub1
) и послеtput rmkx
,\e[D
(cub1
тот же код, что и последовательность, которая перемещает курсор влево, так что эхо этих клавиш действительно перемещает курсор. Попробуйте,stty -echoctl; tput rmkx; sleep inf
и вы увидите, клавиши со стрелками перемещают курсор, когда не в режиме клавиатуры ).Он предоставляется через библиотеку gnu readline. Вы должны заглянуть в man 3 readline, чтобы узнать его описание.
Похоже, вам также нужна информация о том, что означает код escspe liks
\[A
. Вы можете найти эту информацию в википедии ANSI esacape code article.источник
\[A
находится в таблице «CSI коды» в строке: «CSI n A»[Z
,[1;5C
или-1
?Эти коды поступают из одного источника? Последний выглядит как привязка readline GNU. Это то, что пользователь отправляет на bash (см. Ответ Rush). Первые два, однако, больше похожи на последовательности управления терминалами (хотя первая будет неправильной). Это то, что bash или другая программа отправляет обратно в эмулятор терминала, чтобы контролировать перемещения курсора, цвета текста и тому подобное.
источник
Я нашел самый простой способ проверить, какая управляющая последовательность генерируется клавишей или комбинацией клавиш, - нажать Ctrl+ vв терминале, а затем нажать клавишу / комбинацию, о которой вы хотите знать.
Вы получите подобную последовательность,
^[Oa
и вам придется переводить^[
в\e
или\033
или\x1b
или любое другое представление, которое ваша система привязки клавиш ожидает для escape-символа.Он начинался как именованная функция Emacs
quoted-insert
и, поскольку привязки клавиш по умолчанию для Bash и Zsh имитируют Emacs, они также копировали его.Bash получает его через библиотеку ввода GNU Readline, которую
import rlcompleter
также используют другие вещи, такие как улучшения Python .Вот описание из руководства Readline :
Это должно работать во всем, основанном на GNU Readline.
Что касается Zsh, который использует свою собственную альтернативу с именем ZLE, то
C-q
, как ни странно, он учитывает исходную привязку Emacs только в режиме Vi, ноC-v
все еще работает в режиме ввода по умолчанию, подобном Emacs. (Искатьquoted-insert
вzshzle
или zshall` страниц Справочника и thesecond пары результатов следует перечислить keybinds по умолчанию.)Для мнемоники я советую думать о Ctrl+ vкак об этом.
источник