如何在zsh Prezto的VI模式中取消补全?替代emacs模式Ctrl+_功能
在Zsh的VI模式下实现补全撤销功能
要解决你在Zsh VI模式下无法用Ctrl + _撤销补全的问题,我们可以通过自定义ZLE(Zsh Line Editor)的键映射来实现,分插入模式和普通模式两种情况配置:
1. 插入模式(Vi Insert Mode)下的配置
在插入模式下,默认Ctrl + _没有绑定到撤销命令,我们需要把它绑定到ZLE的undo命令——这个命令和Emacs模式下的撤销行为一致,能精准撤销最近的补全操作。
在你的~/.zshrc中添加以下配置:
# 为VI插入模式绑定Ctrl+_到撤销命令 bindkey -M viins '^_' undo
2. 普通模式(Vi Command Mode)下的配置
普通模式下默认的u键绑定的是vi-undo命令,这个命令的撤销粒度是整个行级别的修改,所以会出现你说的“删除整行”的情况。
如果你想保留u的默认行为,同时用Ctrl + _来撤销补全,可以添加以下配置:
# 为VI普通模式绑定Ctrl+_到撤销命令 bindkey -M vicmd '^_' undo
如果你更习惯用u来撤销补全(而非整行撤销),也可以把u重新绑定到undo命令:
# 替换VI普通模式下u的默认行为为细粒度撤销 bindkey -M vicmd 'u' undo
配置生效
添加完配置后,执行以下命令让修改立即生效:
source ~/.zshrc
原理说明
Zsh的Emacs模式和VI模式使用不同的键映射表:
- Emacs模式下
Ctrl + _默认绑定到undo命令,它会按操作顺序逐一撤销最近的修改(包括补全)。 - VI模式下默认的撤销命令是
vi-undo,它的行为更接近Vim的原生撤销,粒度更大,会把补全后的整行修改当成一个操作来撤销。而undo命令则保持了Emacs模式下的细粒度撤销特性,正好符合你需要的撤销补全的需求。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

