ZSH: come ZLE widget direttamente?


12

La documentazione dice nella sezione 18.4 Widget , che "il lavoro di un widget è semplicemente quello di eseguire alcune piccole azioni". Ma non riesco a trovare una descrizione generale su come invocare queste azioni, ovvero come chiamare un widget.

Ho visto negli esempi (ad esempio vedere queste domande e risposte ) che i widget possono essere associati a chiavi usando bindkey KEY WIDGET. Quindi si può chiamare il widget usando KEY.

Volevo alternare set-local-historye ho provato:

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

zle -hnon funziona, ma ho trovato una descrizione degli argomenti qui . Ma non sembra che ci sia qualcosa di simile --call.

Che cosa sto facendo di sbagliato? Come è possibile chiamare il widget senza bindkey? Come posso stampare lo stato attuale? ( set-local-historyattiva / disattiva lo stato)

Risposte:


9

Puoi eseguire il widget dal widget execute-named-cmd, che è associato a ESC-x(bind emacs) o :(bind vi):

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

Leggi il nome di un comando dell'editor ed eseguilo.

Questo apre un mini-buffer sotto la riga di comando, dove puoi avviare i widget di zle. (Il completamento automatico è disponibile!):

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

Per eseguire una query sullo stato di zle(inclusa la cronologia locale), utilizzare la variabile $ZLE_STATE(accessibile solo all'interno delle funzioni del widget):

ZLE_STATE (scalar)

Contiene un insieme di parole separate da spazio che descrivono lo stato zle corrente.

Attualmente, gli stati mostrati sono la modalità di inserimento impostata dai widget sovrascrivi o vi-sostituisci e se i comandi della cronologia visiteranno le voci importate come controllato dal widget set-local-history. La stringa contiene insert se i caratteri da inserire nella riga di comando spostano i caratteri esistenti a destra o overwritese i caratteri da inserire sovrascrivono i caratteri esistenti. Contiene localhistoryse verranno visitati solo i comandi della cronologia locale o globalhistoryse verranno visitati anche i comandi della cronologia importati.

Le sottostringhe sono ordinate in ordine alfabetico in modo che se si desidera verificare due sottostringhe specifiche in modo a prova di futuro, è possibile eseguire la corrispondenza eseguendo:

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

Tutte le citazioni da man zshzle.


Sì, penso di aver già visto entrambe le virgolette, ma non ho capito il valore tra le tre parentesi graffe. La pagina man dice: "Questi parametri speciali sono sempre disponibili nelle funzioni dei widget, ma non sono in alcun modo speciali al di fuori di ZLE." Ciò significa che per ottenere ZLE_STATE, devo definire una funzione e un widget personalizzato, giusto?
lumbric il

@lumbric: hai ragione, ZLE_STATEè definito solo all'interno delle funzioni del widget. Ho perfezionato la mia risposta. Qual è il tuo obiettivo? [Immagino selvaggio: per indicare la cronologia locale / globale nel mio prompt, utilizzo un widget per (i.) Impostare una variabile di shell (questo è possibile all'interno dei widget) e (ii.) Eseguire zle set-local-history.]
mpy

Il mio obiettivo principale era comprendere il concetto di widget zle. Giocando con set-local-history, volevo sapere se è attualmente impostato su globale o locale. Ho pensato che ci fosse un we per ottenere lo stato corrente (simile alla chiamata "setopt" per ottenere le opzioni attualmente abilitate). Il mio obiettivo originale era già stato risolto in queste domande e risposte .
lumbric

1
Mi aspetto che la stringa nel caso in cui il test sia " *globalhistory*insert*" anziché " *insert*globalhistory*", in base alla lettura della frase prima dell'esempio?
Volker Siegel,

@VolkerSiegel: un ottimo punto, grazie! Ho controllato con il codice sorgente e ho provato io stesso l'esempio dato, concludendo che l'esempio nella pagina man è sbagliato, non l'istruzione ("in ordine alfabetico"). Ho modificato la mia risposta e invierò un percorso alla mailing list di zsh-worker .
mpy,

1

Se stai usando tmuxpuoi chiamare il tasto associato con send-keys.

Esempi:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.