Заставить `Ctrl + W` и `Ctrl + Alt + H` в zsh вести себя так же, как в bash.

Загрузитесь с установочного носителя Windows XP и нажмите R на экране приветствия, чтобы войти в консоль восстановления. Затем используйте команду fixmbr, чтобы перезаписать Grub2 стандартным кодом MBR Windows.

2
22.06.2020, 11:03
2 ответа

Новый ответ

Я понял, что есть более простой (и более настраиваемый )способ сделать это:

zle -N backward-kill-space-word
backward-kill-space-word() {
  zle -f kill
  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' zle.backward-kill-word
}

zle -N backward-kill-bash-word
backward-kill-bash-word() {
  zle -f kill
  WORDCHARS='' zle.backward-kill-word
}

bindkey   '^W' backward-kill-space-word
bindkey '^[^H' backward-kill-bash-word

Кроме того, я выпустил подключаемый модуль под названием zsh-edit, в котором эти привязки встроены в .


Старый ответ

Это делает именно то, что вы хотите, независимо от того, что находится в $WORDCHARS, и делает убитые слова доступными дляyank:

autoload -Uz backward-kill-word-match

bindkey '^W' backward-kill-space-word
zle -N backward-kill-space-word backward-kill-word-match
zstyle :zle:backward-kill-space-word word-style space

bindkey '^[^H' backward-kill-bash-word
zle -N backward-kill-bash-word backward-kill-word-match
zstyle :zle:backward-kill-bash-word word-style bash

autoload -Uz backward-kill-word-matchзагружает функцию backward-kill-word-match. См.http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Widgetsдля получения дополнительной информации.

zle -N backward-kill-bash-word backward-kill-word-matchсоздает новый виджет с именем backward-kill-bash-word, реализация которого будет обеспечиваться функцией backward-kill-word-match. См.http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtinsдля получения дополнительной информации.

zstyle— это общий механизм хранения предпочтений. Первый аргумент (в данном случае:zle:backward-kill-space-word)— это «контекст», который сообщает, в каком пространстве имен их хранить. Это позволяет объявлять разные значения для одного и того же параметра в разных контекстах. Второй аргумент(word-style)— это имя настройки. Третий аргумент — это значение параметра. См.http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Moduleдля получения дополнительной информации.

Итак,

  • учитывая приведенный выше код,

  • при нажатии CtrlW или AltCtrlH ,

  • , затем

    1. zleвызывает backward-kill-word-match.
    2. backward-kill-word-matchизвлекает значение настройки word-styleдля контекста :zle:<name of the invoked widget>.
    3. backward-kill-word-matchназад удаляет "слово" с определением "слова" на основе значения, полученного из настройки word-style.
2
28.04.2021, 23:20

С помощью переменной WORDCHARSможно установить специальные символы, которые считаются частью слова. Это влияет на то, как слова удаляются Ctrl + W:

.
WORDCHARS='~!#$%^&*(){}[]<>?.+;-_/\|=@`'

Однако это также оказывает влияние на Ctrl + Alt + H. Мы хотим, чтобы это поведение применялось только к Ctrl + W. Но есть трюк, который мы можем сделать. Поясню:

Вы можете переназначить комбинации клавиш для различных функций (см.man zshzle). И есть две функции, которые на самом деле ведут себя одинаково:

  • назад -удалить -слово
  • назад -убить -слово

Вы также можете переопределить эти функции с помощью zle -N <func>. Я не совсем уверен, как это работает, но вы получите представление, если прочитаете код, в любом случае, это помогает.

По умолчанию как Ctrl + W, так и Ctrl + Alt + Hсопоставляются с backward-kill-word. Таким образом, мы можем переопределить backward-delete-word, а затем привязать его к Ctrl + W:

.
# Make `Ctrl + W` behave like it does in Bash, deleting words separated by
# spaces. We do this by redefining the `backward-delete-word` function and bind
# that to `Ctrl + W`.
SPACE_WORDCHARS='~!#$%^&*(){}[]<>?.+;-_/\|=@`'
backward-delete-word() WORDCHARS=$SPACE_WORDCHARS zle.$WIDGET
zle -N backward-delete-word
bindkey "^W" backward-delete-word

Да, теперь Ctrl + Wудаляет слова большего размера, чем Ctrl + Alt + H!

Редактировать:

К сожалению, сейчас я обнаруживаю, что этому подходу не хватает некоторых функций, когда вы удаляете слово, оно не загружается в буфер вставки (Ctrl + Y ). Пока не нашел решения..

1
28.04.2021, 23:20

Теги

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