<Esc> işlevini devre dışı bırakın ancak <C - [> öğesini tutun


24

Ekle modundan geri geçmek için alışkınım <Esc>. Şimdi kendimi <C-[>yerine yeniden eğitmeye çalışıyorum <Esc>. Bunun için <Esc>yeniden eğitim konusunda yardım etmem gerekiyor.

Sorunlar

:inoremap <Esc> <Nop>

ayrıca devre dışı bırakır <C-[>. Vim için aynı şey gibi görünüyorlar.

Birini diğeri olmadan etkisiz hale getirmenin bir yolu var mı?


13
Hangi ortamda çalıştığınıza bağlı. Çoğu metin terminali , Escveya tuşuna bastığınızda uygulamaya aynı bilgileri gönderir; C-[bu nedenle şansınız kalmaz, ancak Vim'in GUI sürümüyle veya terminalinizi yeniden yapılandırarak bir şeyler yapabilirsiniz.
Gilles 'SO- kötülük'

Sağ! Bir vim meselesi değil. Klavye eşleştirmeleriyle ilgili bir geçici çözüm bulacağım. Thanks
mxlian

3
@ Gilles neden bunu bir cevaba koymuyorsun? Google çalışanları ve site istatistiklerimiz için daha iyidir.
Robbie Wxyz

2
@SuperScript Bunu biraz daha araştırdım ve bir cevap yayınladım.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


35

İlk olarak, biraz tarih. Eski günlerde, bir terminale bir metin yazdığınızda , her tuş uygulamaya bir karakter gönderdi. Terminalin bağlı olduğu makineler daha güçlü hale geldikçe, terminaller , basılmayan ancak bir tür işlevi olan bazı özel karakterler gönderecek olan bir kontrol anahtarında standardize edildi. Sonunda muzaffer karakter kümesi, 32'si kontrol karakteri olan 128 karaktere sahip ASCII idi . Ctrl10xxxxx₂ (ikili gösterim) yazılı bir harf veya başka bir sembolle birlikte basılması , kodu 00xxxxx₂ olan kontrol karakterini gönderir , örneğin Ctrl+ [27₁₀ = 0011011₂ karakter numarasını gönderir , çünkü [91₁₀ = 1011011₂'dir.

Terminallerdeki birkaç fonksiyon tuşu kontrol karakteri göndermiştir:

  • Backspace= Ctrl-H(BS = Boşluk) ¹
  • Tab= Ctrl-I(HT = Yatay Sekme)
  • Linefeed= Ctrl-J(LF = Satır Beslemesi) (birkaç terminalde bu anahtara sahipti)
  • Returnveya Enter= Ctrl-M(CR = Satır Başı)
  • Escape= Ctrl-[(ESC = Kaçış)

Terminallerde daha fazla fonksiyon tuşu bulunduğunda, hepsini temsil etmek için yeterli kontrol karakteri yoktu. Böylece karakter dizileri gönderdiler ve evrensel kural, bu karakter dizilerinin kaçış karakteriyle başlaması Ctrl-[.

Zaman geçtikçe, donanım terminalleri daha nadir ve daha nadir hale geldi; Günümüzde klavye ve uygulama arasında birçok çeviri seviyesi vardır . Mevcut karakter sayısındaki ve belirli tuş kombinasyonları ile belirli kontrol karakterleri arasındaki kodlanmış yazışmalardaki sınırlama artık geçerli değil. Bununla birlikte, uygulamalar mevcut terminallerle uyumlu kalmıştır ve terminaller mevcut uygulamalarla uyumlu kalmıştır; bu da bir şeyleri değiştirmeyi zorlaştırmaktadır.

Bu nedenle, bugün bile, Unix benzeri sistemlerde, bir terminal emülatöründe çalışan uygulamalar Ctrl-I, kullanıcı Tabtuşa bastığında karakter Ctrl-[, kullanıcı bastığında karakter Escvb. Alır. Vim bir Unix terminalinde çalışıyorsa, birbirinden ayırt edemez. <Esc>ve <Ctrl-[>terminal aynı bilgiyi gönderdiği için.

Diğer ortamlarda çalışan Vim bu sınırlamaya sahip değildir, bu nedenle prensipte farklı bilgiler göndermeleri mümkün olacaktır. Vim'in bir çok yerde Ctrl-[temsil etmek için karakteri kullandığı ve <Esc>değiştirmenin pratik olmadığını; bunun yerine Ctrl+ [farklı bir giriş olayı göndermek için yapılabilir.

Ben ayırt etme arasında yaptığı Vim kendisi herhangi bir sürümü farkında değilim Escve Ctrl+ [(şimdiye kadar herhangi kullandıklarımıza gibi ama değil). Gvim, biri için, bir bahçe çeşidi terminali taklit ediyor gibi görünüyor .

İronik olarak, en iyi bahis bir terminal emülatöründe çalışan Vim olabilir. Bazı terminal emülatörleri, tuşlar ve anahtarlıklar tarafından gönderilen kaçış dizilerini özelleştirmenize izin verir. Böylece Ctrl+ [için ␛ ( Ctrl-[) karakterini değil, bazı kaçış dizilerini göndermesini ayarlayabilirsiniz . Unix benzeri sistemler için “referans” terminal emülatörü olan Xterm, bu iki planı desteklemektedir. Örneğin:

  • EscTüm yapılandırmalarda gönderir ve Tabgönderir .
  • İle ?.VT100.modifyOtherKeys: 0(varsayılan) ya da ?.VT100.modifyOtherKeys: 1, Ctrl+ [gönderir ve Ctrl+ Igönderir . ?.VT100.modifyOtherKeys: 1yalnızca ASCII karakterine sahip olmayan meta kombinasyonları ve kontrol kombinasyonlarını etkiler.
  • İle ?.VT100.modifyOtherKeys: 2ve ?.VT100.formatOtherKeys: 0(öntanımlı), Ctrl+ [gönderir ␛[27;5;91~ve Ctrl+ Igönderir ␛[27;5;105~.
  • İle ?.VT100.modifyOtherKeys: 2ve ?.VT100.formatOtherKeys: 1, Ctrl+ [gönderir ␛[91;5uve Ctrl+ Igönderir ␛[105;5u.

Xterm'i başlatırken (ve iki şema arasında seçim yapmak için) modifyOtherKeys kaynağı ayarlayarak destek açılabilir formatOtherKeysveya uygulama tarafından dinamik olarak açılıp kapatılabilir.

Vim'in bildiğim yerleşik bir desteği yok. Bu kaçış dizileri için kendi ciltlerinizi yazabilirsiniz. Vim'i, modifyOtherKeysdeğiştirilmiş bir terminal tanımını besleyerek terminali otomatik olarak modda ayarlamak mümkün olabilir , ancak bunu yapmak bu cevabın kapsamı dışındadır.

Neovim , değişkenlerden biri için yerleşik desteğe sahiptir . Anladığım kadarıyla, eğer terminal destekliyorsa desteği açmıyor, kullanıcının yapması gerekiyor.

¹ Günümüzde giderek daha yaygın olarak, Backspace127 karakterini göndermektedir.

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.