Eu uso um widget zle simples print-current-word
para ilustrar como você pode extrair a palavra atual na linha de comando em casos simples, ou seja, assumindo que espaços em branco são sempre separadores de palavras. (Então, isso falha quando citações ou espaços vazios entram em ação):
print-current-word() {
CURRENTWORD="${LBUFFER/* /}${RBUFFER/ */}"
print; print "The current word is: $CURRENTWORD"
}
zle -N print-current-word
-
$LBUFFER
e$RBUFFER
contém a linha de comando esquerda e direita do cursor, respectivamente. -
${name/pattern/repl}
retorna a variável nome com padrão substituído por repl . Então, nesse caso, isso reduz em$LBUFFER
tudo até o último espaço em branco, deixando a parte esquerda do cursor da palavra atual. Analógico para$RBUFFER
.
Uma abordagem mais complicada seria:
print-current-word () {
local words i beginword
i=0
beginword=0
words=("${(z)BUFFER}")
while (( beginword <= CURSOR )); do
(( i++ ))
(( beginword += ${#words[$i]}+1 ))
done
CURRENTWORD="$words[$i]"
print; print "The current word is: $CURRENTWORD"
}
No entanto, este também não está isento de suposições, pois assume que cada palavra é separada por exatamente uma em branco (adição de +1 a beginword
).
Apenas algumas palavras sobre algumas coisas especiais:
-
words=("${(z)BUFFER}")
divide$BUFFER
, ou seja, a linha de comando completa, em palavras shell usando regras de análise de shell por Flag de expansão(z)
e as coloca em uma matriz -
(( ... ))
ativa o modo de matemática do zsh -
${#name}
fornece o comprimento da variável nome