如何将zsh配置为使用驼峰式匹配自动完成目录名称?


9

Eclipse和Resharper具有导航文件的好方法。

如果我当前目录中有以下文件夹(或文件)

MyReallyLongName
MyReallyLongAndFunName
MyReallyLongAndNotReallyFunName

在Eclipse中,我可以仅使用大写字母导航到它们。相应地,我希望在zsh中键入:

cd MRLAFN(Tab)(输入)

MyReallyLongAndFunName一步一步进入

如果我现在想使用zsh进行操作,则必须输入 My(Tab)Fun(Tab)(Enter)

Answers:


6

这对我有用:

zstyle ':completion:*' matcher-list 'r:[^A-Z0-9]||[A-Z0-9]=** r:|=*' 

然后,我可以在测试目录中执行此操作:

touch MyReallyLongName MyReallyLongAndFunName MyReallyLongAndNotReallyFunName
ls MRLANRFN<TAB>
ls MyReallyLongAndNotReallyFunName

我从《Zshell用户指南》中的技巧中将其拼凑在一起。


您能说明一下该扩展名(文件,文件夹)的放置位置吗?您可能也有兴趣将其添加到zsh-completions项目中。
JJD 2014年

将其添加到您的〜/ .zshrc
Cody

这与预期的不太一样,用AbcAde AdFg HlAkAdls AA<TAB>完成到Ad,而我希望AbcAde。
arekolek

@arekolek“广告”仅部分完成。如果再次单击TAB(取决于zsh配置),您将看到所有匹配的文件。它应该包括所有三个文件。然后,您可以通过菜单选择或通过输入更多文件名来选择一个来指导完成者。
17:10

@arekolek对不起-我读错了。我不确定您是如何到达那里的。我以为这是部分模棱两可的比赛,但是很难从您的例子中看出。第二个TAB会产生更多结果吗?
phord

2

我通过将文件添加_camel_case到我的个人文件~/.zsh/functions folder(使用$fpath变量中的任何文件夹)来使此文件“很好”地工作,其内容如下:

#autoload

[[ -z "$PREFIX" ]] && return 1

relpath=$(dirname $PREFIX)

[[ -e $relpath ]] || return 1

files=$(ls $relpath)

regex=$(echo $(basename $PREFIX) | sed -e 's/\([A-Z][^A-Z]*\)/\1[^A-Z]+/g')

correctedfiles=($(echo $files | grep -P $regex | sed -e :a -e '$!N;s/\n/ /;ta'))

results=($(for file in $correctedfiles; do echo "$relpath/$file"; done))

compadd -U -f -- $results

然后,将以下行添加到〜/ .zshrc中

zstyle ':completion:*' completer _complete _correct _path_files _camel_case

请注意,这很可能不是一个“好的”解决方案,因为我对zsh的完成系统没有太多的了解(我猜只有很少的人真正拥有),但是它确实可以解决您所描述的问题。


这只是有点工作.. mkdir AaBbCcDd cd ABCD(tab)=> cd ./即。自动完成失败
Rohit Manokaran 2012年
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.