嘿,我正在尝试让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
答案 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} )