Zsh

使 zsh 中的 Ctrl + WCtrl + Alt + H 與 bash 中的行為相同

  • May 4, 2022

在 bash 中的行為是這樣的:

  • Ctrl+W刪除游標後面的單詞直到下一個空格
  • Ctrl++刪除游標後面的單詞直到下一個分隔符Alt,如, ,等。H``.``,``-``/

在+和++中的行為zsh都與.Ctrl``W``Ctrl``Alt``H``bash

我想要與中相同的行為bash

這會做你想做的事,不管裡面有什麼$WORDCHARS,並使被殺的詞可用於yank

# Create a new widget.
zle -N backward-kill-space-word
backward-kill-space-word() {
 # Inform the line editor that this widget will kill text.
 zle -f kill

 # Set $WORDCHARS for this command only. 
 WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' zle .backward-kill-word
}

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

# Bind the widgets to keys.
bindkey   '^W' backward-kill-space-word
bindkey '^[^H' backward-kill-bash-word

或者,我發布了一個名為的外掛zsh-edit它內置了這些綁定的更複雜版本

WORDCHARS您可以使用變數設置被視為單詞一部分的特殊字元。這會影響單詞的刪除方式Ctrl + W

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

不過也有影響Ctrl + Alt + H。我們希望此行為僅適用於Ctrl + W. 但是我們可以做一個技巧。讓我解釋:

您可以將組合鍵重新綁定到不同的功能(請參閱 參考資料man zshzle)。並且有 2 個函式實際上具有相同的行為:

  • 向後刪除字
  • 反向殺詞

您還可以使用 重新定義這些函式zle -N <func>。我不完全確定它是如何工作的,但是如果您閱讀程式碼,您就會有所了解,無論如何,它確實可以解決問題。

預設情況下,兩者Ctrl + WCtrl + 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)。還沒有找到解決辦法。。

引用自:https://unix.stackexchange.com/questions/572439