Как сопоставить Alt Backspace с какой-либо командой в.inputrc?

Вksh93:

PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _

Если вы хотите, чтобы он также заменял $HOMEна ~, нужно что-то более противное:

PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _

Все это также должно работать в bash, хотя bashимеет свои собственные побеги (, например. \hдля${HOSTNAME%%.*})и механизм сокращения пути (дляPROMPT_DIRTRIM).

Кроме того, более неприятный вариант будет действительно неприятным, потому что bash, в отличие от ksh93, будет fork()отдельным процессом для каждой $(...; printf...)подстановки команд, даже если он содержит только встроенные команды. Это также верно для производных оболочек pdksh, таких как mksh.


zshимеет быстрые побеги, очень похожие, но не идентичныеtcsh:

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _

Примечание:

Переменная $HOSTNAMEне установлена ​​по умолчанию в ksh93; вместо этого вы можете использовать встроенный uname(после включения его с помощью PATH=/opt/ast/bin:$PATH; путь /opt/ast/binможет не существовать):

PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '

В отличие от escape-последовательности \hв bash или escape-последовательности %mв zshили tcsh, этот будет отслеживать изменения имени хоста.

3
06.10.2020, 14:13
1 ответ

Для клавиш, которые обычно отправляют один символ, Alt+клавиша обычно отправляет escape-символ, за которым следует этот символ. В частности, Alt + Backspace отправляет \e\177, где \e— escape-символ (, визуально представленный как ^[), а \177— символ возврата (. визуально представлено как ^?— точнее, это символ удаления, но в этом ответе я буду использовать название «возврат» ). (В зависимости от вашей конфигурации символ возврата может быть вместо \b, визуально представленным как ^H.)

При нажатии Ctrl + VAlt + Backspace символ Ctrl+V сообщает терминалу (или приложению, в зависимости в терминальном режиме )для буквальной интерпретации следующего символа, поэтому вставляется escape-символ, который визуально представлен как ^[.Затем терминалу нужно прочитать еще один символ — клавишу возврата, которая стирает только что введенный escape-символ.

Чтобы увидеть полную строку символов, отправленную клавишей, вы можете использовать эту команду и ввести клавишу в течение 2 секунд:

stty raw; sleep 2; echo; stty cooked

stty rawпереключает терминал в необработанный режим, в котором управляющие символы просто вставляются, как -, а stty cookedпереключает его обратно. На практике Alt + Backspace — один из очень немногих случаев, когда это необходимо, хотя :большинство клавишных аккордов отправляют только один управляющий символ или escape-символ, за которым следует печатаемый персонажи.

В .inputrc, чтобы охватить оба распространенных случая (с символом удаления или возврата):

"\e\177": backward-kill-word
"\e\b": backward-kill-word

Обратите внимание, что управляющая последовательность зависит от вашего терминала. Некоторые терминалы не отправляют escape-последовательность для некоторых клавишных аккордов или отправляют нестандартные escape-последовательности -, возможно, одинаковые для нескольких клавишных аккордов. Но если вы на короткое время видите ^[при нажатии Ctrl + VAlt + Backspace , это показывает, что ваш терминал делает стандартную вещь для этого определенный ключевой аккорд.

4
18.03.2021, 22:59

Теги

Похожие вопросы