Dán nhiều lần


93

Cách tốt nhất thay thế nhiều dòng bằng nội dung của khay nhớ tạm là gì?

Vấn đề tôi đang gặp phải là khi tôi kéo một dòng và dán nó trên một dòng khác, "yank" được thay thế bằng dòng tôi vừa thay thế. Bây giờ, nếu tôi muốn thay thế một dòng khác với cùng một dòng, tôi phải quay lại và kéo nó một lần nữa.

Phải có một cách tốt hơn để làm điều này.

Câu trả lời:


108

Tôi có cái này trong .vimrc của mình:

xnoremap p pgvy

(lưu ý: điều này sẽ chỉ hoạt động với thanh ghi mặc định, nhưng ánh xạ này rất dễ nhớ). Viết một phiên bản phức tạp hơn sẽ có thể. Ngoài ra, bạn vẫn có thể sử dụng P để có được hành vi cũ.


28
Tài giỏi. 'p' để dán, 'gv' để chọn lại những gì đã chọn ban đầu. 'y' để sao chép lại.
Amjith

@SibbsGambling, có lẽ đang sử dụng phiên bản trước Vim 7? Sau đó, nâng cấp Vim hoặc sử dụng v thay vì x ( vnoremap). Tệp trợ giúp Vim version7.txttrạng thái xmap và smap đã xuất hiện trong phiên bản đó.
Benoit

1
@Benoit Hmm, tôi có 7.4.52, nhưng không xnoremapvà cũng không vnoremaphoạt động
Sibbs Gambling

8
Tại sao đây không phải là hành vi mặc định ??
Seth

27

"0nên có nội dung của yank của bạn. Nó hơi tẻ nhạt hơn khi gõ, nhưng "0pnên làm những gì bạn muốn.

Ngoài ra, không chọn và thay thế các dòng cũ ở phía trước. Nếu bạn tìm thấy những dòng đó bằng một tìm kiếm, chỉ cần nhấn đi đánh n.lại (sau một ký tự đầu tiên p), sau đó khi chúng được dán tất cả, hãy thực hiện nddtheo sau càng nhiều n.càng tốt.

Chuyển đổi tinh thần lớn nhất mà tôi cần thực hiện khi chuyển sang Vim là tìm ra cách áp dụng các chỉnh sửa nhóm một cách tuần tự. Tức là thay vì thực hiện một loạt các chỉnh sửa trên một dòng và sau đó thực hiện một loạt các chỉnh sửa giống nhau trên một dòng khác, tôi sẽ thực hiện chỉnh sửa đầu tiên trên một loạt các dòng (sử dụng .để tạo hiệu ứng tuyệt vời), sau đó chỉnh sửa thứ hai trên một loạt dòng, v.v ... Ngoài ra, việc sử dụng macro có thể hữu ích vì chúng rất tuyệt vời, nhưng đôi khi hơi tẻ nhạt hơn để hoạt động chính xác với những thay đổi "phức tạp".


2
âm thanh như một nơi mà regex với xác nhận :%s/.../.../gclệnh loại có thể gần gũi hơn với những gì bạn muốn
Milimetric

@Milimetric +1 không biết bạn có thể xác nhận như vậy.

1
Ủng hộ vì macro có thể khiến điều này không thành vấn đề. Chỉ cần thực hiện chỉnh sửa một lần, và bạn có thể làm một cái gì đó giống như 5@m(cho một macro tên m)
skatenerd

Cảm ơn vì lời giải thích tuyệt vời. Bây giờ tôi sử dụng xnoremap p "0ptrong ~ / .vimrc
nexayq

13

Tôi thường sử dụng một sổ đăng ký khác, sao chép dòng bạn cần vào một số đăng ký có tên "ayvà sau đó dán từ đó"ap


11

Khi bạn dán lên một vùng chọn trong Vim, nó sẽ thay thế thanh ghi mặc định bằng nội dung của vùng chọn. Nếu việc dán lên một lựa chọn đang xóa sạch nội dung của thanh ghi khay nhớ tạm thì rất có thể bạn có dòng sau trong .vimrc của mình

set clipboard=unnamed

Một tùy chọn là loại bỏ điều đó và sử dụng đăng ký khay nhớ tạm rõ ràng "+

Một tùy chọn khác là sử dụng bất kỳ thanh ghi nào được đặt tên rõ ràng khác (az). Sau lần dán đầu tiên, hãy kéo dòng trở lại "cví dụ và sau đó sử dụng "cpđể dán từ đó trở đi.


Trên thực tế, mặc định (ở đây, trên Ubuntu) là clipboard = autoselect; vẫn còn, cảm ơn vì câu trả lời thanh lịch nhất cho đến nay.
Tobu

8

sử dụng npở đâu nlà số lượng thời gian bạn muốn dán các dòng ví dụ 3psẽ dán 3 dòng.


7
Không hoạt động khi bạn muốn dán cùng một dòng lên các dòng không liền kề.
Tobu

@Tobu nhưng nó trả lời tiêu đề của câu hỏi này 'làm thế nào để bạn dán nhiều lần'
icc97

6

Thay vì sử dụng sao chép / dán, thường tốt hơn là sử dụng lệnh đối tượng văn bản chẳng hạn như ciwđể thay đổi từ bên trong. Phương pháp này có ưu điểm là có thể lặp lại dễ dàng bằng .lệnh lặp.

  1. yiw Yank từ bên trong (sao chép từ dưới con trỏ, nói "đầu tiên").
  2. ... Di chuyển con trỏ đến một từ khác (nói "thứ hai").
  3. ciw<C-r>0 Thay đổi "thứ hai", thay thế nó bằng "đầu tiên" (là Ctrl-R).
  4. ... Di chuyển con trỏ đến một từ khác (nói "thứ ba").
  5. . Thay đổi "thứ ba", thay thế nó bằng "đầu tiên".

1
ciw<C-r>0không hoạt động trong trường hợp của tôi. ciwthay đổi đối với chế độ chèn <C-r>trở nên vô dụng. Ist có một lời giải thích dễ dàng cho điều này? Có thể có để làm với texteditor (Tôi không sử dụng pur VIM nhưng VIM Bàn phím bindings trong RStudio)
Bushroot

@Bushroot <C-r>được thiết kế để sử dụng trong chế độ chèn, vì đó là cách bạn dán từ một thanh ghi mà không cần rời khỏi chế độ chèn — trong Vim, nghĩa là; Tôi không quen với RStudio nhưng tôi đoán rằng bạn nói đúng và họ chưa triển khai ràng buộc khóa cụ thể này.
côn trùng

@Sean H: Vâng. Họ đã không thực hiện ràng buộc khóa. Nó hoạt động tốt trong VIM và ngay cả với các ràng buộc VIM trong các chương trình khác (ví dụ: Visual Studio Code).
Bushroot
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.