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-I
ketika 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: 1
hanya memengaruhi kombinasi meta dan kombinasi kontrol yang tidak memiliki karakter ASCII.
- Dengan
?.VT100.modifyOtherKeys: 2
dan ?.VT100.formatOtherKeys: 0
(default), Ctrl+ [kirim ␛[27;5;91~
dan Ctrl+ Ikirim ␛[27;5;105~
.
- Dengan
?.VT100.modifyOtherKeys: 2
dan ?.VT100.formatOtherKeys: 1
, Ctrl+ [mengirim ␛[91;5u
dan Ctrl+ Imengirim ␛[105;5u
.
Dukungan dapat dihidupkan dengan mengatur modifyOtherKeys
sumber daya saat memulai xterm (dan formatOtherKeys
untuk 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 modifyOtherKeys
mode 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.
Esc
atauC-[
, sehingga Anda kurang beruntung, tetapi Anda mungkin dapat melakukan sesuatu dengan Vim versi GUI atau dengan mengkonfigurasi ulang terminal Anda.