Bu <Esc> normal mod eşlemesi başlatmayı neden etkiler?


13

Normal mod eşlemesinde garip bir sorun yaşıyorum Esc.

Dosyayı escmapvimrciçeriklerle oluşturursanız:

set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>

Ve sonra bu vimrc'yi kullanarak vim'i başlatın:

vim --noplugin -u escmapvimrc

Daha sonra vim, cdaha fazla giriş bekleyen bir komutla, boş bir dosya görüntüleyerek ve komut satırı görüntüleyerek operatör beklemede modunda başlayacaktır :noh.

nnoremapHattı kaldırırsanız, sorun ortadan kalkar.

Hata ayıklama ve her şeyi adım adım yaparsanız, aşağıdaki çıktıyı alırsınız:

Entering Debug mode.  Type "cont" to continue.
/[...]/escmapvimrc
line 1: set nocompatible
>s
/[...]/escmapvimrc
line 2: set showcmd " Doesn't affect the problem: just makes it easier to see
>s
/[...]/escmapvimrc
line 3: nnoremap <Esc> :noh<CR><esc>
>s
/[...]/escmapvimrc
line 4: End of sourced file
>s
Press ENTER or type command to continue

Enter tuşuna bastıktan sonra, Vim başlangıç ​​ekranı görüntülenir ve altında:

Entering Debug mode.  Type "cont" to continue.
cmd: noh
>s

Vim başlangıç ​​ekranı kaybolur ve yukarıda açıklandığı gibi operatörün beklemede modunda olursunuz.

Neler oluyor?

DÜZENLEME: Davranış Vim 7.3'te açıklandığı gibidir. Vim 7.4.52'de Vim'i nmapdosya olmadan başlatırken Vim'in Değiştirme modunda başlatılmasına neden olur. (Ancak Vim 7.4.52 bir dosya ile başlatılırsa , devam eden bir c komutu ile de başlar.) Her iki durumda da, nmap kaldırıldığında sorun ortadan kalkar.


Bunu vim ile çoğalttım, ama komut satırı :nohbana göstermedi . Aynı şeyi gvim ile yapmak bu davranışı göstermedi.
PhilippFrank

1
Arama vurgulamasının temizlenmesi için yaygın bir eşleme şöyledir:nnoremap <c-l> :noh<cr><c-l>
Peter Rincker

Bir yan not olarak, /alksdjflaskjoldukça hızlı olan arama vurgulamasını temizlemek için kullanabilirsiniz .
Shahbaz

Yanıtlar:


12

Vim, başlatma sırasında bazı <esc>şeyleri (renkler, bs, ...) belirlemek için bazı özel terminal kodlarını (genellikle anahtarı içerir ) gönderir. <esc>Bu eşlenirse , büyük olasılıkla dönüş kodlarının ayrıştırıcısını karıştırır ve garip şeyler olabilir.

Bu nedenle, yukarıdaki haritanızı yalnızca her şey doğru bir şekilde kurulduktan sonra kullanın (örn. Bir VimEnter otomatik komutuyla).


1
'term'Seçenek her ayarlandığında gönderilir . Bu genellikle yalnızca başlatma sırasında, ancak çalışma zamanında ayarlandığı senaryolar olabilir.
jamessan

Bu özel durumda, bunun nedeni yalnızca başlangıçta çağrılan may_req_ambiguous_char_width () 'den kaynaklanmaktadır
Christian Brabandt 18:15

Tam olarak bu denemeyi planlıyordum (bu yüzden diğer cevabı kabul etmedim). Olsa da, çalışması için onay olması iyi.
Zengin


Şaka yapıyorsun değil mi? İletişim kurmak için kullanılan kaçış, Escape tuşu eşlemesinden ayrı olmalıdır.
shawnhcorey

11

Linux terminali, Vim'e <Esc>özel anahtarlar göndermek ve uygulamanın yeteneklerini sorguladığı iletişim protokolünün bir parçası olarak ANSI kaçış dizilerini (yani ile başlayan karakter dizeleri ) kullanır. Haritalamanız buna müdahale eder ve böylece bu "garip" davranışlara yol açar.

Bu nedenle, harita çizmeyin<Esc> . Başka bir anahtar kullanın. Sorun GVIM'de daha az belirgindir, ancak orada da tavsiye etmem.


Ne yazık ki, neredeyse Vim kullanmaya başladığımdan beri bu haritalama yaptım, bu yüzden şu anda kas hafızamda oldukça iyi yanmıştı. Yine de açıklama için teşekkürler.
Zengin

Şunu da eklemeliyim ki, gelecek nesiller için, açıklanan sorun kesinlikle bu eşlemeden kaynaklandığını bildiğim tek sorun ve Vim ile olanları hatırlayabildiğim tek garip çözülmemiş problem.
Zengin

1
@Rich gibi bir şey kullanmaya alışmak ne kadar zor olurdu <Esc><Esc>?
Random832

@ Random832 Bu ilginç bir fikir.
Zengin

1
Tüm xterm programları bunu yapacak çünkü VT-100 terminallerini taklit ediyorlar. Linux ile ilgisi yok. Linux'a değil BSD'ye dayanan iOS, VT-100'leri taklit eden xtermlere de sahip olacak.
shawnhcorey

1

Bunu dene:

augroup escape_mapping
  autocmd TermResponse * nnoremap <Esc> :noh<CR><esc>
augroup end

cf /programming//a/16027716/400545


Bu benim için iyi çalışmıyor. Dosyamdaki eşlemeyi escapemapvimrcbununla değiştirdikten sonra, Vim başlangıcı tamamlandığında, komut satırı modunda, aşağıdaki içeriği içeren komut satırı ile çalışıyorum: :83/94/95^G( CTRL-Gsonunda bir değişmez ). Bu biraz :help: Bu eşleme kurmak için en iyi zaman olmayabilir önermek gibi görünüyorNote that this event may be triggered halfway executing another event, especially if file I/O, a shell command or anything else that takes time is involved.
Zengin

1

Eşlemeyi daha sonra başlangıçta ayarlamak için bir otomatik komut ayarlamayı denedim, ancak sorun hala oluştu. *

Sonunda Ekle moduna ilk girdiğimde meydana gelmesi için bir otomatik komut oluşturdum. Bu kesinlikle mükemmel bir çözüm değil, ama benim için çoğu zaman işe yarayacak ve yapabileceğim en iyi şey gibi görünüyor:

GÜNCELLEME : Aşağıdaki daha uzun sürümü birkaç yıl boyunca sorunsuz bir şekilde kullandıktan sonra, muhtemelen biraz fazla mühendislik yapılmış olduğuna karar verdim ve o zamandan beri, ekleme moduna her girdiğinizde eşlemeyi sıfırlayan bu çok daha basit sürümü kullandım:

augroup escape_mapping
  autocmd!
  autocmd InsertEnter * call s:setupEscapeMap()
augroup END

function! s:setupEscapeMap()
  nnoremap <Esc> :noh<CR><Esc>
endfunction

Ekleme moduna her girdiğinizde eşlemenin sıfırlanması gerekmez , ancak Vim'in bunu yapmasına da bir zarar vermez.

ORİJİNAL SÜRÜM :

if !exists('g:escape_mapped')  " Only need to set the mapping up once.
  augroup escape_mapping
    autocmd!
    " Create the autocommand, to fire when Insert mode is entered
    autocmd InsertEnter * call s:setupEscapeMap()
  augroup END
endif

function! s:setupEscapeMap()
  " Actually create the mapping
  nnoremap <Esc> :noh<CR><Esc> 

  " Now the map exists, so we won't ever need the autocommand again.
  let g:escape_mapped = 1

  " Tidy up the autocommand and group
  autocmd! escape_mapping InsertEnter *
  augroup! escape_mapping
endfunction

: * Çeşitli olaylara ekleyerek çalıştı VimEnter, BufReadPost, BufWinEnterve hatta CursorMoved(!), Ama bunlar hepsi çok erken yangın gibi görünüyor.


TermResponseOtokompayı hiç denediniz mi?
Christian Brabandt

@ChristianBrabandt Şimdi sahibim. Benim için iyi çalışmıyor :(.
Zengin

Kısa süre önce öğrendim ki, TermResponse, terminalin ilgili sorgu komutları için tetiklenmedi, bu vim sadece gönderiyor. ( t_RV, t_u7, t_RF, t_RB, Ve muhtemelen diğerleri.) Bu olabilir ayrıca Terminal bağlıdır Yani
Christian Brabandt
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.