Làm thế nào để tôi chỉ hoàn tác dán văn bản trong vim?


10

TL; DR; phiên bản - Làm cách nào để hoàn tác văn bản đã được dán từ bộ đệm sao chép hệ điều hành của tôi mà không hoàn tác văn bản khác đã nhập từ khi tôi chuyển sang chế độ chèn?

Mô tả dài hơn:

  1. Đặt một cái gì đó vào bộ đệm sao chép hệ điều hành của bạn (ví dụ: tô sáng một số văn bản và thực hiện Command-ctrên Mac)
  2. Chuyển sang chế độ chèn trong vim ( i)
  3. Nhập một cái gì đó (ví dụ asdf)
  4. Không thoát khỏi chế độ chèn, dán từ bộ đệm sao chép của bạn vào vim ( Command-vtrên Mac)
  5. Đánh escape
  6. Cố gắng hoàn tác dán ( u)

Nó hoàn tác mọi thứ từ lần cuối cùng bạn chuyển sang chế độ chèn. Nói cách khác, nó xóa đi asdfcộng với tất cả các văn bản tôi đã dán.

Làm thế nào để chỉ lùi lại văn bản mà dán vào? Tôi có phải luôn luôn thoát khỏi chế độ chèn và quay lại trước khi dán văn bản chỉ để có tùy chọn hoàn tác văn bản đã dán không?

Câu trả lời:


4

Một cách rõ ràng là thả ra và quay lại chế độ chèn trước khi dán. Nếu bạn mở rộng các lệnh dán, bạn cũng có thể tự động đặt điểm hoàn tác trước khi dán:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Trên đây là cho i_CTRL-Rlệnh tích hợp. Tôi không biết cách Command-vtriển khai trong MacVim, nhưng <C-G>uviệc chuẩn bị :imaplệnh sẽ đạt được hiệu quả tương tự.


1
Hoạt động như một cơ duyên, cảm ơn! Tôi có lẽ nên gắn bó với các phương pháp vim tiêu chuẩn để dán mọi cách.
Javid Jamae

Chỉ cần thêm điều này: :h i_CTRL-G_u(nghĩa là "ngắt chuỗi hoàn tác, bắt đầu thay đổi mới" trong chế độ chèn).
toraritte

2

Trong MacVim, bạn cần hủy ánh xạ Edit > Pastemục menu để ghi đè phím tắt, sau đó bạn có thể ánh xạ lại Cmd-V ( D-vtheo cách nói của MacVim) vào lệnh thích hợp trong mỗi chế độ. Tôi đã thêm nó vào ~/.gvimrcvà bây giờ mọi thứ hoạt động tuyệt vời:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

Điều <C-g>unày chỉ cần thiết trong chế độ chèn để sửa lịch sử hoàn tác; các noremapcnoremapchỉ đơn giản là để khôi phục lại các hành vi dán mặc định trong chế độ bình thường và lệnh.

Cảm ơn Ingo Karkat đã chỉ cho tôi đi đúng hướng ở đây.


1

Trên thực tế, giải pháp là trước tiên bạn phải chuyển sang chế độ lệnh (ví dụ Esc) và nhập lại chế độ chèn, nhưng nó chỉ hoạt động nếu tôi nhập thủ công nhưng có vẻ như "ngẫu nhiên" ngừng hoạt động nếu tôi kiểm tra ~/.vimrc. Google hoàn toàn không giúp đỡ.

Tôi dành rất nhiều thời gian để cố gắng khắc phục vấn đề này và tôi chỉ tìm ra lý do trong trường hợp của mình:

Không ánh xạ khóa dán giống với khóa dán hiện có của thiết bị đầu cuối

ví dụ: Ctrl+Shift+Vsẽ dán vào thiết bị đầu cuối Konsole của tôi, nhưng nếu tôi gán khóa này <C-S-v>vào ~/.vimrcthì "hoàn tác chỉ cho một lần dán thay vì nhiều lần dán" sẽ không hoạt động.

Trong trường hợp của tôi, tôi phải sử dụng <C-v>thay vì <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Trường hợp của bạn có thể khác, nhưng quan điểm là như nhau: không chỉ định xung đột khóa dán tương tự với khóa trình giả lập thiết bị đầu cuối hiện có.

Tôi đã chứng minh 100% kết luận này bằng cách đặt khóa dán thiết bị đầu cuối của mình thành Ctrl+Vvà bây giờ <C-v>ngừng hoạt động nhưng hoạt <C-S-v>động.

Cũng lưu ý rằng vim quá nhạy cảm và lạ. Tôi nhận ra rằng tôi phải sử dụng ivà sau đó 2 phím Phải theo cách thủ công để làm cho nó hoạt động ở vị trí con trỏ chính xác, điều đó có nghĩa là tôi cũng phải đặt ivà 2 phím Phải ~/.vimrc. Trường hợp của bạn có thể khác nhau, nhưng điểm giống nhau, đảm bảo các khóa + thứ tự trong ~ / .vimrc khớp 100% với nội dung bạn nhập thủ công.

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.