2011-03-23 127 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})