Nonaktifkan <Esc> tetapi tetap <C - [>

24

Untuk beralih kembali dari mode Sisipkan saya terbiasa <Esc>. Sekarang saya mencari untuk melatih diri untuk <C-[>bukannya <Esc>. Untuk itu saya perlu menonaktifkan <Esc>untuk membantu pelatihan ulang.

Masalahnya adalah

:inoremap <Esc> <Nop>

juga menonaktifkan <C-[>. Untuk vim mereka tampaknya menjadi hal yang sama.

Apakah ada cara untuk menonaktifkan satu tanpa yang lain?

mxlian
sumber
13
Itu tergantung pada lingkungan apa Anda bekerja. Sebagian besar terminal teks mengirim informasi yang sama ke aplikasi ketika Anda menekan Escatau C-[, sehingga Anda kurang beruntung, tetapi Anda mungkin dapat melakukan sesuatu dengan Vim versi GUI atau dengan mengkonfigurasi ulang terminal Anda.
Gilles 'SANGAT berhenti menjadi jahat'
Kanan! Bukan masalah vim. Saya akan menemukan solusi dengan pemetaan keyboard. Terima kasih
mxlian
3
@Gilles, mengapa Anda tidak menjawabnya? Lebih baik untuk Googler dan statistik situs kami.
Robbie Wxyz
2
@SuperScript Saya telah meneliti ini lebih sedikit dan memposting sebuah jawaban.
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

35

Pertama, sedikit sejarah. Di masa lalu, ketika Anda mengetik teks pada terminal , setiap tombol mengirim karakter ke aplikasi. Ketika mesin yang terhubung dengan terminal menjadi lebih kuat, terminal distandarisasi pada tombol kontrol , yang akan mengirim beberapa karakter khusus, yang tidak dicetak tetapi memiliki semacam fungsi. Set karakter yang akhirnya menang adalah ASCII , dengan 128 karakter di mana 32 di antaranya adalah karakter kontrol. Menekan Ctrlbersama dengan huruf atau simbol lain yang ditulis 10xxxxx₂ (notasi biner) mengirim karakter kontrol yang kodenya adalah 00xxxxx₂, misalnya Ctrl+ [mengirimkan nomor karakter 27₁₀ = 0011011₂ karena [91₁₀ = 1011011₂.

Beberapa tombol fungsi pada terminal mengirim karakter kontrol:

  • Backspace= Ctrl-H(BS = BackSpace) ¹
  • Tab= Ctrl-I(HT = Tab Horisontal)
  • Linefeed= Ctrl-J(LF = Line Feed) (beberapa terminal pernah memiliki kunci ini)
  • Returnatau Enter= Ctrl-M(CR = Pengembalian Kereta)
  • Escape= Ctrl-[(ESC = Escape)

Ketika terminal memiliki lebih banyak tombol fungsi, tidak ada cukup karakter kontrol untuk mewakili semuanya. Jadi mereka mengirim urutan karakter, dan konvensi universal adalah bahwa urutan karakter ini dimulai dengan karakter pelarian Ctrl-[,.

Seiring berjalannya waktu, terminal perangkat keras menjadi semakin langka; saat ini ada banyak tingkatan terjemahan antara keyboard dan aplikasi . Keterbatasan jumlah karakter yang tersedia dan korespondensi hard-code antara kombinasi tombol tertentu dan karakter kontrol tertentu tidak lagi relevan. Namun, aplikasi tetap kompatibel dengan terminal yang ada, dan terminal tetap kompatibel dengan aplikasi yang ada, yang membuatnya sulit untuk mengubah apa pun.

Jadi bahkan hari ini, pada sistem seperti Unix, aplikasi yang berjalan di emulator terminal menerima karakter Ctrl-Iketika pengguna menekan Tabkunci, karakter Ctrl-[ketika pengguna menekan Esc, dll. Jika Vim berjalan di terminal Unix, ia tidak dapat membedakan antara <Esc>dan <Ctrl-[>karena terminal mengirimkan informasi yang sama.

Vim berjalan di lingkungan lain tidak memiliki batasan ini, jadi pada prinsipnya mungkin bagi mereka untuk mengirim informasi yang berbeda. Mengingat bahwa Vim menggunakan Ctrl-[karakter untuk mewakili <Esc>di banyak tempat, perubahan itu tidak praktis; sebagai gantinya Ctrl+ [dapat dibuat untuk mengirim acara masukan yang berbeda.

Saya tidak mengetahui adanya versi Vim itu sendiri yang membedakan antara Escdan Ctrl+ [(tapi tidak seperti saya pernah menggunakan). Gvim, misalnya, tampaknya meniru terminal varietas taman .

Ironisnya, taruhan terbaik Anda mungkin Vim berjalan di emulator terminal. Beberapa emulator terminal memungkinkan Anda untuk menyesuaikan urutan pelepasan yang dikirim oleh kunci dan gantungan kunci. Jadi, Anda mungkin mengatur agar Ctrl+ [tidak mengirim karakter ␛ ( Ctrl-[), tetapi beberapa urutan pelarian. Xterm, emulator terminal "referensi" untuk sistem mirip Unix, mendukung dua skema tersebut. Sebagai contoh:

  • Escmengirim dan Tabmengirim , dalam semua konfigurasi.
  • Dengan ?.VT100.modifyOtherKeys: 0(default) atau ?.VT100.modifyOtherKeys: 1, Ctrl+ [mengirim dan Ctrl+ Imengirim . ?.VT100.modifyOtherKeys: 1hanya memengaruhi kombinasi meta dan kombinasi kontrol yang tidak memiliki karakter ASCII.
  • Dengan ?.VT100.modifyOtherKeys: 2dan ?.VT100.formatOtherKeys: 0(default), Ctrl+ [kirim ␛[27;5;91~dan Ctrl+ Ikirim ␛[27;5;105~.
  • Dengan ?.VT100.modifyOtherKeys: 2dan ?.VT100.formatOtherKeys: 1, Ctrl+ [mengirim ␛[91;5udan Ctrl+ Imengirim ␛[105;5u.

Dukungan dapat dihidupkan dengan mengatur modifyOtherKeys sumber daya saat memulai xterm (dan formatOtherKeysuntuk memilih di antara kedua skema), atau dapat dinyalakan dan dimatikan secara dinamis oleh aplikasi.

Vim tidak memiliki dukungan bawaan yang saya ketahui. Anda dapat menulis binding Anda sendiri untuk urutan pelarian ini. Dimungkinkan untuk membuat Vim secara otomatis mengatur terminal dalam modifyOtherKeysmode dengan mengumpankannya definisi terminal yang dimodifikasi, tetapi hal itu berada di luar cakupan jawaban ini.

Neovim memiliki dukungan bawaan untuk salah satu varian . Sejauh yang saya mengerti, itu tidak mengaktifkan dukungan jika terminal mendukungnya, terserah kepada pengguna untuk melakukannya.

¹ Semakin dan paling umum saat ini, Backspacemengirimkan karakter 127.

Gilles 'SANGAT berhenti menjadi jahat'
sumber