使用命令输出为zsh生成自动完成命令

时间:2011-03-23 07:35:26

标签: shell autocomplete zsh

嘿,我正在尝试让zsh运行git命令,并使用输出生成自动完成的可能性。

我正在尝试运行的命令是

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

3 个答案:

答案 0 :(得分:3)

要强制单词成为数组,您应该使用

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

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

。如果仅使用words=${(f)...},则始终会获得一个值。那么,为什么在编写${(f)...}定义时在lines周围添加括号,但是没有为words做过?

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

答案 1 :(得分: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

答案 2 :(得分:0)

我的情况比较复杂。我试图为字符串grep许多文件,然后编辑生成的文件列表。 **和*通配符的使用并没有让上述解决方案对我有用。我确实通过分解为两个步骤来实现它:

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