Pilih satu item dalam daftar pelengkapan otomatis vim tanpa memasukkan jeda baris

22

Fitur vim yang agak menyebalkan adalah jika Anda berada dalam mode penyisipan dan melakukan pelengkapan otomatis (Ctrl-N), tombol panah ke bawah ke item yang diinginkan, dan tekan tombol Enter, kemudian memasukkan item tetapi juga menyisipkan baris baru yang Anda maka harus menghapus.

Apakah ada cara untuk memilih item dari daftar autocomplete tanpa mendapatkan baris baru yang tidak diinginkan?

Tyler Durden
sumber
1
Ini bukan cara kerjanya untuk saya ... Saya memilih sesuatu, tekan Enter, dan kursor masih pada baris yang sama sesudahnya.
goldilocks

Jawaban:

37

Tergantung pada status menu sembulan tempat Anda berada (lihat :help popupmenu-completion). Saya mengerti dari pertanyaan Anda bahwa Anda dalam kondisi 2 (karena Anda telah menekan tombol panah untuk menemukan penyelesaian). Namun, perilaku default untuk Enterdi negara 2 adalah untuk memasukkan penyelesaian tanpa baris baru; apa yang Anda gambarkan biasanya perilaku status 1 (yaitu ketika Anda menggunakan Ctrl+ N/ Ctrl+ P.)

Cara yang bekerja secara konsisten di semua negara adalah menggunakan Ctrl+ Y. Saya suka mengingat Y sebagai singkatan "ya, terima kata itu." Dimungkinkan juga untuk mulai mengetik teks yang seharusnya muncul setelah kata selesai, kecuali Anda telah memetakan kembali hal-hal seperti pada jawaban geedoubleya.

Dalam konteks yang sama, Anda dapat menekan Ctrl+ Euntuk membatalkan menu dan meninggalkan teks Anda seperti sebelum Anda memintanya. Jika Anda terbiasa dengan pasangan Ctrl+ Edan Ctrl+ Ydalam konteks lain (misalnya untuk menggulir ke atas atau ke bawah dalam mode normal, atau untuk memasukkan karakter di bawah atau di atas kursor dalam mode memasukkan), itu salah satu cara untuk mengingatnya di sini. Saya kira Anda juga bisa menganggapnya sebagai "keluar" dari menu atau serupa.

Lihat :help popupmenu-keyslebih lanjut.

echristopherson
sumber
2
Ah ha, itu masuk akal. Saya telah menggunakan Ctrl-N untuk membuka drop down. Saya baru saja menggunakan tombol panah untuk menavigasi drop down. Saya tidak tahu Anda bisa menggunakan tombol panah untuk membuka drop down.
Tyler Durden
Tombol panah tidak dapat membuka dropdown, dalam konfigurasi default. Perbedaan yang saya sebutkan adalah tentang menavigasi menu setelah dibuka.
echristopherson
Untuk beberapa alasan ketika saya mencoba melakukan ini dengan <kbd> Ctrl </kbd> + <kbd> Y </kbd> juga membuat indentasi baris, yang tidak diinginkan. Adakah pemikiran mengapa itu akan terjadi?
mpacer
Saya tidak pernah menemukan itu. Mungkin karena beberapa pengaturan indent atau plugin yang Anda lupa. Saya akan bertanya di milis Vim: vim.org/maillist.php .
echristopherson
6

Secara pribadi saya menggunakan ini:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

Siapa pun yang menggunakan plugin CtrlP mungkin merasa pemetaan ini nyaman.

Dmitrii
sumber
3

Saya tahu ini sudah tua, tetapi jenis dukungan pada jawaban geedoubleya karena meskipun jawaban echristopherson informatif dan mengagumkan, jika ada yang menginginkan solusi cepat dan kotor:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
Jay
sumber
2

Sebagai alternatif untuk menggunakan tombol panah Anda, aktifkan tombol j& Anda kuntuk menggulir daftar autocomplete.

Melakukan hal ini mengubah baris saat ini untuk mencocokkan kata yang dipilih saat Anda menggulir.

Oleh karena itu Anda tidak perlu menekan enter karena kursor masih dalam mode sisipkan di akhir kata yang diganti.

Untuk mengaktifkannya, tambahkan ini ke .vimrc Anda (Terima kasih kepada yang lain di stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Secara terpisah, alih-alih menggunakan tombol panah, Anda bisa mengulang Ctrl-nyang akan mengutuk melalui opsi ( Ctrl-puntuk mundur) dan mengganti pada baris saat ini saat bergerak, tidak perlu Enteratau vim pemetaan tombol.

geedoubleya
sumber
Perilaku ini bisa sedikit membingungkan, karena keduanya 1) dalam mode insert dan 2) menafsirkan j dan k untuk melakukan hal-hal yang tidak mereka lakukan dalam mode insert. Secara khusus, Anda tidak dapat memilih entri menu dan kemudian mengikutinya langsung dengan sesuatu yang dimulai dengan j atau k.
echristopherson
Setuju, itu sebabnya saya memberikan pilihan lain jika ini adalah langkah yang terlalu jauh. Secara pribadi, saya lebih suka kebingungan daripada menggerakkan tangan saya untuk menggunakan panah.
geedoubleya