Mengapa kursor pindah ke awal baris setelah <Esc>?

12

Saya perhatikan saat mengedit sepanjang baris dalam file .txt dalam mode insert kursor akan pindah ke awal baris setelah menulis menggunakan urutan tombol:

<esc>:w

Saya ingin mengubah perilaku ini sehingga kursor akan tetap dalam posisi mengikuti a: write. Apakah ini mungkin? Saya tidak membutuhkan kursor untuk tetap dalam mode insert, saya hanya ingin mempertahankan posisi terakhirnya setelah menulis.

Saya menggunakan gVim 7.4 di windows. .Vimrc saya sangat mendasar, saya tidak percaya pengaturan saya mengganggu perilaku ini. Saya juga telah menghapus sumber mswin.vim dan example.vim dari .vimrc saya (seperti yang dibundel dengan installer windows resmi vim.org).

Setelah membaca komentar di bawah ini saya melihat masalah lagi dan menyadari kursor hanya meluncur ke paling kiri setelah menulis pada baris yang seluruhnya terdiri dari ruang putih tertinggal. Dengan kata lain, kursor hanya meluncur ke paling kiri pada esc-: w ketika garis adalah lekukan menggantung tanpa karakter lain selain spasi . .Vimrc menangani perilaku indent dengan pengaturan ini:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Jadi, baris baru yang dibuat di bawah garis indentasi akan berisi 4 spasi putih sebagai 4 spasi pertama dari garis (yang ingin saya pertahankan). Setelah tombol 'esc' tekan kursor slide ke paling kiri dari buffer.

Apakah ada cara untuk mempertahankan posisi kursor setelah menekan 'esc' untuk kembali ke mode normal, pada garis yang terdiri dari spasi spasi putih (seperti indentasi)?

Jim
sumber
3
Saya tidak pernah memperhatikan perilaku ini di Vim pada platform apa pun ... Apa yang terjadi jika Anda memulai gVim seperti: gvim -u NONE -U NONE(Anda dapat menggunakan cmd.exe, atau membuat pintasan)? Ini akan mencegah pemuatan (g) file vimrc Anda.
Martin Tournoij
1
Apakah itu file vimrc lengkap Anda ? Kecurigaan pertama saya adalah autocmd dalam file vimrc Anda menghapus spasi spasi tambahan. Apakah perilaku berubah ketika Anda memulai gVim tanpa file vimrc (lihat komentar di atas)?
Martin Tournoij
Di atas bukan .vimrc lengkap saya, ada pengaturan lain juga. Menjalankan gVim tanpa .vimrc (: scriptnames tidak menunjukkan .vimrc atau .gvimrc) menyelesaikan masalah saya. Anda memang benar, saya perlu memeriksa .vimrc saya atau sesuatu yang bersumber yang mungkin menyebabkan ini.
Jim
Rupanya penghapusan spasi-on-baru-baris ini adalah perilaku yang diinginkan, saya membaca di sini dimaksudkan untuk menjaga file bersih dari spasi.
Jim
Itu tentang membuka baris baru ... Bukan tentang menulis ke file?
Martin Tournoij

Jawaban:

11

Melihat dokumentasi untuk autoindent memiliki jawaban mengapa dan bagaimana mengatasinya. :help 'autoindent':

Salin indentasi dari baris saat ini ketika memulai baris baru (mengetik <CR> dalam mode Insert atau saat menggunakan perintah "o" atau "O"). Jika Anda tidak mengetik apa pun di baris baru kecuali <BS>atau CTRL-Ddan kemudian ketik <Esc>, CTRL-Oatau <CR>, indentasi dihapus lagi. Memindahkan kursor ke baris lain memiliki efek yang sama, kecuali jika bendera 'I' termasuk dalam 'opsi'.

Dengan kata lain, jika Anda ingin indentasi tidak hilang, ketik sesuatu dan kemudian mundur ruang sebelum memukul Esc, dan ruang terkemuka akan tetap ada.

Atau, jika Anda hanya ingin kembali pada level indentasi ketika Anda kembali ke mode insert dan menggunakan 'cindent'juga, gunakan Shift-Ssebagai gantinya i, yang akan menghapus baris (sudah kosong), dan mulai pada level indentasi yang sesuai. Ini bukan solusi umum seperti yang di atas, tapi saya lebih suka ini ketika saya sedang menulis kode C, sehingga file-file saya tidak benar-benar disimpan dengan garis spasi putih saja.

John O'M.
sumber
Ini adalah jawaban pasti untuk pertanyaan saya dari dokumentasi asli. Terima kasih atas ringkasan dan narasinya - saya tidak akan berpikir untuk melihat ke: h autoindent untuk informasi ini. Terima kasih juga @Carpetsmoker untuk diskusi yang mengarah ke solusi.
Jim
Ini memecahkan masalah yang saya alami dengan melibatkan pemetaan ulang o dan O untuk tidak meninggalkan mode penyisipan, tetapi untuk menjaga lekukan. Ini dapat dilakukan dengan melakukan nnoremap o o <BS><Esc><DEL>, dannnoremap O O <BS><Esc><DEL>
Max Coplan
Terima kasih banyak!
Max Coplan