"Eşlenmiş anahtar dizileri" ile "anahtar kodları" arasındaki fark nedir? (zaman aşımı v ttimeoutlen)


20

Vim kılavuzu kullanabileceğimiz diyor timeoutlenait zaman aşımı süresini belirlemek için eşleşen anahtar dizileri ve kullanabilirsiniz ttimeoutlenzaman aşımı süresini belirlemek için anahtar kodlarının :

Yararlı bir ayar

:set timeout timeoutlen=3000 ttimeoutlen=100

(üç saniyeden sonra harita üzerinde zaman aşımı, saniyenin onda birinden sonra anahtar kodlarında zaman aşımı).

Nelerdir anahtar kodları ? Eşlenmiş anahtar dizilerinden farkı nedir?

Bir eşlenmiş anahtar dizisi örneği jkaşağıdaki eşleme olduğunu biliyorum :

inoremap jk <esc>

Bu örnekte, ekleme modunda ve yazarken jvim, amacımın ne olduğuna karar vermeden önce timeoutlenbasmam için milisaniye bekleyecek k.

Ancak anahtar kodu nedir ve nasıl ttimeoutlenetkiler? Teşekkürler.

Yanıtlar:


22

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 timeoutlenve 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. catTerminalinizdeki 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 timeoutlenve ttimeoutlen? Arasındaki fark için

  • ttimeoutlenVim'in bir terminal anahtar kodunun farklı bölümlerini bekleyeceği zamandır (önceki örneğimizde, ^[o [zaman 2vb.

    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;6Bbir 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 ttimeoutlenyaparsanı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.

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.