zsh shell是否存在模糊匹配模式?


22

我最近爱上了高效的文本完成系统。我最喜欢的一种完成是所谓的模糊完成。在这种模式下,程序将仅基于可以在文件名或路径“几乎任何地方”(几乎)出现的几个字符来完成用户的输入。至少对于以下程序,存在此功能:

文本编辑器中此模式的用法示例:

用户正在尝试完成单词longWordNameThat他们DontWantToWriteByHand,他们可以通过键入例如第一个字母和一些大写字母来完成此操作。因此,键入lwnt可以完成整个单词。

我的问题是:是否可以在zsh shell中使用某种模式或类似的东西?

Answers:


27

我有这个 .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的完成引擎。它不具备升华文字的超级智能,但可以,它将完成lwnt -> longWordNameThatTheyDontWantToWriteByHand


1
我刚刚发现了一个错误:鉴于您在空格☹Ie stack install && vlc ~/Music/erf不完整到之后输入任何内容,因此不适用于带空格的文件名stack install && vlc ~/Music/FGFC820\ -\ Perfect\ War.mp3
Hi-Angel

5
@ Hi-Angel嘿,谢谢你碰碰到这个。我'r:|?=** m:{a-z\-}={A-Z\_}'现在实际使用了,这很简单,并且不会遇到您描述的问题。
PythonNut 2016年

那很棒!也许您可以使用此代码制作一个插件。只是为了更容易找到。
朱利安__

15

出我的项目fzf

这是一种用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>

4
默认情况下,如何使它的选项卡完整?无需键入**
theonlygusti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.