Вопрос или проблема
Когда я подключаюсь к своему серверу Debian Wheezy Beta 4 с помощью PuTTY 0.62 на Windows 7, у меня возникает проблема. Моя оболочка для входа – Zsh, и она настроена на обработку ALT + DEL для действия delete-word
(удаляет одно слово справа от курсора). Строка в конфигурации выглядит так:
bindkey -e "\e[3;3~" kill-word
Привязка работает нормально, когда я подключаюсь через команду ssh
из gnome-terminal
. Но когда я подключаюсь через PuTTY, это действие не выполняется. Вместо этого на консоль выводится [3~
. Насколько я вижу, это неэкранированная последовательность для клавиши DEL в xterm
. Некоторое время я думал, что PuTTY просто игнорирует модификатор ALT и отправляет только DEL, но если бы это было так, действие, связанное с DEL, было бы выполнено так, как если бы я нажал только эту клавишу.
Так что, я полагаю, PuTTY использует какую-то последовательность для комбинации клавиш, о которой я не знаю, и которая приводит к тому, что на экране появляется [3~
. Как я могу узнать, какую последовательность отправляет PuTTY, чтобы настроить Zsh на правильную обработку этого?
Обновление: Похоже, что PuTTY должно игнорировать все нажатия клавиш с модификатором ALT в его текущей реализации. Вот выдержка из исходного кода файла TERMINAL.C
, которая удаляет флаг ALT из переменной модификаторов:
/*
* Alt используется только для Alt+клавиша на цифровой клавиатуре, что пока не поддерживается, так что
* игнорируйте это.
*/
modifiers &= ~PKM_ALT;
Это не объясняет мне, почему нажатие ALT + DEL не имеет такого же эффекта, как нажатие только DEL. Также это не объясняет, почему стандартная комбинация клавиш для действия kill-word
в Zsh (ALT + D) работает хорошо.
Простой трюк, чтобы получить эти последовательности – запустить cat
на удаленном хосте. Таким образом, я получаю ^[[3~
для DEL в одиночку, но ^[^[[3~
с ALT + DEL. (PuTTY 0.62 на W7/64)
Так что, вероятно,
bindkey -e "\e\e[3~" kill-word
сделает то, что вам нужно.
Ответ или решение
Когда вы используете PuTTY для подключения к серверу Debian Wheezy Beta 4 и пытаетесь настроить комбинацию клавиш ALT + DEL для выполнения действия delete-word
в Zsh, вы сталкиваетесь с проблемой обработки последовательностей клавиш. Давайте рассмотрим, какую последовательность отправляет PuTTY для комбинации ALT + DEL, и как правильно настроить Zsh для этой комбинации.
Проблема с последовательностями клавиш
Как вы заметили, при нажатии комбинации ALT + DEL PuTTY не обрабатывает клавишу ALT так, как это делает gnome-terminal. Вместо этого у вас выводится последовательность [3~
, которая соответствует нажатию только DEL без учета модификатора ALT.
Анализ поведения PuTTY
В коде PuTTY указано, что модификатор ALT игнорируется в текущей реализации. Это объясняет, почему нажатие ALT + DEL не вызывает ожидаемого вами поведения. Однако вопрос остается относительно того, почему эффект аналогичен простому нажатию DEL, так как вы и отмечали, как это было продемонстрировано при использовании команды cat
.
Проверка последовательностей
При запуске команды cat
и нажатии клавиш вы получили следующие результаты:
^[[3~
– для нажатия просто DEL^[^[[3~
– для комбинации ALT + DEL
Эти результаты указывают на то, что PuTTY действительно отправляет специальную последовательность, включающую промежуточный байт ^[
(который эквивалентен ESC) перед последовательностью управления клавиатурой.
Настройка Zsh
Для того чтобы настроить Zsh на правильную обработку комбинации ALT + DEL, вы можете использовать следующую привязку клавиш:
bindkey -e "\e\e[3~" kill-word
Здесь:
\e
– это эквивалент ESC.\e[3~
– это последовательность, отправляемая при нажатии только DEL.
Таким образом, добавив еще один \e
, вы получаете желаемый эффект, и Zsh сможет правильно интерпретировать нажатие комбинации ALT + DEL как kill-word
.
Заключение
Эта настройка позволит вам использовать комбинацию ALT + DEL для удаления слова вправо в Zsh во время подключения через PuTTY. Это решение эффективно, так как оно позволяет учесть особенности работы PuTTY с модификаторами клавиш. Чтобы избежать подобных проблем в будущем, полезно будет всегда проверять последовательности клавиш, отправляемые вашей терминальной программой, и экспериментировать с привязками в оболочке.
Если у вас возникнут дальнейшие вопросы или проблемы с настройками, не стесняйтесь обратиться за дополнительной помощью.