Kısacası:
- anahtar kodları bir anahtarı temsil etmenin bir yoludur
- Eşlenmiş bir anahtar dizisi, bir işlemi tetikleyen bir dizi anahtar koddur
Şimdi sorunuzun, eşlenmiş bir anahtar dizisi ile bir anahtar kodu arasındaki fark yerine timeoutlen
ve onunla ilgili fark hakkında olduğunu düşünüyorum ttimeoutlen
.
Cevabım, gerçekten okumanız gereken bu wikia makalesine dayanıyor çünkü cevabı olabildiğince kısa ve net tutmak için burada bahsetmediğim bazı noktaları ele alıyor.
Önce anahtar kodlar hakkında konuşalım. Makale iki tür anahtar kodu tanımlar:
Terminal anahtar kodları:
Terminalin bir anahtarı nasıl temsil ettikleri.
Terminal tarafından Vim'e gönderilen bu kodlar.
Bu anahtar kodlarının bir listesini almak için terminal belgelerinizi kullanmalısınız. cat
Terminalinizdeki komutu yazarak ve anahtar kodunu bilmek istediğiniz anahtarı yazarak da görebilirsiniz . Örneğin benim terminalde için anahtar kodu ShiftF1şuna benzer:
^[[23~
Vim anahtar kodları:
Vimin bir anahtarı nasıl temsil ettikleri.
Vim, anahtarları temsil etmek için tutarlı bir yola ihtiyaç duyar, çünkü terminalin anahtar kodları bir terminalden diğerine değişir. Vim anahtar kodlarının listesine adresinden erişilebilir :h t_ku
. İçin Vim anahtar kodu ShiftF1şuna benzer:
<S-F1>
Böylece ShiftF1klavyeme bastığımda, sürücüler ve işletim sistemi terminale, yorumlayacağı bu tuşlara bastığımı bildirecek ^[[23~
. Terminal bunu Vim'e gönderir, bunun anlamını anlar <S-F1>
ve bu anahtar koduyla eşlenen eylemi tetikler.
Vim anahtar kodlarını ayarlayabiliriz, böylece terminaliniz Vim'in anlamadığı bir anahtar kodu gönderirse <S-F1>
, aşağıdaki komutu kullanabilirsiniz. Bu, Vim'e anahtar kodu aldığınızda bunu söyleyecektir ^[[24~
, çevirin <S-F1>
:
set <S-F1> ^[[24~
Eşlenmiş anahtar dizisi nedir?
Eşlenmiş bir anahtar dizisi bir eşleştirmenin bir adı olacaktır ve Vim anahtar kodları veya Terminal anahtar kodları olabilir. Örneğin:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
İlk eşleme terminal anahtar kodunu, ikincisi Vim anahtar kodunu eşler.
Şimdi timeoutlen
ve ttimeoutlen
? Arasındaki fark için
ttimeoutlen
Vim'in bir terminal anahtar kodunun farklı bölümlerini bekleyeceği zamandır (önceki örneğimizde, ^[
o [
zaman 2
vb.
Bu anahtar kodları terminal tarafından gönderildiği için, bu giriş arasında bir gecikme olmamalıdır (terminal tarafından 'bir kerede' gönderildiklerinden). Bu nedenle doktor bu ayar için gerçekten küçük bir değer önermektedir.
timeoutlen
Vim'in, bir kullanıcı tarafından manuel olarak girilen ve dolayısıyla girilmesi gereken bir terminal anahtar kodundan daha uzun olan Vim anahtar kodlarını bekleyeceği zamandır.
Bir örnek kullanmak için şunu söyleyelim:
- Sen eşlenen
^[[1;6B
bir eyleme
^[1;6B
terminalinizin anahtar kodu ctrlshiftdown
^[
terminalinizin anahtar kodudur Escape.
Beklemeniz gereken davranış:
- Büyük bir ayar yaparsanız
ttimeoutlen
, her Escapeyazışınızda Vim ^[
(yani Escape) veya ^[1;6B
(yani ctrlshiftdown)
- Küçük bir ayar
ttimeoutlen
yaparsanız, yazdığınızda gecikme olmazsınız Escapeçünkü Vim bunun tam bir anahtar kodu olduğunu bilecektir.
Ve timeoutlen
, bir 'üst seviyeye' üzerinde hareket edecek aşağıdaki eşleştirmeleri varsa:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
jVim yazdığınızda timeoutlen
, terminal anahtar kodunun başlangıcı jtamamlanmadığı için değil, bir sonraki Vim anahtar kodunu beklediği için bekler.
Umarım açıklamam mantıklıdır, kullandığım bazı eşlemelerin işlevsel bir bakış açısından anlamlı olmadığını, açıklamanın rahatlığı için burada olduklarını unutmayın.