2011-03-23 130 views
3

嘿,我试图让zsh运行一个git命令,并使用输出生成自动完成的可能性。使用命令输出为zsh生成自动完成命令

我试图运行的命令是

git log -n 2 --pretty=format:"'%h %an'" 

而且这里是我使用的代码:

local lines words 

lines=(${(f)$(git log -n 2 --pretty=format:"'%h %an'")}) 
words=${(f)$(_call_program foobar git log -n 2 --pretty=format:"%h")} 

echo "Length of lines is " ${#lines[@]} " value is " ${lines} 
echo "Length of words is " ${#words[@]} " value is " ${words} 

compadd -d lines -a -- words 

这并不在所有的工作...它认为words是一个单独的元素,行根本没有正确打印。

但是,当我尝试手动设置字符串数组时,它一切正常。

local lines words 

lines=('one two' 'three') 
words=('one two' 'three') 

echo "Length of lines is " ${#lines[@]} " value is " ${lines} 
echo "Length of words is " ${#words[@]} " value is " ${words} 

compadd -d lines -a -- words 
+0

这是'compedd'中的文字'words'而不是''$ words [@]“'​​'吗? – geekosaur 2011-03-23 07:37:27

+0

@geekosaur是的。 '-a'选项使'compadd'查找指定的数组。而''words [@]“'​​是一个bash代码,尽管它可能在zsh中工作,因为zsh开发者关心与bash的兼容性,理智的zsh开发者只会写'$ words'而不是那个(它工作正常,不管数组中的符号是什么)。 – ZyX 2011-03-23 15:57:51

回答

3

要强制的话是一个数组,你应该使用

words=(${(f)...}) 

set -A words ${(f)...} 

。如果您只使用words=${(f)...},您将始终获得一个值。顺便说一句,为什么当你在编写lines定义时,你在${(f)...}左右加了括号,但还没有为words做过呢?

此外,还有一件事值得关注:${(f)$(...)}应替换为${(f)"$(...)"}。这里有一些黑魔法:我不知道为什么第一个会发出一个标量值,而第二个发出一个标量值数组,只是在stackoverflow上被某人指向了这个事实。

0

感谢您的帮助,ZYX,这里的任何人最终脚本谁在乎

local lines words 

lines=(${(f)"$(git log -n 15 --pretty=format:"'%h - %an - %s'")"}) 
words=(${(f)"$(git log -n 15 --pretty=format:"%h")"}) 

compadd -l -d lines -a -- words 
0

我有一个更复杂的局面。我试图grep许多文件的字符串,然后编辑结果列表的文件。 **和*通配符的使用没有让上述解决方案适用于我。我确实通过分解为2个步骤来实现它:

> tmp=$(grep -l someString **/*.clj) 
> fileList=(${(f)tmp})