Dalam vim, cegah agar caret mundur ketika saya meninggalkan mode edit?

9

Dalam vim, jika saya masuk dan keluar dari mode edit tanpa melakukan apa-apa, tanda sisipan berakhir satu karakter ke kiri. Dan jika saya masuk dan keluar dari mode penambahan, tanda sisipan bergerak maju dan mundur.

Adakah cara untuk mengkonfigurasi vim untuk meninggalkan tanda sisir sendirian dalam kasus ini?

Idealnya saya hanya ingin selalu masuk ke mode penambahan, tetapi tanpa memindahkan tanda sisipan ketika saya masuk atau keluar dari mode.

(Saat ini saya biasanya menggunakan mode penyisipan karena itu tidak mengacaukan posisi tanda kuret saya pada entri. Artinya, kecuali ketika saya harus menambahkan ke akhir baris, dalam hal ini saya bersumpah pada vim untuk berperilaku sedemikian rupa kuno , tekan Esc dan masuk ke mode penambahan.)

RomanSt
sumber
1
Jawaban untuk pertanyaan ini baik. Saya hanya ingin menunjukkan bahwa jika mereka benar dalam asumsi mereka bahwa Anda menggunakan saya untuk pergi ke mode edit, maka itulah yang menyebabkan bergerak mundur. Jika Anda menggunakan 'a' (bukan A) itu akan berfungsi seperti yang Anda harapkan.
johnny
@ Johnny aku tidak berpikir itu akan terjadi. Saya biasanya dalam mode "normal", bergerak di sekitar file dan barang-barang. Ketika saya perlu mengedit, saya memposisikan caret terlebih dahulu, lalu tekan "a", dan kemudian menemukan bahwa saya telah memposisikannya secara salah, karena itu bergerak ke kanan. Mengingat bahwa saya menghabiskan 99% waktu mengedit saya di editor modern, tidak ada kesempatan saya akan pernah ingat untuk memposisikan satu karakter ke kiri sebelum menekan "a". Itu sebabnya saya berharap untuk makro atau sesuatu.
RomanSt
Ini masalah kebiasaan. Memang menyebalkan, tapi tahun-tahun pertama saja. Anda akhirnya akan belajar kepada pers iatau atanpa berpikir tentang hal itu, dan mungkin bahkan s, S, ci", dll bukan terbatas idan a.
Luc Hermitte
1
Saya mengerti frustrasi Anda tetapi. Alih-alih, coba pikirkan apa yang Anda lakukan. Tanyakan kepada diri sendiri apakah ada cara yang lebih baik untuk melakukannya (daripada menggunakan Vim sebagai texteditor biasa, yaitu). Saya telah menemukan dengan Vim selalu ada cara yang lebih baik, cara Vim melakukan sesuatu. Kami dapat membantu tetapi kami harus tahu apa yang Anda lakukan saat mengalami masalah. Apakah Anda misalnya masuk ke mode edit ketika Anda ingin menghapus sesuatu? Jangan, ada 'x' untuk menghapus karakter. Ingin mengganti karakter, maka ada 'r'. Pikirkan saja apa yang ingin Anda capai.
johnny
@ Johnny Saya mengerti apa yang Anda bicarakan, tetapi itu membutuhkan terlalu banyak pembelajaran ulang agar masuk akal bagi saya. Saya menghabiskan 99% waktu mengedit saya di Visual Studio dan saya menyukainya. Aku hanya tahu aku tidak akan mempelajari kembali ini, jadi tidak ada gunanya membuang waktu.
RomanSt

Jawaban:

9

Pertanyaan ini sering ditanyakan di antara pengguna vi / Vim baru, dan jawabannya adalah bahwa sementara dalam mode normal, kursor selalu "pada" karakter, tetapi dalam mode insert kursor selalu "antara" dua karakter (ingat, akhir -of-line adalah karakter). Anda tidak dapat benar-benar melihat ini diilustrasikan juga di konsol Vim, tetapi di GUI Anda akan melihat kursor menjadi bilah di antara dua karakter saat Anda memasukkan mode penyisipan, alih-alih blok di atas karakter ketika Anda berada dalam mode normal.

Jadi yang Anda lihat belum tentu kursor memindahkan satu karakter kembali ketika Anda meninggalkan mode sisipkan, tetapi hanya pindah ke karakter. Satu-satunya arah gerakan yang aman adalah ke kiri (atau belakang). Dengan demikian, Anda memiliki lebih dari satu cara memasuki mode sisipkan:

  • "a" memasuki mode penyisipan dengan kursor "antara" karakter tempat kursor aktif dan karakter berikutnya di sebelah kanan.
  • "i" memasuki mode penyisipan dengan kursor "antara" karakter kursor aktif dan karakter sebelumnya ke kiri.

Beberapa orang telah berupaya menekan "gerakan" yang tidak mereka sukai ini, tetapi itu pasti mengganggu plugin dan skrip Vim lain yang ingin mereka jalankan di masa depan.

Saran saya adalah membiasakan diri menggunakan perintah "a" dan "i" (dan "A" dan "I") dalam situasi yang sesuai.

Perintah "o" dan "O" juga berguna untuk dipelajari. Lihat:

:help a
:help i
:help A
:help I
:help o
:help O

Sunting: Jika Anda masih bertekad untuk mengubah perilaku ini, coba tip ini: Mencegah melarikan diri dari memindahkan kursor satu karakter ke kiri

Heptite
sumber
1
Saya mengerti apa yang Anda katakan, tetapi "i" / "Esc" / "i" / "Esc" menyebabkan pergerakan keseluruhan aktual dari tanda sisipan. Saya benar-benar berpikir VIM tidak cocok untuk saya.
RomanSt
2
@romkyns: Saya pikir yang harus Anda lakukan adalah menggunakan aalih-alih i.
Dijeda sampai pemberitahuan lebih lanjut.
1
@Dennis setuju, "a" sedikit lebih baik karena memungkinkan tanda sisipan berada di depan karakter pertama dan setelah karakter terakhir dalam barisan - yang "i" secara sewenang-wenang melarangnya. Tetapi saya mencobanya; yang terjadi adalah saya selalu salah meletakkan tanda sisipan sebelum menekan "a" - jadi saya harus segera memindahkan tanda sisipan satu posisi ke kiri. Setiap saat. Itu melelahkan jadi saya beralih ke "i".
RomanSt
@Heptite Bisakah Anda mengarahkan saya ke salah satu implementasi cacat yang menekan gerakan itu? Kemungkinan saya ingin menggunakan plugin atau skrip lain di masa depan pada dasarnya adalah nol.
RomanSt
1
@romkyns, itu (tidak) berfungsi dua arah. Memetakan ulang <esc>memang akan mencegah sebagian besar penggunaan plugin <esc>bekerja dengan benar, tetapi juga, itu akan terus mengganggu Anda ketika Anda akan menggunakan fitur standar lainnya yang kembali ke mode normal dengan cara yang sama <esc>. Belajar menggunakan kunci yang tepat dengan cepat adalah solusi yang berskala / bekerja dalam jangka panjang.
Luc Hermitte
1

Saya pikir dengan carat maksud Anda kursor Anda dan jika Anda menggunakan "i" ini akan menyisipkan langsung di mana kursor Anda berada, "a" (yang saya percaya Anda cari) memindahkan kursor satu karakter ke kanan. Juga, shift-i (I) akan menuju ke awal baris dan shift-a (A) akan menuju ke akhir baris.

Jika saya salah mengerti pertanyaan Anda, saya minta maaf.

Dan M.
sumber
1

Karena memetakan ulang <ESC>dianggap 'berisiko', saya hanya menggabungkan dengan salah satu pendekatan kunci Hindari melarikan diri dan memiliki yang berikut ini di .vimrc:

 inoremap ii <ESC>l

Catatan: Pastikan tidak ada karakter spasi di ujung baris.

Sederhana, tetapi sepenuhnya disertifikasi sebagai "berfungsi dengan baik untuk saya" karena itulah yang seharusnya saya ketik dengan tangan.

Apakah saya menggunakan aatau isaya masih mendapatkan caret bergerak kembali perilaku dan itu mengganggu saya karena lebih sering daripada tidak maka hal berikutnya yang ingin saya ketik adalah d$menghapus ke akhir baris, dll.

atomicules
sumber
Solusi luar biasa sederhana. Terbaik yang pernah saya jumpai.
Tyler Collier
1

Inilah solusi saya:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

Itu lucu. Pertanyaan yang sama ini ada di ketiga situs: SO, SU, Unix + Linux.

Steven Lu
sumber
Saya tidak merasa lucu :) Untungnya saya menemukan editor yang tidak membuat saya gila (diakonos), jadi ini bukan masalah lagi. Namun, dipilih untuk mereka yang suka vim.
RomanSt