Использование вывода команды для генерации команд автозаполнения для zsh - PullRequest
3 голосов
/ 23 марта 2011

Привет, я пытаюсь заставить 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 ]

3 голосов
/ 23 марта 2011

Чтобы заставить слова быть массивом, вы должны использовать либо

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

или

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

. Если вы используете только words=${(f)...}, вы всегда получите одно значение. Кстати, почему вы добавили круглые скобки вокруг ${(f)...}, когда писали определение lines, но не сделали это для words?

Кроме того, есть еще одна проблема: ${(f)$(...)} следует заменить на ${(f)"$(...)"}. Здесь есть какая-то чёрная магия: я не знаю, почему первый генерирует одно скалярное значение, а второй - массив скалярных значений, только что кто-то здесь указал на stackoverflow.

0 голосов
/ 12 ноября 2014

У меня была более сложная ситуация.Я пытался собрать много файлов для строки, а затем отредактировать полученный список файлов.Использование подстановочных знаков ** и * не позволило вышеуказанному решению работать на меня.Я заставил его работать, разделив его на 2 этапа:

> tmp=$(grep -l someString **/*.clj)
> fileList=( ${(f)tmp} )
0 голосов
/ 24 марта 2011

Спасибо за помощь, 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
...