Как отключить и переназначить C-w в Bash?

Я хотел бы нанести Ctrl - w на kill-region в Bash 4.2. По умолчанию этот ключ привязан к unix-word-rubout (удалять слово назад). Согласно руководству, переназначение должно быть возможным с помощью команды bind, которая имеет параметры

-u функция     Отвяжите все ключи, привязанные к названной функции.

-r keyseq     Удалите все текущие привязки для keyseq.

Я пробовал bind -r "\C-w" и bind -u unix-word-rubout, но ключ не был отменен, и, как показывает bind -P | grep unix-word-rubout, в отображении изменений не было.

Я немного играл с bind, и я могу развязать другие встроенные клавиши, но не Ctrl - w.

Ответ 1

Ctrl - w привязан в stty к werase. Сначала вам нужно отпереть его.

stty werase undef
bind '"\C-w":kill-region'

Ответ 2

По умолчанию readline пытается связать управляющие символы, обработанные специально драйвером терминала ядра, с их эквивалентами readline. (Чтобы узнать, как настроен ваш терминал, запустите

stty -a

.) У вашего терминала предположительно есть Ctrl-w, установленный на werase, поэтому bash привязывает его к unix-word-rubout. Это связывание имеет приоритет над любыми ключевыми словами, указанными в ~/.inputrc.

Чтобы избежать этого сопоставления, вам нужно установить переменную readline bind-tty-special-chars в off в файле ~/.inputrc:

set bind-tty-special-chars off