我最近爱上了高效的文本补全系统。我最喜欢的补全类型之一是所谓的模糊补全。这是一种程序将仅根据文件名或路径中“几乎”出现的几个字符来完成用户输入的模式。至少对于以下程序来说,此功能是存在的:
- 文本伴侣
- Vim Command-T 插件https://github.com/wincent/Command-T
- Vim 补全系统https://github.com/Shougo/neocomplcache
- 各种现代 IDE
文本编辑器中此模式的使用示例:
用户尝试完成单词 longWordNameThatTheyDontWantToWriteByHand,他们可以通过输入首字母和一些大写字母来完成。因此输入淋巴细胞可以完成到整个单词。
我的问题是:是否有一种模式或者类似的东西可以与 zsh shell 一起使用?
答案1
我有这个.zshrc
# 0 -- vanilla completion (abc => abc)
# 1 -- smart case completion (abc => Abc)
# 2 -- word flex completion (abc => A-big-Car)
# 3 -- full flex completion (abc => ABraCadabra)
zstyle ':completion:*' matcher-list '' \
'm:{a-z\-}={A-Z\_}' \
'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \
'r:|?=** m:{a-z\-}={A-Z\_}'
它为 的完成引擎添加了完全模糊匹配zsh
。它缺乏 Sublime Text 的超级智能,但是,是的,它可以完成lwnt -> longWordNameThatTheyDontWantToWriteByHand
。
答案2
查看我的项目陣陣。
它是一个用 Golang 编写的通用模糊查找器,可用于任何事物列表:文件、进程、命令历史记录、git 分支等。
对于 zsh,它提供以下键绑定:
CTRL-T
- 将选定的文件路径粘贴到命令行中CTRL-R
- 将历史记录中选定的命令粘贴到命令行中ALT-C
- cd 进入选定的目录
和模糊完成模式:
# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>
# Files under parent directory
vim ../**<TAB>
# Files under parent directory that match `fzf`
vim ../fzf**<TAB>
# Files under your home directory
vim ~/**<TAB>
# Directories under current directory (single-selection)
cd **<TAB>
# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>
# Process IDs. Can select multiple processes with TAB or Shift-TAB
kill -9 <TAB>
# Host names
ssh **<TAB>
telnet **<TAB>
# Environment variables / aliases
unset **<TAB>
export **<TAB>
unalias **<TAB>