ZSH: como ZLE widgets diretamente?

8

A documentação diz na seção 18.4 Widgets , que um " O trabalho do widget é simplesmente executar alguma pequena ação ". 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 os widgets podem bin vinculados a chaves usando bindkey KEY WIDGET . Então, pode-se chamar o widget usando KEY .

Eu queria alternar set-local-history e tentei:

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

zle -h não funciona, mas encontrei uma uma descrição do argumentos aqui . Mas não parece haver algo como --call .

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

    
por lumbric 22.12.2013 / 19:11

2 respostas

6

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)

Read the name of an editor command and execute it.

Isto abre um mini-buffer abaixo da linha de comando, onde você pode iniciar widgets zle. (Autocompletion está disponível!):

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

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

ZLE_STATE (scalar)

Contains a set of space-separated words that describe the current zle state.

Currently, the states shown are the insert mode as set by the overwrite-mode or vi-replace widgets and whether history commands will visit imported entries as controlled by the set-local-history widget. The string contains insert if characters to be inserted on the command line move existing characters to the right or overwrite if characters to be inserted overwrite existing characters. It contains localhistory if only local history commands will be visited or globalhistory if imported history commands will also be visited.

The substrings are sorted in alphabetical order so that if you want to test for two specific substrings in a future-proof way, you can do match by doing:

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

Todas as citações de man zshzle .

    
por 22.12.2013 / 19:39
1

Se você estiver usando tmux , poderá chamar a chave associada 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
    
por 10.10.2017 / 08:47

Tags