Làm cách nào để có thể chèn văn bản vào giữa dòng thành nhiều dòng trong Vim?


91

Giả sử tôi có mười dòng và tôi muốn thêm văn bản vào trước một số từ xuất hiện trong những dòng đó? Nó không nhất thiết phải ở đầu dòng.

Từ:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

đến:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Là nó cũng có thể không chỉ thêm vào trước các bar(nhưng thực sự vòm foovới bar(foo)?

Tôi cũng muốn có một cách nhanh chóng để nối các //bình luận thành nhiều dòng (bình luận kiểu C).

Tôi sử dụng Vim / GVim 7.2.


1
Phong cách C ý kiến được / * * / BCPL phong cách bình luận là //
William Pursell

Câu trả lời:


169

Chuyển đến đầu tiên foo, nhấn Ctrl- vđể vào chế độ khối trực quan và nhấn xuống cho đến khi tất cả các dòng với foođược đánh dấu. Sau đó nhấn Shift-i để chèn vào đầu (của khối). Khi bạn hoàn thành và nhấnEsc , các ký tự đã chèn sẽ được thêm vào mỗi dòng ở bên trái của khối được đánh dấu.

Để chèn vào cuối, nhấn lại Ctrl- v, di chuyển lên / xuống để đánh dấu tất cả các dòng bị ảnh hưởng và sau đó nhấn Endhoặc $để mở rộng vùng chọn cho đến hết các dòng. Bây giờ bạn có thể nhấn Shift- ađể thêm vào cuối tất cả các dòng, giống như trước đây với Shift- i.

Việc lựa chọn hình ảnh cũng có thể được thực hiện bằng các lệnh di chuyển bình thường. Vì vậy, để nhận xét toàn bộ khối trong C, bạn có thể di chuyển đến dấu ngoặc nhọn mở và nhập Ctrl- v % Shift- i // Esc.


5
Chỉ là một bổ sung: nếu Ctrl-V không bắt đầu chế độ khối trực quan trong Vim trên Windows, người ta nên sử dụng Ctrl-Q để thay thế.
Paul

3
Một biến thể của câu trả lời then là đánh dấu khối trực quan bằng shift + V chỉnh âm khối ở chế độ cũ:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / hậu tố_text / Lưu ý hơn "'< , '> "được vim in tự động khi bạn nhấn": ".
dimba

1
Để bỏ ghi chú, hãy sử dụng khối trực quan (đánh dấu bằng Ctrl + V). Một cột có dấu nhận xét "//" được đánh dấu, nhấn "d" để xóa nhận xét. đừng quên các nhận xét C ++ (/ ** /) quá :)
dimba

9
Điều đáng chú ý là trong Linux, tôi phải thoát khỏi chế độ Chèn trước khi tiền tố được áp dụng cho tất cả các dòng và đó là một số vốn tôi cần để chuyển sang chế độ chèn từ chế độ Trực quan - tức là Shift + I, nhập tiền tố, Escape, Escape.
Joshua Enfield

6
Điều này không hoạt động trên bột bả. Khi tôi nhấn ikhông có gì xảy ra. Khi tôi nhấn, shift+ivùng chọn sẽ biến mất nhưng tôi có thể chèn văn bản (ở vị trí hiện tại chỉ có con trỏ).
Jürgen Paul,

44

Để trả lời câu hỏi đầu tiên của bạn, bên dưới

:%s/foo/bar(&)/g

sẽ tìm kiếm foovà bao quanh mẫu phù hợp với bar(). Các/g chí làm điều này nhiều lần trong một dòng.

Vì bạn chỉ phù hợp foo, bạn có thể làm một việc đơn giản :s/foo/bar(foo)/g. Tuy nhiên, cách trên sẽ hoạt động nếu bạn quyết định đối sánh trên một biểu thức chính quy thay vì một từ đơn giản (ví dụ f[a-z][a-z]:). Dấu '&' ở trên đại diện cho những gì bạn đã khớp.


Tôi đã có một câu trả lời dài lớn với macro. Đây là cách dễ dàng hơn :-)
Brian Ramsay

Làm thế nào để bạn làm điều đó cho nhiều dòng? Một trường hợp thực tế là khi bạn có một khối mã bao gồm các dòng tương tự yêu cầu sự thay thế này.

Có vẻ như nó hoạt động trên tất cả các dòng ... lưu ý:% s và / g.
ojrac

những gì là thú vị là:% s / foo / bar (&) / gc không xác nhận - 'c' không có effect..Ugh

1
Văn bản giữa :sxác định nó hoạt động trên những dòng nào. Không có gì có nghĩa là chỉ dòng hiện tại. 1,30nghĩa là dòng 1 đến dòng 30 (bao gồm). '<,'>nghĩa là các dòng trong lựa chọn trực quan hiện tại.
rapter

17

Để đặt tiền tố cho một tập hợp các dòng, tôi sử dụng một trong hai cách tiếp cận khác nhau:

Một cách tiếp cận là chọn khối (được đề cập bởi sth). Nói chung, bạn có thể chọn một vùng hình chữ nhật với ctrl-Vtheo sau là di chuyển con trỏ. Khi bạn đã đánh dấu một hình chữ nhật, thao tác nhấn shift-Isẽ chèn các ký tự vào bên trái của hình chữ nhật hoặc shift-Asẽ nối chúng vào bên phải của hình chữ nhật. Vì vậy, bạn có thể sử dụng kỹ thuật này để tạo một hình chữ nhật bao gồm cột ngoài cùng bên trái của các dòng bạn muốn đặt tiền tố, nhấnshift-I , nhập tiền tố, rồi nhấn thoát.

Cách tiếp cận khác là sử dụng sự thay thế (như Brian Agnew đã đề cập). Sự thay thế của Brian sẽ ảnh hưởng đến toàn bộ tệp (% trong lệnh có nghĩa là "tất cả các dòng"). Để chỉ ảnh hưởng đến một vài dòng, cách tiếp cận đơn giản nhất là nhấn shift-V(bật chế độ dòng trực quan) khi đang ở dòng đầu tiên / dòng cuối cùng, sau đó di chuyển đến dòng cuối cùng / đầu tiên. Sau đó gõ:

:s/^/YOUR PREFIX/

Dấu ^ là một regex (trong trường hợp này là đầu dòng). Bằng cách nhập dòng này ở chế độ dòng trực quan, bạn sẽ thấy '<,'> được chèn tự động trước các dòng. Điều này có nghĩa là phạm vi thay thế sẽ là lựa chọn trực quan.

Mẹo bổ sung: nếu tiền tố của bạn chứa dấu gạch chéo, bạn có thể thoát chúng bằng dấu gạch chéo ngược hoặc bạn có thể sử dụng một ký tự dấu câu khác làm dấu phân tách trong lệnh. Ví dụ, để thêm nhận xét dòng C ++, tôi thường viết:

:s:^:// :

Để thêm hậu tố, phương pháp thay thế thường dễ dàng hơn trừ khi tất cả các dòng của bạn có cùng độ dài chính xác. Chỉ cần sử dụng $ cho mẫu thay vì ^ và chuỗi của bạn sẽ được thêm vào thay vì chờ xử lý trước.

Nếu bạn muốn thêm tiền tố và hậu tố đồng thời, bạn có thể làm như sau:

:s/.*/PREFIX & SUFFIX/

Dấu. * Khớp với toàn bộ dòng. Dấu & trong sự thay thế đưa văn bản phù hợp (toàn bộ dòng) trở lại, nhưng bây giờ nó sẽ có thêm tiền tố và hậu tố của bạn.

BTW: khi bình luận mã bạn có thể sẽ muốn bỏ ghi chú nó sau. Bạn có thể sử dụng visual-block ( ctrl-V) để chọn các dấu gạch chéo và sau đó nhấn d để xóa chúng hoặc bạn có thể sử dụng phép thay thế (có thể với lựa chọn dòng trực quan, được thực hiện bằng shift-V) để loại bỏ các dấu gạch chéo như thế này:

:s:// ::

6

: bình thường để giải cứu!

:%norm Wibar(

:%norm WEa)

: Norm (al) phát lại các lệnh như thể bạn đã gõ chúng:

W - chuyển sang từ tiếp theo

i - bắt đầu chế độ chèn

bar (- nhập chuỗi 'bar ('

Hoặc trong một dòng:

:%norm Wibar(ctrlvESCEa)

Nếu bạn đang chạy Windows, hãy nhập ctrlqthay vì ctrlv.


3

Tuy nhiên, một khả năng khác (có thể không quá hữu ích trong trường hợp thử nghiệm của bạn, nhưng hữu ích trong các tình huống khác) là cắt bỏ khu vực bạn muốn thay đổi bằng điểm.

  • Đặt con trỏ ở bất kỳ vị trí nào trên dòng trên cùng và nhấn 'a
  • Đặt con trỏ vào bất kỳ vị trí nào trong dòng cuối cùng và nhấn 'b
  • Ra lệnh :'a,'b s/foo/bar(&)/

Tôi thường thích chế độ khối trực quan nếu mọi thứ hiển thị trên màn hình và tôi thường thích đánh dấu nếu điểm bắt đầu và điểm dừng được phân tách bởi nhiều màn hình.


Nó phải là mthay vì 'để thiết lập một điểm đánh dấu mới. 'là để nhảy đến dòng của một điểm đánh dấu hiện có. `nhảy đến dòng và cột của điểm đánh dấu đó.
tiktak 27/02/18

1

Một biểu thức chính quy đơn giản khác là:

%s/^/<text you want to prepend>/

0

Đối với các nhận xét kiểu C, hãy sử dụng câu trả lời regexp của Brian, và khớp ở phần cuối dòng $rồi chèn vào.

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.