Mengapa `ESC` memindahkan kursor kembali ke vim?

62

Dalam vim, ketika saya menekan ESCuntuk kembali ke mode perintah, kursor memindahkan satu karakter ke kiri. Ini bukan yang saya harapkan, sesekali saya langsung menekan luntuk kembali ke tempat itu, mungkin untuk menghapus karakter.

Apakah ada alasan untuk perilaku ini? Apakah ini nyaman untuk pola penggunaan yang saya lewatkan?

Eric Wilson
sumber
1
Saya bahkan tidak pernah memperhatikan ini sampai sekarang ... dan saya menggunakan vim setiap hari. Saya tidak tahu mengapa, tetapi saya tertarik mendengar jawabannya.
gabe.
5
ketika kembali ke mode penyisipan, Anda dapat menekan 'a' untuk menambahkan bukan 'i' untuk memasukkan. Anda kemudian akan pindah kembali ke posisi Anda sebelum menekan pelarian.
penguin359

Jawaban:

40

Dalam mode penyisipan, kursor berada di antara karakter, atau sebelum karakter pertama atau setelah karakter terakhir. Dalam mode normal, kursor melebihi karakter (baris baru bukan karakter untuk tujuan ini). Ini agak tidak biasa: kebanyakan editor selalu menempatkan kursor di antara karakter, dan memiliki sebagian besar perintah bertindak pada karakter setelah (tidak, secara tegas, di bawah ) kursor. Ini mungkin sebagian disebabkan oleh fakta bahwa sebelum GUI, terminal teks selalu menunjukkan kursor pada karakter (garis bawah atau blok, mungkin berkedip). Abstraksi ini gagal dalam mode penyisipan karena itu memerlukan satu posisi lagi (posting vs pagar).

Beralih di antara mode harus menggerakkan kursor dengan setengah karakter, sehingga untuk berbicara. The iperintah bergerak ke kiri, untuk menempatkan kursor sebelum karakter itu lebih. The aperintah bergerak tepat. Keluar dari mode penyisipan (dengan menekan Esc) menggerakkan kursor ke kiri jika memungkinkan (jika berada di awal baris, alih-alih dipindahkan).

Saya kira Escperilaku semacam itu masuk akal. Seringkali, Anda mengetik di akhir baris, dan Eschanya ada yang tersisa. Jadi perilaku umum adalah perilaku yang paling umum.

Pikirkan karakter di bawah kursor sebagai karakter terakhir yang menarik, dan perintah insert sebagai a. Anda dapat mengulangi a Esctanpa menggerakkan kursor, kecuali bahwa Anda akan ditabrak satu posisi dengan benar jika Anda mulai dari awal baris yang tidak kosong.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
21

Secara visual, lebih masuk akal di gvim:

Saat mengedit, kursor Anda berada di antara karakter:
masukkan deskripsi gambar di sini

Ketika dalam mode normal, itu berada di atas karakter terakhir:
masukkan deskripsi gambar di sini

Jadi itu tidak benar-benar kembali karakter, hanya dari menjadi antara r dan smenjadi di r

Martin Ueding
sumber
1
Foto yang bagus. Sejujurnya, saya di kamp yang mengatakan karakter mharus tetap disorot setelah kembali ke mode normal ...
Steven Lu
Ups. tautan gambar sekarang mati.
Steven Lu
1
tautan gambar sekarang mati.
Steven Lu
1
Ya, meng-hosting gambar Anda secara manual lebih banyak pekerjaan dan kurang dapat diandalkan daripada hanya menggunakan alat di editor penurunan harga di situs ini.
Steven Lu
1
Apakah semuanya baik-baik saja dengan mereka lagi? Ini "Kursor" apa yang mereka ketikkan dan teks Anda menyebutkan "j"
poige
15

Perilaku ini dapat diedit seperti dijawab di sini , tetapi berhentilah dan pikirkan tentang apa yang terjadi sesaat. Saat Anda berada dalam mode sisipkan, Anda sebenarnya bukan lebih dari satu karakter tetapi antara mereka. Ketika Anda memasukkan sesuatu, kursor melompat ke ujung apa yang Anda masukkan sehingga hal berikutnya yang dimasukkan akan setelah itu. Sekarang pikirkan jika Anda baru saja mengetik surat, maka ingin melakukan sesuatu untuk itu. Memukul Escakan menempatkan kursor pilih langsung di atas karakter terakhir yang Anda masukkan. Jika tidak melakukan ini, itu sebenarnya akan agak canggung.

Situasi yang mungkin Anda pikirkan adalah ketika Anda berada di mode insert bergerak seolah-olah Anda mode normal dan kemudian beralih. Dalam hal ini kursor tampaknya mengembalikan satu karakter, tetapi jika Anda berpikir seperti itu itu menunjukkan bahwa Anda berada dalam mode insert dan hal terakhir yang Anda lakukan adalah TIDAK memasukkan. Mungkin Anda harus menghabiskan lebih banyak waktu dalam mode normal?

Caleb
sumber
15
Itu tidak masuk akal bagi saya. Bagaimana Anda menjelaskan perilaku berjalan mundur dari penekanan tombol idan berulang ESC?
Warren Young
4
Masuk ke mode memasukkan, tidak memasukkan apa pun, lalu meninggalkannya bukanlah tes yang adil. Mengapa Anda berada dalam mode memasukkan jika Anda tidak memasukkan sesuatu. Jika Anda memasukkan sesuatu, kembali ke mode normal membuat Anda dengan karakter yang Anda masukkan terpilih. Sangat intuitif.
Caleb
4
Ini bukan tentang "adil", ini tentang kekuatan penjelas. Jika teori operasi Anda tidak menjelaskan semua perilaku, apakah itu tidak lengkap atau perilaku vi tidak konsisten. Saya lebih suka percaya bahwa vi sempurna dalam segala hal, dan karenanya konsisten. :)
Warren Young
9
@ Warren Perilaku "berjalan mundur" idiikuti oleh ESCadalah fungsi idan sepenuhnya independen dari ESC; khususnya, ketika Anda menekan iAnda meminta vim untuk memasukkan karakter, yang menurut definisi berarti "memasukkan karakter sebelum yang saya aktifkan", sebagai lawan dari ayang "menambahkan karakter setelah yang satu ini".
Kromey
3
Secara umum, setelah setiap perubahan, ketika saya meninggalkan perubahan itu, saya selesai dengan perubahan itu, dan hal berikutnya yang ingin saya lakukan mungkin akan melibatkan membuat perubahan yang berbeda. Jadi, bagi saya, setelah meninggalkan mode penyisipan (tidak peduli bagaimana saya memasukkannya), saya biasanya lebih suka kursor berada pada karakter berikutnya jadi saya siap untuk perubahan saya berikutnya , daripada siap untuk mengubah apa yang baru saja saya masukkan dimasukkan.
Kyle Strand
6

Ketik Alt+ Luntuk kembali ke mode perintah.

Itu tidak memerlukan remapping atau perubahan konfigurasi vim. Ini berfungsi karena pada kebanyakan emulator terminal Alt+ KEYmengirimkan Escdiikuti oleh KEY(pada xterm Anda mungkin perlu menambahkan Xterm*metaSendsEscape: truebaris ke file ~ / .Xdefaults Anda). Perilaku itu memungkinkan Anda untuk bahkan "membuat" kombinasi mode penyisipan lain yang berfungsi langsung di luar kotak - seperti Alt+ Shingga Backspace.

By the way, memiliki kursor di atas karakter yang baru saja Anda tulis bisa sangat merepotkan. Misalnya, Escdwtidak akan menghapus kata setelah teks yang baru saja Anda masukkan.

pengguna79932
sumber
Ketidaknyamanan yang Anda rujuk dapat dihindari dengan selalu mengetik spasi dalam mode sisipan sebelum melarikan diri. Lalu kursor yang meninggalkan mode sisipan diletakkan di atas spasi, dan Anda dapat mengetik Esc d euntuk menghapus kata di depan. Saya kembali ke perilaku default karena saya merasa itu mengubah perilaku lain yang sudah dikodekan di kepala saya.
mljrg
4

Inilah solusi saya.

Ini adalah versi yang lebih singkat dari solusi yang ditawarkan di halaman wikia tentang ini .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Steven Lu
sumber
Beri +1 di sini juga, karena mengutip halaman wiki, meskipun pengguna sebenarnya tidak meminta cara untuk mengubah perilaku ini.
Kyle Strand
Anda akan perhatikan jika Anda menggali cukup jauh ke dalam Vim sehingga banyak plugin bergantung pada perilaku default (sedikit tidak intuitif), jadi jika Anda melihat beberapa hal memakan secara acak atau memotong-motong satu karakter, bisa disebabkan oleh ini. Saya tidak menggunakan autocommand ini sendiri; itu bekerja dengan baik.
Steven Lu