2009-02-28 46 views
5

câu hỏi trước đây của tôi có vẻ là một chút mơ hồ, tôi sẽ nói lại nó:Vim sao chép và dán

Tôi có một tập tin như thế này:

copythis abc 
replacethis1 xyz 
qwerty replacethis2 
hasfshd replacethis3 fslfs 
And so on... 

LƯU Ý: replacethis1, replacethis2, replacethis3, ... có thể là bất kỳ từ nào

Làm cách nào để thay thế "replacethis1", "replacethis2", "replacethis3", .. từ bằng từ "copythis" bằng cách sử dụng các lệnh vim tối thiểu.

Một cách tôi có thể làm là bởi các bước sau:

  1. delete "replacethis1", "replacethis2", "replacethis3", .. cách nhau bởi dấu dw '
  2. bản sao "copythis" sử dụng 'yw '
  3. di chuyển con trỏ đến vị trí "replacethis1" là và thực hiện' p '; di chuyển con trỏ đến vị trí "replacethis2" đã và đang làm 'p' và cứ thế ...

Có cách nào tốt hơn để làm điều này trong VIM (sử dụng ít lệnh vim hơn)?

Trả lời

6

Vì bạn đã thay đổi câu hỏi của bạn, tôi sẽ làm theo cách này:

Di chuyển đến "replacethis1" đầu tiên và nhập cw (thay đổi từ), sau đó nhập "copythis" theo cách thủ công.

Di chuyển đến "replacethis" tiếp theo, nhấn. (lặp lại hoạt động cuối cùng)

Di chuyển sang "replacethis" tiếp theo, nhấn.,

v.v. v.v.

Nếu "copythis" là một từ nhỏ, tôi nghĩ đây là giải pháp tốt nhất.

+0

tùy thuộc vào cách bạn chuyển sang các từ được thay thế khác nhau, có thể tốt hơn nếu sử dụng ciw (hoặc caw) thay vì cw. Đối với cw để làm việc bạn cần phải ở đầu replacethis. – user55400

0

Bạn đã thử thay thế chuỗi chưa?

%s/replacethis/copythis 

Một loạt các thông số khác có thể tinh chỉnh thay thế. Đi sâu vào sự giúp đỡ của Vim để biết thêm chi tiết. Một số ví dụ khác here.

1
:%s/copythis/replacethis/g 

Để thay thế tất cả các lần xuất hiện của bản sao này bằng replacethis. Hoặc bạn có thể chỉ định một loạt các số dòng như:

:8,10 s/copythis/replacethis/g 

Lưu ý,/g ở cuối sẽ cho biết thay thế tất cả các lần xuất hiện. Nếu bạn rời khỏi nó, nó sẽ chỉ làm cái đầu tiên.

+0

Vui lòng xem câu hỏi được trả lời của tôi –

+0

Bạn nhận được hai điều khoản bị đảo ngược. –

0

nếu u cần phải làm về cơ bản giống hành động nhiều lần - swap từ ngày 1 một dòng với chữ thứ hai của dòng tiếp theo, tôi nói rằng bạn có thể ghi lại một macro và gọi nó là bất cứ khi nào bạn cần phải

+0

Vui lòng xem câu hỏi được sửa lại của tôi –

1
  1. tạo lập bản đồ này:

    : map z cwcopythis^[

    (^ [là các ký tự thoát, bạn có thể gõ nó trong vim sử dụng tổ hợp phím Ctrl + V Ctrl + [)

  2. chuyển đến từng từ bạn muốn thay thế và nhấn z

+0

Điều này không hoạt động khi dw ghi đè bộ đệm sao chép –

+0

Nó sẽ hoạt động, đó là đề xuất tương tự như của tôi nhưng nó tạo ra một ràng buộc tùy chỉnh thay vì sử dụng lệnh dấu chấm dựng sẵn. Có thể tốt hơn nếu bạn không thay thế tất cả các từ cùng một lúc. –

+0

Tôi đã sử dụng dw ban đầu nhưng đã nhận ra lỗi ngay khi tôi nhấn bài đăng, vì vậy tôi đã chỉnh sửa nó :) – Adnan

4

Số cần được bao gồm và có số d có nhiều hơn một ví dụ mỗi dòng:

:%s/replacethis\d/copythis/g 
3

Cho rằng "replacethis [1-3]" có thể là những lời không liên quan tùy ý, thư mục/Cách nhanh nhất đơn giản nhất để làm điều này trên toàn cầu sẽ là:

:%s/replacethis1\|replacethis2\|replacethis3/copythis/g 

(Lưu ý rằng bạn cần sử dụng \ | để có được các đường ống hoạt động như "hoặc". Nếu không, vim sẽ tìm kiếm chữ | . Ký tự)

1

Tôi đã đấu tranh với điều này trong một thời gian dài quá, tôi nghĩ rằng tôi chỉ làm việc ra cách sạch:

Sử dụng bất cứ lệnh là sạch nhất để đưa copythis vào đăng ký r:

/copythis 
"rye 

Sau đó đi đến việc thay đổi và thay thế bằng nội dung của r:

/replacethis 
cw<CTRL-R>r<ESC> 

Sau đó, bạn có thể chỉ n.n.n.n.n.n.n. cho phần còn lại của họ, hoặc nếu họ đang cực kỳ di fferent chỉ cần đi đến đầu của mỗi và nhấn .

Điều quan trọng là thay thế và dán trong một bước để bạn có thể sử dụng . sau đó.

0

Bạn có thể remap ví dụ: phím m ở chế độ thông thường để xóa từ dưới con trỏ và dán bộ đệm: :nnoremap m "_diwP. Sau đó, bạn chỉ có thể sao chép từ mong muốn, di chuyển con trỏ đến bất kỳ nơi nào trên từ được thay thế và nhập m.

EDIT: Ánh xạ tới m là một ý tưởng tồi vì nó được sử dụng để đánh dấu vị trí. Nhưng bạn có thể sử dụng ví dụ: ;.

Các vấn đề liên quan