Ben sadece soruyu ele alacağım (1).
Senin problemin KEYTIMEOUT. Zshzle'dan (1) alıntı yapıyorum:
ZLE, terminalden bir komut okurken, bazı komuta bağlı olan ve aynı zamanda daha uzun ciltli bir dizenin öneki olan bir sekans okuyabilir. Bu durumda ZLE, daha fazla karakterin yazılıp yazılmadığını görmek için belirli bir süre bekleyecek ve eğer değilse (veya daha uzun bir dizeyle eşleşmiyorsa), ciltleme işlemini yürütecektir. Bu zaman aşımı KEYTIMEOUT parametresi tarafından tanımlanır; varsayılan değeri 0,4 sn'dir. Önek dizgisinin kendisi bir komuta bağlı değilse zaman aşımı olmaz.
Bu 0,4'ler ESC'ye çarptıktan sonra yaşadığınız gecikmedir. Düzeltme, KEYTIMEOUT'u, kabuk başlangıç dosyalarından birinde 0.01 saniye olarak ayarlamaktır:
export KEYTIMEOUT=1
Maalesef bunun etki yaratma etkisi var: Başka şeyler ters gitmeye başlıyor…
Öncelikle, vi komut kipinde şimdi bir sorun var: ESC yazmak imlecin askıda kalmasına neden olur ve daha sonra yazdığınız karakter yutulur. Bunun nedeni, ESC'nin vi komut modunda varsayılan olarak hiçbir şeye bağlı olmamasıdır, ancak ESC ile başlayan çoklu karakter widget'ları vardır (imleç tuşları!). ESC'ye bastığınızda, ZLE bir sonraki karakteri bekler… ve sonra onu tüketir.
Düzeltme için ESC bağlamak olduğunu şey böylece sağlanması, komut modunda bir şey $ KEYTIMEOUT centiseconds sonra zle geçirilir. Şimdi ESC ile başlayan ciltleri bu kötü etkiler olmadan komut modunda tutabiliriz. ESC'yi, kendi kendine eklemekten daha az müdahaleci bulduğu zil karakterine bağlarım (ve kabuğum susturuldu):
bindkey -sM vicmd '^[' '^G'
2017 Güncellemesi:
undefined-key
Widget - ESC'yi bağlamak için daha iyi bir çözüm buldum . Bu cevabı başlangıçta yazdığımda bu widgetın zsh ile hazır olup olmadığından emin değilim.
bindkey -M vicmd '^[' undefined-key
Sonraki sorun: Varsayılan olarak, vi ekleme modunda ^ X ile başlayan bazı iki anahtarlı widget'lar vardır; $ KEYTIMEOUT tamamen ayarlanmışsa bunlar kullanılamaz hale gelir. Yaptığım, vi ekleme modunda ^ X bağlantısını açmak (varsayılan olarak kendi kendine eklenir); bu, iki anahtar widget'ın çalışmaya devam etmesini sağlar.
bindkey -rM viins '^X'
Kendiliğinden geçme bağını kaybedersiniz, ancak elbette başka bir şeye bağlayabilirsiniz. (Bilmiyorum, çünkü faydasım yok.)
Son sorun (Şimdiye kadar buldum): $ KEYTIMEOUT ayarını yaptığımız için "kaybettiğimiz" bazı varsayılan tuş bağları var, bunun yerine, imleç tuşları olmayan vi insert modunda ESC ile başlayanlar . Ben şahsen ^ X ile başlamak için onları yeniden bağlarım:
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
2018 Güncellemesi:
Yukarıdaki bölümün tamamını (“Güncelleme 2017” den sonra) mutlaka gerekli değildir. META tuşunu kullanarak klavye eşlemelerinde ESC'ye eşdeğer olacak şekilde ayarlamak mümkündür:
bindkey -mv
Bu nedenle mümkün değildir bir lider yerine (Modern klavyelerde ALT veya OPT) olarak META basarak ESC başlayacak keybinding ^ X unbind için ve erişim.
Kiddle ve arkadaşlarının Bash'den Z Shell'e kitabına erişiminiz varsa , ESB ve META'nın klavyelerdeki denkliği sayfa 78-79'daki Bölüm 4 kenar çubuğunda tartışılmaktadır.
i
, ekleme moduna geri dönmek için iki kez vurmanız gerekebilir , bu düzeltmeyi şiddetle tavsiye ederim !