ZSH: jak bezpośrednio widgetować ZLE?

12

Dokumentacja mówi w sekcji 18.4 Widżety , że „zadaniem widgetu jest po prostu wykonanie niewielkiej akcji”. Ale nie mogę znaleźć ogólnego opisu sposobu wywoływania tych działań, tj. Jak wywołać widżet.

Widziałem w przykładach (na przykład zobacz to pytania i odpowiedzi ), że widżety mogą być powiązane binami z kluczami bindkey KEY WIDGET. Następnie można wywołać widget za pomocą KEY.

Chciałem się przełączyć set-local-historyi próbowałem:

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

zle -hnie działa, ale znalazłem tutaj opis argumentów . Ale nie wydaje się, że coś takiego istnieje --call.

Co ja robię źle? Jak można wywołać widżet bez klucza powiązania? Jak mogę wydrukować bieżący status? ( set-local-historyprzełącza stan)

lędźwiowy
źródło

Odpowiedzi:

9

Widżet można wykonać za pomocą widgetu execute-named-cmd, który jest powiązany z ESC-x(powiązania emacs) lub :(powiązania vi):

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

Przeczytaj nazwę polecenia edytora i wykonaj go.

Spowoduje to otwarcie mini-bufora poniżej linii poleceń, w którym można uruchomić widżety ZLE. (Autouzupełnianie jest dostępne!):

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

Aby sprawdzić stan zle(w tym historię lokalną), użyj zmiennej $ZLE_STATE(dostępnej tylko w funkcjach widgetu):

ZLE_STATE (scalar)

Zawiera zestaw słów oddzielonych spacją, które opisują bieżący stan zle.

Obecnie pokazane stany to tryb wstawiania ustawiony przez widżety trybu zastępowania lub zastępowania vi oraz informacja, czy polecenia historii odwiedzą zaimportowane wpisy kontrolowane przez widżet set-local-history. Ciąg zawiera, insert czy znaki, które mają zostać wstawione w wierszu poleceń, przesuwają istniejące znaki w prawo lub overwritejeśli znaki, które mają zostać wstawione, zastępują istniejące znaki. Zawiera, localhistoryczy będą odwiedzane tylko lokalne polecenia historii, czy też będą odwiedzane globalhistoryimportowane polecenia historii.

Podciągi są sortowane w kolejności alfabetycznej, więc jeśli chcesz przetestować dwa konkretne podciągi w sposób przyszłościowy, możesz dopasować, wykonując:

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

Wszystkie cytaty z man zshzle.

mpy
źródło
Tak, myślę, że widziałem już oba cytaty, ale nie zrozumiałem wartości trzech nawiasów klamrowych. Strona podręcznika mówi: „Te specjalne parametry są zawsze dostępne w funkcjach widgetów, ale nie są w żaden sposób wyjątkowe poza ZLE”. Oznacza to, że aby uzyskać ZLE_STATE, muszę zdefiniować funkcję i niestandardowy widget, prawda?
lędźwiowy
@lumbric: Masz rację, ZLE_STATEjest zdefiniowany tylko w funkcjach widgetu. Poprawiłem swoją odpowiedź. Jaki jest twój cel [Dzikie zgadywanie: aby wskazać historię lokalną / globalną w moim monicie, używam widgetu do (i.) Ustawienia zmiennej powłoki (jest to możliwe w widgetach) i (ii.) zle set-local-history
Wykonania
Moim głównym celem było zrozumienie koncepcji widgetów ZLE. Grając z set-local-history, chciałem wiedzieć, czy jest ona obecnie ustawiona na globalną czy lokalną. Myślałem, że musi istnieć znak „my”, aby uzyskać bieżący status (podobny do wywoływania „setopt”, aby uzyskać aktualnie włączone opcje). Mój pierwotny cel został rozwiązany już w tym pytaniu i odpowiedziach .
lędźwiowy
1
Oczekiwałbym, że ciąg w teście if powinien być „ *globalhistory*insert*” zamiast „ *insert*globalhistory*”, w oparciu o czytanie zdania przed przykładem?
Volker Siegel,
@VolkerSiegel: Bardzo dobry punkt, dzięki! Sprawdziłem kod źródłowy i sam spróbowałem podanego przykładu, stwierdzając, że przykład na stronie podręcznika jest nieprawidłowy, a nie stwierdzenie („posortowane alfabetycznie”). Zredagowałem swoją odpowiedź i wyślę ścieżkę do listy mailingowej zsh-workers .
mpy
1

Jeśli używasz tmux, możesz wywołać powiązany klawisz za pomocą send-keys.

Przykłady:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Eyal Levin
źródło