Batalkan <CR> dalam mode sisipan

21

Kadang-kadang dalam mode insert saya terkena <CR>kesalahan dan saya harus menekan backspace beberapa kali (tergantung pada indentasi) untuk kembali ke tempat saya sebelumnya.

misalnya

<div>
  <p> This is some text []</p>
</div>

Kursornya []dan saya tekan <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Sekarang saya harus menekan backspace dua kali untuk kembali ke baris sebelumnya (case ini tidak terlalu buruk tetapi tidak memiliki banyak indentasi).

Apakah Anda tahu cara yang lebih baik untuk dilakukan?

nobe4
sumber
1
ctrl+wdua kali tampaknya bekerja dan cukup mudah
reergymerej

Jawaban:

10

Bagaimana tentang:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>akan menjalankan perintah mode normal ( :left 0), yang akan menghapus semua indent, ini juga akan meletakkan kursor Anda di awal baris. <BS>akan membuat Anda kembali ke baris terakhir.

Ini agak seperti "mundur J".

Sayangnya, pemetaan Shift + Enter atau Ctrl + Enter sepertinya tidak mungkin, jadi saya memilih <C-\>, sebagai "dekat enter".

Martin Tournoij
sumber
"Near the enter" tergantung pada keyboard Anda: Yang UK memiliki `` di sebelah shift sebelah kiri :-)
TripeHound
2
Mengapa tidak menggunakan <C-u>bukan <C-o>:left 0<CR>?
jamessan
@ jamessan Ini berfungsi sebagai "mundur J": Jadi foo<CR>bar<C-\>akan meninggalkan Anda dengan foobar. IMHO itu lebih berguna, tapi YMMV.
Martin Tournoij
Benar, tapi yang saya katakan adalah bahwa <C-u>(yaitu, i_CTRL-U ) harus sama dengan <C-o>:left 0<CR>.
jamessan
1
@ Joessan Yah, itu tergantung pada posisi kursor. Mengetik foo<CR>bar<C-u>akan memberi Anda foo<CR>(+ indentasi apa pun yang mungkin ditambahkan Vim). <C-o>:left 0<CR>akan selalu berperilaku sama terlepas dari posisi kursor.
Martin Tournoij
21

Saya punya ini di saya vimrc, bagian kedua relevan:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

Kegunaannya: setiap kali Anda menekan Enterdalam mode insert, itu juga akan "memecah urutan undo, memulai perubahan baru" (lihat h: i_CTRL-G_u). Ini berarti, jika Anda terkena Enterkesalahan, Anda sekarang dapat membatalkan perubahan Anda tanpa menghapus garis yang dimasukkan sebelumnya, baik dengan ESC u a, atau dengan Ctrl-o u, seperti yang diusulkan Statox. Pada dasarnya, setiap baris dapat dibatalkan secara terpisah.

sumber

EDIT / PEMBARUAN: Jika Anda menggunakan emulasi Vim di Emacs, alias mode jahat , Anda dapat menggunakan paket ini untuk efek yang serupa.

VanLaser
sumber
Sekarang saya ingin tahu tentang bagian pertama dan bagaimana <c-y>hubungannya dengan menu pop-up.
8bittree
2
Lihat jawaban ini: vi.stackexchange.com/a/3844/1800 . Ctrl-ydalam mode insert akan menyelesaikan pemilihan popup saat ini, dan pemetaan di atas akan memungkinkan Enteruntuk menyelesaikan juga.
VanLaser
Trik yang bagus. Namun, saya mungkin akan mengganti bagian terakhir "<c-g>u<cr>"dengan &paste ? "<cr>" : "<c-g>u<cr>", jika lain kali Anda menyisipkan secara tidak sengaja 200 baris HTML Anda akan bersenang-senang membatalkannya. :)
lcd047
2
... dan penjelasannya: ketika pasteaktif, pemetaan mode Insert dinonaktifkan (sesuai bantuan Vim)
VanLaser
1
Saya suka solusi ini lebih baik karena solusi lain yang mengandalkan Backspace, Ctrl-W, dan Ctrl-U mungkin tidak berfungsi tergantung pada bagaimana backspaceopsi diatur.
doubleDown
4

Cara saya melakukannya adalah Ctrl-wBackspace.

Ctrl-wuntuk menghapus kata terakhir (saya lupa apakah ini vim standar atau tidak), dan karena hanya spasi, ini akan membawa saya kembali ke awal baris. Kemudian Backspaceakan membawaku kembali ke baris sebelumnya dimana aku berada.

Juan Enrique Muñoz Zolotoochin
sumber
Manis, saya tidak tahu tentang Ctrl-wpenggunaan dalam mode insert. Tetapi ♦ Carpetsmoker masih lebih cepat. Dengan demikian pengikatan standar `Ctrl- \` tampaknya tidak berguna.
nobe4
1
Ctrl + w adalah "standar Vim" ;-) See: :help i_CTRL-W. Dan menekannya dua kali sepertinya juga berhasil?
Martin Tournoij
1
Saya baru saja melihat pada halaman bantuan yang <C-u>mungkin lebih bermanfaat karena menghapus semua karakter di baris baru
nobe4