Làm thế nào tôi có thể dán (ghi đè) với vim?


31

Trong vimtôi sử dụng yyptất cả thời gian để kéo và dán các dòng. Tuy nhiên, nếu tôi muốn thay thế một dòng nhiều vị trí trong tệp, tôi không thể sử dụng yy p dd pdd xóa dòng đó vào bảng tạm / đăng ký. Trong khi tôi có lẽ nên biết cách sử dụng các thanh ghi tốt hơn, tôi cảm thấy có lẽ có một cách để pthay thế dòng hiện tại.

Câu trả lời:


27

Theo mặc định, các lệnh dán sử dụng thanh ghi "(không tên là tên) . Thực tế, bất kỳ lệnh nào ghi vào thanh ghi cũng ghi vào thanh ghi không tên, do đó, yanks, xóa và thay đổi đều ảnh hưởng đến nó. Đây là lý do tại sao trình tự yank-xóa-dán của bạn dán văn bản đã xóa thay vì văn bản được kéo dài.

Việc 0đăng ký có thể giúp đỡ ở đây. Bất kỳ lệnh yank nào không chỉ định một thanh ghi đều đặt văn bản được kéo vào thanh ghi 0(ngoài "). Nó không bị ảnh hưởng bởi việc xóa hoặc thay đổi các hoạt động, vì vậy bạn có thể sử dụng nó để dán một dòng có nhiều lần ngay cả khi bạn thực hiện xóa hoặc thay đổi trung gian.

  1. yy: Các thanh ghi 0"cả hai đều có dòng kéo dài.
  2. Di chuyển đến một dòng để thay thế.
  3. dd: Đăng ký "bây giờ có dòng bị xóa, nhưng đăng ký 0vẫn có dòng yank.
    "0P: Dán dòng yanks ban đầu từ thanh ghi 0.
  4. Di chuyển đến dòng tiếp theo để thay thế.
  5. dd"0P (giống như trên)

(Do cách định vị con trỏ hoạt động khi thay thế dòng cuối cùng của bộ đệm, bạn sẽ muốn sử dụng "0pthay vì "0P.)

Điều này rất gần với câu trả lời của Bruce Ediger , ngoại trừ việc bạn không phải chỉ định đăng ký khi ban đầu kéo dài. Sử dụng một hoặc nhiều thanh ghi có tên có thể rất tiện dụng mặc dù nếu bạn cần (ví dụ) thay thế một số dòng bằng AAA, nhưng các dòng khác bằng BBB(đưa AAAvào thanh ghi aBBBđăng ký b(hoặc để lại một trong số chúng trong thanh ghi 0), sau đó dán chúng cho phù hợp ).

Bạn cũng có thể dán từ 0chế độ hình ảnh trực quan ( V) để lưu tổ hợp phím : V"0p.

Nếu bạn không thích phải gõ "0, bạn có thể thấy ánh xạ thuận tiện hơn:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Một cách tiếp cận khác là xóa _sổ đăng ký ( . Khi bạn xóa nó, thanh "ghi không bị ảnh hưởng, vì vậy trình tự yank-xóa-dán của bạn vẫn có thể dán văn bản được kéo dài từ thanh ghi không tên.

  1. yy: Đăng ký 0"cả hai bây giờ có dòng kéo dài.
  2. "_dd: Không thay đổi các thanh ghi.
    P: Dán văn bản được kéo mạnh ban đầu từ thanh ghi ".

Một lần nữa, bạn có thể tìm thấy một ánh xạ thuận tiện hơn:

noremap <Leader>d "_d

2
Hoặc, tl; dr, chỉ cần sử dụng yy(di chuyển đến dòng để được thay thế) S<C-r>0<Esc>. Có lợi thế là có thể lặp lại với .lệnh.
tự đại diện

11

Có vẻ như Kevin có một câu trả lời khá hay, nhưng nếu bạn muốn đặt mắt vào từng dòng bạn xóa, sau đó thay thế, một giải pháp hơi khác tồn tại.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Loại công thức này cho phép bạn sử dụng khớp mẫu để tìm các dòng cần xóa và thay thế, và bạn có thể quay lại phần bắt đầu của tệp (1G) và tìm kiếm chuyển tiếp bao nhiêu lần tùy thích. Nếu tôi có 2 hoặc nhiều dòng để thu thập và đặt liên tục, tôi sử dụng "ayycho dòng đầu tiên, "byycho dòng thứ hai, "cyycho dòng thứ ba, v.v. Tôi đã tạo một thói quen (làm giảm tính tổng quát của công thức) để giảm tải tinh thần cho tôi.


Rất đẹp. Vì vậy, nếu tôi sử dụng "ayyvà sau đó dd, ddsẽ không thay thế những gì trong đó a, nhưng nếu tôi gõ pnó sẽ dán những gì vừa bị xóa bằng cách sử dụng dd. Và nếu tôi muốn thay thế những gì trong đó "ayybằng những gì tôi đang xóa, thì tôi sẽ sử dụng "add- đúng không?
cwd

"ayy sao chép một dòng vào thanh ghi 'a'." dd "cắt một dòng thành một thanh ghi mặc định, không phải 'a'. 'p' dán thanh ghi mặc định, đúng. Và có," thêm cắt một dòng vào thanh ghi 'a' , sẽ thay thế nội dung từ "lệnh ayy.
Bruce Ediger

5

Có một vài cách để làm điều này :s, tùy thuộc vào mức độ bạn muốn gõ. Cách dễ nhất là tìm kiếm đơn giản và thay thế:

:%s/find this line/replace with this/

Các %sẽ tìm kiếm toàn bộ tập tin và thay thế tất cả các lần xuất hiện.

Nếu bạn gõ quá nhiều cho bạn, bạn có thể kéo chuỗi đích ( yy) và sử dụng thanh ghi "(mặc định), chèn nó bằng Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Hoặc, nếu bạn có một bản sao của chuỗi thay thế, bạn có thể kéo hai cái đó thành các thanh ghi riêng biệt "ayy"byyđể kéo vào avà các bthanh ghi tương ứng (bạn có thể sử dụng bất kỳ chữ cái nào cho các thanh ghi của mình). Sau đó sử dụng Ctrl+r aCtrl+r bdán chúng vào các trường tìm kiếm và thay thế.

Không phải Bruce một lần, nhưng nếu bạn muốn kiểm tra các dòng trước khi thay thế chúng, chỉ cần thêm ctùy chọn:

:%s/find this line/replace with this/c

2

Bạn có thể sử dụng Vđể làm nổi bật dòng bạn muốn thay thế trong Chế độ trực quan và sau đó nhấn ppđể dán lên dòng đó.

Điều này chỉ thêm một tổ hợp phím, vì vậy nó có vẻ như là một giải pháp khá tốt.


Điều này không hoạt động: sau khi dán, bảng tạm chứa văn bản được đánh dấu bởiV
daniel kullmann

Chỉ một lần duy nhất p.
Aaron Thoma

2

Tôi sử dụng lệnh c"thay đổi" khá thường xuyên cho loại điều này, kết hợp với tìm kiếm thông thường. Bạn có thể tìm kiếm tệp cho từng dòng / đoạn văn bản bạn quan tâm và sau đó sử dụng n.các lệnh liên tiếp ( ncho lần tiếp theo và sau đó .để lặp lại thay đổi cuối cùng.)

/^hello- tìm dòng bắt đầu bằng lời chào;
c$goodbye- thay đổi dòng để tạm biệt;
n.- lặp lại tìm, lặp lại thay đổi

Nếu bạn muốn thay đổi dòng thành một trong tệp, bạn có thể sao chép nó vào bộ đệm đầu vào (giả sử GUI của bạn cho phép nó) và sau đó dán để lấy nội dung của lệnh thay đổi đầu tiên.

Như với tất cả mọi thứ vi, đó là một ý tưởng tốt để có nhiều tùy chọn trong túi của bạn, tùy thuộc vào loại chỉnh sửa bạn muốn làm.

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.