-
local
é uma palavra-chave embutida, não uma palavra-chave, portanto,local files=(…)
não é analisado como uma atribuição de matriz, mas como uma atribuição de sequência de caracteres. Escreva a tarefa separadamente da declaração. (Já encontrado por llua , mas observe que você precisa inicializarfiles
na matriz vazia ou declarar a variável comtypeset -a
, caso contrário, a matriz começa com um elemento vazio falso.) - As matrizes Zsh são numeradas de 1, não de 0 como em bash e ksh, portanto,
${files[0]}
deve ser escrito$files[1]
. Como alternativa, diga ao zsh para se comportar de uma maneira mais compatível com o ksh e o bash: coloqueemulate -L ksh
no início da função. - A menos que você use a
emulate
route, sua função_notes
imprimirázsh: no matches found: foo*
se não houver conclusão parafoo
, porque, por padrão, globs não correspondentes acionam um erro. Adicione o qualificadorN
para obter uma matriz vazia se não houver correspondência, e testar se a matriz está vazia. - Há outro erro na sua função
_notes
que afeta as anotações nos subdiretórios: você deve remover o prefixo até a conclusão, de modo que, se, por exemplo,~/notes/foo/bar
existe e você digitan b<TAB>
,COMPREPLY
está definido para conterb
, nãofoo/b
.
Se você deseja manter um arquivo legível por bash e zsh:
type emulate >/dev/null 2>/dev/null || alias emulate=true
function n() {
emulate -L ksh
local arg; typeset -a files
for arg; do files+=( ~/".notes/$arg" ); done
${EDITOR:-vi} "${files[@]}"
}
function nls() {
tree -CR --noreport $HOME/.notes | awk '{
if (NF==1) print $1;
else if (NF==2) print $2;
else if (NF==3) printf " %s\n", $3
}'
}
# TAB completion for notes
function _notes() {
emulate -L ksh
local x files
files=($HOME/.notes/**/"$2"*)
[[ -e ${files[0]} ]] || return 1
COMPREPLY=()
for x in "${files[@]}"; do
COMPREPLY+=("$2${x#$HOME/.notes*/$2}")
done
}
complete -o default -F _notes n
Se você quiser portar seu código para zsh:
function n() {
local files
files=(${@/#/~/.notes/})
${EDITOR:-vi} $files
}
function nls() {
tree -CR --noreport $HOME/.notes | awk '{
if (NF==1) print $1;
else if (NF==2) print $2;
else if (NF==3) printf " %s\n", $3
}'
}
# TAB completion for notes
function _notes() {
setopt local_options bare_glob_qual
local files
files=(~/.notes/**/$2*(N))
((#files)) && COMPREPLY=($2${^files##~/.notes*/$2})
}
complete -o default -F _notes n