zle leu a primeira palavra na linha?

1

Vamos dizer:

% ls ./ _

quando foo é chamado, onde _ é a posição do cursor.

foo(){
    echo $COMMAND
}
zle -N foo

Como COMMAND pode ser definido de tal forma que foo escreva o 'comando' (como em, a primeira palavra da linha - não precisa listar ou qualquer coisa em que && e similares são usados ) que foi emitido?

    
por OJFord 31.03.2016 / 00:49

2 respostas

2

Então você quer o ls bit do começo da linha atual? Vamos ver o que é definido por zsh

% foo(){ set > whatallisset }
% zle -N foo
% bindkey "^W" foo
% ls ./  # here I mash control+w, etc
% fgrep 'ls ./' whatallisset
BUFFER='ls ./ '
LBUFFER='ls ./ '

Então, provavelmente estamos analisando uma dessas variáveis para a "primeira palavra", portanto, supondo que BUFFER seja o mais apropriado e, depois, examinando zshexpn(1) docs e procurando por coisas "divididas" relacionadas:

foo(){ echo -n ${${(z)BUFFER}[1]} }
    
por 31.03.2016 / 01:09
1

Você tem acesso a diversas variáveis nos widgets definidos pelo usuário , em particular BUFFER que contém o conteúdo da linha (ou mais amplamente, o buffer inteiro, que pode ser multilinha).

Como extrair a primeira palavra de BUFFER depende da sua definição de palavras. Neste contexto, a definição mais útil é provavelmente baseada na sintaxe do shell, que está disponível através do z sinalizador de expansão de parâmetro .

first_word=${${(z)BUFFER}[1]}

Outras definições razoáveis são usar palavras delimitadas por espaços em branco ou palavras que consistam em $WORDCHARS . Existem comandos de movimento para isso, mas enquanto você pode chamá-los via zle builtin e assista CURSOR move, seria mais fácil dividir manualmente a string $BUFFER .

Nos widgets de conclusão, as palavras do comando para o qual a conclusão está ocorrendo estão no words parâmetro .

    
por 31.03.2016 / 02:16

Tags