Obter palavra no cursor na função zsh

1

Estou tentando configurar alguns complementos complexos que exigem a passagem da palavra para um subprocesso.

Zsh obviamente sabe sobre o diretório atual palavra / token /, e eu posso ver como vincular as coisas com base na palavra atual, mas não consigo descobrir como transformar "onde estou" em uma variável capaz de ser passou para subprocessos. (Eu quero o ponto no ponto do emacs, mas em zsh.)

    
por quodlibetor 26.03.2015 / 16:50

1 resposta

1

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
por 26.03.2015 / 18:40

Tags