如何配置Zsh实现Bash式的词中自动补全功能?
Zsh 配置为 Bash 式单词中间补全
要让Zsh实现和Bash一致的单词中间补全行为——基于光标前文本生成补全建议,选中后完整替换当前单词(无残留后缀),可以按以下步骤配置:
1. 开启基础补全选项
首先在~/.zshrc中添加基础配置,允许在单词中间触发补全:
setopt COMPLETE_IN_WORD
2. 自定义补全前缀计算逻辑
Zsh默认会用整个单词作为补全前缀,我们需要覆盖这个逻辑,让它仅以光标前的文本作为前缀。在~/.zshrc中添加以下代码:
autoload -Uz compinit && compinit # 自定义前缀计算函数,仅取光标到单词开头的文本作为补全前缀 _compute_prefix() { local orig_cursor=$CURSOR # 从光标位置向前定位到单词起始处 while (( orig_cursor > 1 )) && [[ "${BUFFER[orig_cursor-1]}" != [[:space:]] ]]; do (( orig_cursor-- )) done # 设置前缀为光标前的单词部分,后缀为光标后的剩余字符 PREFIX="${BUFFER[orig_cursor,CURSOR]}" SUFFIX="${BUFFER[CURSOR+1,-1]}" } # 将自定义前缀计算应用到所有补全场景 zstyle ':completion:*' compute-prefix _compute_prefix
3. 确保补全后替换整个单词
为了避免补全后残留原单词的后缀,还需要配置补全器的行为,让它直接替换当前单词的全部内容:
# 配置补全器优先使用前缀匹配,并替换整个单词 zstyle ':completion:*' completer _complete _ignored zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
验证配置
保存~/.zshrc后,执行以下命令使配置生效:
source ~/.zshrc
现在测试单词中间补全:输入fooedit并将光标移到foo和edit之间,按下Tab键,Zsh会基于foo给出补全建议,选中后会直接替换成匹配项(比如foobar),不会残留edit后缀。
内容的提问来源于stack exchange,提问作者pedrosaurio
相关产品推荐
相关产品推荐

