Hoàn tác <CR> trong chế độ chèn


21

Đôi khi trong chế độ chèn, tôi bị <CR>nhầm và tôi phải nhấn backspace nhiều lần (tùy thuộc vào vết lõm) để quay lại vị trí của mình.

ví dụ

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

Con trỏ là []và tôi nhấn <CR>:

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

Bây giờ tôi phải nhấn backspace hai lần để quay lại dòng trước (trường hợp này không tệ lắm nhưng nó không có nhiều vết lõm).

Bạn có biết một cách tốt hơn để làm?


1
ctrl+whai lần dường như hoạt động và khá dễ dàng
reergymerej

Câu trả lời:


10

Làm thế nào về:

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

<C-o>sẽ thực thi một lệnh chế độ bình thường ( :left 0), sẽ loại bỏ tất cả các thụt lề, điều này cũng sẽ đặt con trỏ của bạn ở đầu dòng. <BS>sẽ đưa bạn trở lại dòng cuối cùng.

Điều này hơi giống như một "ngược J".

Thật không may, ánh xạ Shift + Enter hoặc Ctrl + Enter dường như không thể, vì vậy tôi chọn <C-\>, là "gần nhập".


"Gần nhập" phụ thuộc vào bàn phím của bạn: Những người Anh có `` bên cạnh dịch chuyển bên trái :-)
TripeHound

2
Tại sao không sử dụng <C-u>thay thế <C-o>:left 0<CR>?
jamessan

@jamessan Điều này hoạt động như một "ngược J": Vì vậy, foo<CR>bar<C-\>sẽ để lại cho bạn với foobar. IMHO nó hữu ích hơn, nhưng YMMV.
Martin Tournoij

Đúng, nhưng điều tôi đang nói là <C-u>(tức là i_CTRL-U ) phải giống như <C-o>:left 0<CR>.
jamessan

1
@jamessan Vâng, điều đó phụ thuộc vào vị trí con trỏ. Nhập foo<CR>bar<C-u>sẽ để lại cho bạn foo<CR>(+ bất kỳ thụt lề tự động nào mà Vim có thể đã thêm). <C-o>:left 0<CR>sẽ luôn hành xử giống nhau bất kể vị trí con trỏ.
Martin Tournoij

21

Tôi có cái này trong tôi vimrc, phần thứ hai có liên quan:

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

Điều này làm gì: mỗi khi bạn nhấn Entertrong chế độ chèn, nó cũng sẽ "phá vỡ chuỗi hoàn tác, bắt đầu thay đổi mới" (xem h: i_CTRL-G_u). Điều này có nghĩa là, nếu bạn gặp Enterphải lỗi, giờ đây bạn có thể hoàn tác thay đổi của mình mà không xóa các dòng được chèn trước đó, bằng ESC u a, hoặc với Ctrl-o u, như Statox đề xuất. Về cơ bản, mỗi dòng có thể được hoàn tác riêng.

nguồn

EDIT / CẬP NHẬT: Nếu bạn tình cờ sử dụng mô phỏng Vim trong Emacs, còn gọi là chế độ ác , bạn có thể sử dụng gói này cho một hiệu ứng tương tự.


Bây giờ tôi tò mò về phần đầu tiên và làm thế nào <c-y>liên quan đến menu bật lên.
8

2
Xem câu trả lời này: vi.stackexchange.com/a/3844/1800 . Ctrl-ytrong chế độ chèn sẽ hoàn thành lựa chọn cửa sổ bật lên hiện tại và ánh xạ ở trên cũng sẽ cho phép Enterhoàn thành.
VanLaser 7/07/2015

Bí quyết đẹp. Tuy nhiên, tôi có thể thay thế phần cuối cùng "<c-g>u<cr>"bằng cách &paste ? "<cr>" : "<c-g>u<cr>"khác, nếu lần sau bạn dán nhầm 200 dòng HTML, bạn sẽ có rất nhiều điều thú vị khi hoàn tác nó. :)
lcd047

2
... và lời giải thích: khi pastebật, ánh xạ chế độ Chèn bị vô hiệu hóa (theo trợ giúp của Vim)
VanLaser

1
Tôi thích giải pháp này tốt hơn vì các giải pháp khác dựa trên Backspace, Ctrl-W và Ctrl-U có thể không hoạt động tùy thuộc vào cách đặt backspacetùy chọn.
doubleDown

4

Cách tôi làm điều đó là Ctrl-wBackspace.

Ctrl-wđể xóa từ cuối cùng (tôi quên nếu đây có phải là vim chuẩn hay không) và vì đó chỉ là khoảng trắng nên nó sẽ đưa tôi trở lại đầu dòng. Sau đó Backspacesẽ đưa tôi trở lại dòng trước đây.


Thật tuyệt, tôi không biết về việc Ctrl-wsử dụng trong chế độ chèn. Nhưng Carpetsmoker ♦ vẫn nhanh hơn. Do đó, ràng buộc mặc định của `Ctrl- \` dường như không hữu ích.
nobe4

1
Ctrl + w là "Vim tiêu chuẩn" ;-) Xem : :help i_CTRL-W. Và nhấn nó hai lần dường như cũng làm được mẹo?
Martin Tournoij

1
Tôi vừa thấy trên trang trợ giúp <C-u>có thể hữu ích hơn vì nó xóa tất cả các ký tự trên dòng mới
nobe4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.