ZSH: como ZLE widgets diretamente?

12

A documentação diz na seção 18.4 Widgets , que "o trabalho de um widget é simplesmente executar algumas ações pequenas". Mas não consigo encontrar uma descrição geral de como invocar essas ações, ou seja, como chamar um widget.

Eu vi em exemplos (por exemplo, ver este Q & A ) que widgets podem bin obrigado a teclas usando bindkey KEY WIDGET. Então pode-se chamar o widget usando KEY.

Eu queria alternar set-local-historye tentei:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hnão funciona, mas eu encontrei uma descrição dos argumentos aqui . Mas não parece que exista algo parecido --call.

O que estou fazendo errado? Como é possível chamar o widget sem bindkey? Como posso imprimir o status atual? ( set-local-historyalterna o estado)

lumbric
fonte

Respostas:

9

Você pode executar o widget pelo widget execute-named-cmd, que está vinculado a ESC-x(ligações do emacs) ou :(ligações do vi):

execute-named-cmd (ESC-x) (:) (unbound)

Leia o nome de um comando do editor e execute-o.

Isso abre um mini-buffer abaixo da linha de comando, onde você pode iniciar os widgets do zle. (O preenchimento automático está disponível!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

Para consultar o estado de zle(incluindo histórico local), use a variável $ZLE_STATE(acessível apenas dentro das funções do widget):

ZLE_STATE (scalar)

Contém um conjunto de palavras separadas por espaço que descrevem o estado atual do zle.

Atualmente, os estados mostrados são o modo de inserção, conforme definido pelos widgets de modo de substituição ou vi-replace e se os comandos de histórico visitarão entradas importadas, conforme controlado pelo widget de conjunto de histórico local. A sequência contém insert se os caracteres a serem inseridos na linha de comando movem os caracteres existentes para a direita ou overwritese os caracteres a serem substituídos substituem os caracteres existentes. Ele contém localhistoryse apenas os comandos do histórico local serão visitados ou globalhistoryse os comandos do histórico importado também serão visitados.

As substrings são classificadas em ordem alfabética para que, se você quiser testar duas substrings específicas de maneira futura, faça a correspondência fazendo o seguinte:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

Todas as citações de man zshzle.

mpy
fonte
Sim, acho que já vi as duas aspas, mas não entendi o valor nas três chaves. A página do manual diz: "Esses parâmetros especiais estão sempre disponíveis nas funções do widget, mas não são de forma alguma especiais fora do ZLE." Isso significa que, para obter o ZLE_STATE, preciso definir uma função e um widget personalizado, certo?
Lumbric
@ Lumbric: Você está certo, ZLE_STATEé definido apenas dentro das funções do widget. Eu refinei minha resposta. Qual é o teu objetivo? [Palpite: Para indicar o histórico local / global no meu prompt, eu uso um widget para (i.) Definir uma variável de shell (isso é possível dentro de widgets) e (ii.) Executar zle set-local-history.]
mpy
Meu principal objetivo era entender o conceito de widgets zle. Brincando com o set-local-history, eu queria saber se ele está atualmente definido como global ou local. Eu pensei que deveria haver um nós para obter o status atual (semelhante a chamar "setopt" para obter as opções ativadas no momento). Meu objetivo original já foi resolvido nesta sessão de perguntas e respostas .
Lumbric
11
Eu esperaria que a string no teste if fosse " *globalhistory*insert*" em vez de " *insert*globalhistory*", com base na leitura da frase antes do exemplo?
Volker Siegel
@VolkerSiegel: Um ponto muito bom, obrigado! Eu verifiquei com o código-fonte e tentei o exemplo fornecido, concluindo que o exemplo na página de manual está errado, não a declaração ("classificada em ordem alfabética"). Editei minha resposta e enviarei um caminho para a lista de discussão zsh-workers .
Mpy
1

Se você estiver usando, tmuxpode chamar a tecla vinculada com send-keys.

Exemplos:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Eyal Levin
fonte