Saya mengalami masalah aneh dengan pemetaan mode normal Esc.
Jika Anda membuat file escmapvimrc
dengan konten:
set nocompatible
set showcmd " Doesn't affect the problem: just makes it easier to see
nnoremap <Esc> :noh<CR><esc>
Dan kemudian mulai vim menggunakan vimrc ini:
vim --noplugin -u escmapvimrc
Kemudian vim akan mulai dalam mode menunggu operator dengan c
perintah menunggu input lebih lanjut, menampilkan file kosong, dan dengan menampilkan baris perintah :noh
.
Jika Anda menghapus nnoremap
garis, maka masalahnya hilang.
Jika Anda men-debug dan melangkah melalui semua yang Anda dapatkan output berikut:
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
Setelah Anda menekan enter, layar startup Vim ditampilkan, dan di bawahnya:
Entering Debug mode. Type "cont" to continue.
cmd: noh
>s
Layar startup Vim kemudian menghilang, dan Anda dalam mode pending operator, seperti dijelaskan di atas.
Apa yang sedang terjadi?
EDIT: Perilaku seperti dijelaskan dalam Vim 7.3. Dalam Vim 7.4.52, nmap
penyebab Vim untuk memulai dalam mode Ganti ketika memulai Vim tanpa file. (Jika Vim 7.4.52 dimulai dengan file, bagaimanapun, itu juga dimulai dengan c-command yang sedang berlangsung.) Bagaimanapun, masalahnya hilang ketika nmap dihapus.
sumber
:noh
untuk saya. Melakukan hal yang sama dengan gvim tidak menunjukkan perilaku ini.nnoremap <c-l> :noh<cr><c-l>
/alksdjflaskj
untuk menghapus sorotan pencarian yang juga cukup cepat.Jawaban:
Vim mengirimkan selama startup beberapa kode terminal khusus (yang biasanya berisi
<esc>
kunci) untuk menentukan beberapa hal (warna, bs, ...) Jika Anda memetakan<esc>
ini kemungkinan besar akan membingungkan parser dari kode kembali dan hal-hal aneh dapat terjadi.Karena itu, gunakan peta Anda di atas hanya setelah semuanya telah diatur dengan benar (misalnya melalui perintah otomatis VimEnter).
sumber
'term'
opsi disetel. Itu biasanya hanya selama startup, tetapi mungkin ada skenario di mana ia diatur saat runtime.VimEnter
secara khusus tidak berhasil.Terminal Linux menggunakan urutan pelarian ANSI (yaitu rangkaian karakter yang dimulai dengan
<Esc>
) untuk mengirim kunci khusus ke Vim, dan sebagai bagian dari protokol komunikasi yang dengannya aplikasi menanyakan kemampuannya. Pemetaan Anda mengganggu itu, dan dengan demikian mengarah pada perilaku "aneh" ini.Karena itu, jangan memetakan
<Esc>
. Gunakan tombol lain. Masalahnya kurang jelas di GVIM, tapi saya juga tidak akan merekomendasikannya.sumber
<Esc><Esc>
?Coba ini:
lih /programming//a/16027716/400545
sumber
escapemapvimrc
file saya dengan ini, ketika startup Vim selesai, saya dalam mode baris perintah, dengan baris perintah yang berisi konten berikut::83/94/95^G
(itu literalCTRL-G
di akhir). Bit ini dari:help
tampaknya menunjukkan ini mungkin bukan waktu terbaik untuk mengatur pemetaan:Note 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.
Saya mencoba mengatur autocommand untuk mengatur pemetaan nanti di startup, tetapi masalahnya masih terjadi. *
Saya akhirnya membuat perintah otomatis untuk muncul pertama kali saya memasuki mode Sisipkan. Ini jelas bukan solusi yang sempurna, tetapi bagi saya itu akan bekerja sebagian besar waktu, dan sepertinya itu yang terbaik yang bisa saya lakukan:
UPDATE : Setelah menggunakan versi yang lebih panjang di bawah ini tanpa masalah selama beberapa tahun, saya memutuskan bahwa itu mungkin sedikit over-engineered, dan sejak itu saya telah menggunakan versi yang lebih sederhana ini, yang alih-alih hanya menyetel ulang pemetaan setiap kali Anda memasukkan mode insert:
Pemetaan tidak perlu diatur ulang setiap kali Anda masuk ke mode insert, tetapi juga tidak ada salahnya bagi Vim untuk melakukannya.
VERSI ASLI :
* Saya mencoba melampirkan ke berbagai acara:
VimEnter
,BufReadPost
,BufWinEnter
, dan bahkanCursorMoved
(!), Tapi ini semua tampaknya api terlalu dini.sumber
TermResponse
?t_RV
,t_u7
,t_RF
,t_RB
, Dan mungkin orang lain.) Jadi kekuatan ini juga tergantung pada terminal Anda