ZSH: Widget doğrudan nasıl ZLE?


12

Dokümantasyon, 18.4 Widget'lar bölümünde , "widget'ın işinin sadece küçük bir işlem yapmak olduğunu" söylüyor . Ancak, bu eylemleri nasıl çağıracağınıza dair genel bir açıklama bulamıyorum;

Widget'ları kullanarak tuşlara bağlı bin örnekleri (örneğin bu S & C bakın ) gördüm bindkey KEY WIDGET. Sonra kullanarak widget arayabilir KEY.

Geçiş yapmak istedim set-local-historyve denedim:

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

zle -hişe yaramadı, ama burada argümanların bir açıklamasını buldum . Ama öyle bir şey yok gibi görünüyor --call.

Neyi yanlış yapıyorum? Widget'ı bindkey olmadan aramak nasıl mümkün olur? Mevcut durumu nasıl yazdırabilirim? ( set-local-historydurumu değiştirir)

Yanıtlar:


9

Widget'ı (emacs bindings) veya (vi bindings) execute-named-cmdile ilişkili widget ile yürütebilirsiniz :ESC-x:

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

Bir editör komutunun adını okuyun ve yürütün.

Bu , komut satırının altında, zle widget'larını başlatabileceğiniz bir mini tampon açar . (Otomatik tamamlama mevcuttur!):

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

zle(Yerel geçmiş dahil) durumunu sorgulamak için değişkeni kullanın $ZLE_STATE(yalnızca widget işlevlerinin içinden erişilebilir):

ZLE_STATE (scalar)

Geçerli zle durumunu tanımlayan bir dizi boşlukla ayrılmış sözcük içerir.

Şu anda gösterilen durumlar, üzerine yazma modu veya vi-replace widget'ları tarafından ayarlanan ekleme modudur ve geçmiş komutlarının, set-local-history widget'ı tarafından kontrol edilen içe aktarılan girişleri ziyaret edip etmeyeceğini gösterir. Dize insert , komut satırına eklenecek karakterlerin varolan karakterleri sağa taşımasını veya overwriteeklenecek karakterlerin varolan karakterlerin üzerine yazılmasını içerir. İçerdiği localhistorysadece yerel tarih komutları ziyaret edilecektir veya globalhistoryithal geçmiş komutları da ziyaret edilecektir.

Alt dizeler alfabetik olarak sıralanır, böylece iki belirli alt dizeyi geleceğe yönelik bir şekilde test etmek isterseniz, aşağıdakileri yaparak eşleştirme yapabilirsiniz:

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

Tüm alıntılar man zshzle.


Ah evet, sanırım her iki alıntıyı da gördüm, ama üç parantez içindeki değeri anlamadım. Man sayfasında: "Bu özel parametreler her zaman widget işlevlerinde bulunur, ancak ZLE dışında hiçbir şekilde özel değildir." Yani, ZLE_STATE almak için bir işlev ve özel bir widget tanımlamak gerekiyor, değil mi?
Lomber

@lumbric: Haklısınız, ZLE_STATEyalnızca widget işlevlerinde tanımlanmıştır. Cevabımı geliştirdim. Amacın ne? [Vahşi tahmin: Yerel / küresel geçmişi belirtmek için istemimde (i.) Bir kabuk değişkeni ayarlamak için bir widget kullanıyorum (bu widget'lar içinde mümkündür) ve (ii.) zle set-local-history
Yürütmek

Öncelikli hedefim, zle widget'ları kavramını anlamaktı. Set-local-history ile uğraşırken, şu anda global veya yerel olarak ayarlanmış olup olmadığını bilmek istedim. Mevcut durumu almak için bir biz olması gerektiğini düşündüm (şu anda etkin seçenekleri almak için "setopt" çağırmaya benzer). Orijinal hedefim bu soru-cevap bölümünde zaten çözüldü .
Lomber

1
Eğer örnek önce cümle okuma dayalı if test " *globalhistory*insert*" yerine " " olmalıdır dize beklenir *insert*globalhistory*?
Volker Siegel

@VolkerSiegel: Çok iyi bir nokta, teşekkürler! Kaynak kodunu kontrol ettim ve verilen örneği kendim denedim, man sayfasındaki örneğin ifadenin yanlış olduğu sonucuna vardı ("alfabetik olarak sıralandı"). Cevabımı düzenledim ve zsh-workers posta listesine bir yol göndereceğim.
mpy

1

Eğer kullanıyorsanız tmux, ilişkili tuşu ile arayabilirsiniz send-keys.

Örnekler:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.