Cách chèn văn bản khi bắt đầu lựa chọn nhiều dòng trong vi / Vim


423

Trong Vim , làm cách nào để chèn các ký tự ở đầu mỗi dòng trong vùng chọn?

Chẳng hạn, tôi muốn bình luận một khối mã bằng cách thêm //vào đầu mỗi dòng giả sử hệ thống bình luận ngôn ngữ của tôi không cho phép bình luận khối như thế nào /* */. Làm thế nào tôi sẽ làm điều này?

Câu trả lời:


748
  • Nhấn Escđể vào 'chế độ lệnh'
  • Sử dụng Ctrl+ Vđể vào chế độ khối trực quan
  • Di chuyển Up/ Downđể chọn các cột của văn bản trong các dòng bạn muốn bình luận.
  • Sau đó nhấn Shift+ ivà nhập văn bản bạn muốn chèn.
  • Sau đó nhấn Esc, đợi 1 giây và văn bản được chèn sẽ xuất hiện trên mỗi dòng.

Để biết thêm thông tin và đọc, hãy xem " Chèn văn bản vào nhiều dòng " trong Vim Tips Wiki.


6
Bummer duy nhất với điều này là nó xuất hiện Ctrl + V bị ghi đè trong GVIM.
Jordan Parmer

14
Không phải với tôi (trên linux) nó không phải
pixelbeat

23
Bạn có thể sử dụng Ctrl-Q để thay thế trong gVim (như: trợ giúp Ctrl-V giải thích) nhưng bạn cần sử dụng hjkl để điều hướng trong chế độ này thay vì các phím mũi tên
Gareth

9
Nếu ctrl-v của bạn bị ghi đè trong windows gvim, bạn nên chỉnh sửa vimrc toàn cầu để dừng bao gồm cả mswin.vim.
Graywh

18
Bất cứ ý tưởng tại sao điều này sẽ không làm bất cứ điều gì sau khi đẩy esc? Tôi đã đợi như 10 giây để một cái gì đó xảy ra trên chưa đầy một trăm dòng - Đừng bận tâm, tôi đã Shift + vkhông cố gắng CTRL + v. @ vkaul11 Có lẽ giống như những gì bạn đã làm lol
Tek

186

Điều này thay thế phần đầu của mỗi dòng bằng "//":

:%s!^!//!

Điều này thay thế phần đầu của mỗi dòng được chọn (sử dụng chế độ trực quan để chọn) bằng "//":

:'<,'>s!^!//!

Lưu ý rằng gv(ở chế độ bình thường) khôi phục lựa chọn hình ảnh cuối cùng, điều này đôi khi có ích.


3
Cảm ơn! Làm cho ý nghĩa tổng thể. Và xóa văn bản như sau: '<,'> s! ^ // !!
Jordan Parmer

4
Ý nghĩa của dấu chấm than trong câu trả lời trên là gì? (:% s! ^! //!)
Henrik K

19
@HKK, thông thường người ta sử dụng ký tự gạch chéo chuyển tiếp / làm dấu phân cách cho lệnh tìm kiếm và thay thế. Trong trường hợp này, chúng tôi đang chèn một dấu gạch chéo về phía trước như một phần của tìm kiếm và thay thế để chúng tôi sử dụng một dấu phân cách thay thế, cụ thể là ký tự cảm thán!
nhà sư mạng

+1 Điều này hoạt động trong VsVim trong đó (Ctrl + V) (Shiift + I) Esc không.
Seth Reno

4
+1, không biết bạn có thể sử dụng một cái gì đó khác như delimiter regex (ở đây tôi đã sử dụng /và cần phải thoát khỏi //trong :s/^/\/\/thay vì viết :s!^!//)
Hashbrown

83

Mẫu chung cho tìm kiếm và thay thế là:

:s/search/replace/

Thay thế lần xuất hiện đầu tiên của 'tìm kiếm' bằng 'thay thế' cho dòng hiện tại

:s/search/replace/g

Thay thế tất cả các lần xuất hiện của 'tìm kiếm' bằng 'thay thế' cho dòng hiện tại, 'g' là viết tắt của 'toàn cầu'

Lệnh này sẽ thay thế mỗi lần xuất hiện của 'tìm kiếm' bằng 'thay thế' cho dòng hiện tại. % Được sử dụng để tìm kiếm trên toàn bộ tập tin. Để xác nhận mỗi thay thế tương tác nối thêm 'c' để xác nhận:

:%s/search/replace/c

Xác nhận tương tác thay thế 'tìm kiếm' bằng 'thay thế' cho toàn bộ tệp

Thay vì% ký tự, bạn có thể sử dụng phạm vi số dòng (lưu ý rằng ký tự '^' là ký tự tìm kiếm đặc biệt cho đầu dòng) :

:14,20s/^/#/

Chèn ký tự '#' ở đầu dòng 14-20

Nếu bạn muốn sử dụng một ký tự nhận xét khác (như //) thì hãy thay đổi dấu phân cách lệnh của bạn:

:14,20s!^!//!

Chèn một chuỗi ký tự '//' ở đầu dòng 14-20

Hoặc bạn luôn có thể thoát // các ký tự như:

:14,20s/^/\/\//

Chèn một chuỗi ký tự '//' ở đầu dòng 14-20

Nếu bạn không thấy số dòng trong trình chỉnh sửa của mình, chỉ cần gõ như sau

:set nu

để xóa phần đầu #: thay vì: 14,20s / # / ^ /, bạn nên sử dụng: 14,20s / # //
cn1h

1
@ cn1h Tôi nghĩ điều này cũng sẽ thay thế khác #trong dòng. Bạn nên sử dụng ^#thay thế.
ankush981

Cảm ơn đã giải thích những điều cơ bản. Thật tốt khi biết tại sao điều gì đó xảy ra.
didierCH

38

Một cách khác có thể dễ dàng hơn cho người mới:

 some█
 code
 here

Đặt con trỏ trên dòng đầu tiên, ví dụ:

gg

và nhập nội dung sau để vào chế độ chèn và thêm văn bản của bạn:

I / / Space

 // █some
 code
 here

Nhấn Escđể quay lại chế độ lệnh và sử dụng máy in:

j . j .

 // some
 // code
 //█here

jlà một lệnh chuyển động để đi xuống một dòng và .lặp lại lệnh chỉnh sửa cuối cùng bạn đã thực hiện.


3
Đó thực sự là đơn giản :). Nếu bạn gặp rắc rối với nó có thể là do bạn đang gõ một thanh (biểu tượng khác với \) |thay vì viết hoa I. Tôi nghĩ rằng đó là một |lúc đầu.
cokedude

1
Nếu tôi làm "5." nó xóa 5 ký tự từ cùng một dòng. Làm cách nào để tôi xóa 5 ký tự cùng một lúc khỏi mỗi dòng?
Rahul Prasad

1
@RahulPrasad Giả sử bạn có 25 dòng, sau đó bắt đầu ở phía trước của dòng đầu tiên, chỉ cần ghi 5xj vào một đăng ký và chơi mà đăng ký 24 lần, ví dụ: qa5xjq25 @ a Nhưng sẽ tốt hơn nếu bạn đăng bài này như một câu hỏi thực tế nếu nó chưa tồn tại ...
Ninegrid

26

Và một cách khác:

  • Di chuyển đến đầu của một dòng
  • vào chế độ Khối hình ảnh ( CTRL- v)
  • chọn các dòng bạn muốn (di chuyển lên / xuống bằng j/ khoặc nhảy đến một dòng có [dòng] G)
  • báo chí I(đó là vốn i)
  • nhập ký tự nhận xét
  • nhấn ESC

20

Điều này thêm #vào đầu mỗi dòng:

:%s/^/#/

Và mọi người sẽ ngừng phàn nàn về việc bạn thiếu các kịch bản bình luận đúng.


2
Điều gì sẽ xảy ra nếu bạn muốn thêm # trên chỉ các dòng được chọn (hoặc một vài)
Rahul Prasad

15

Nếu bạn muốn nhận được siêu ưa thích về nó, hãy đặt nó trong .vimrc của bạn:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

Sau đó, bất cứ khi nào trong chế độ hình ảnh, bạn có thể nhấn \cđể c omment khối và \uđể u ncomment nó. Tất nhiên, bạn có thể thay đổi các phím tắt đó thành bất cứ thứ gì.


Nâng cao vì nó giới thiệu một cái gì đó mới - vmap!
ankush981

11

Một cách khác:

:'<,'>g/^/norm I//

/^/chỉ là một mô hình giả để phù hợp với mọi dòng. normcho phép bạn chạy các lệnh chế độ bình thường theo sau. I//nói để vào chế độ chèn trong khi nhảy con trỏ đến đầu dòng, sau đó chèn văn bản sau (hai dấu gạch chéo).

:g thường thuận tiện để thực hiện một số thứ phức tạp trên nhiều dòng, trong đó bạn có thể muốn chuyển giữa nhiều chế độ, xóa hoặc thêm dòng, di chuyển con trỏ xung quanh, chạy một loạt các macro, v.v. Và bạn có thể bảo nó chỉ hoạt động trên các dòng phù hợp với một mô hình.


1
Trên thực tế, lệnh g không cần thiết. Điều này sẽ làm :: '<,'> Norm I //
Cyber ​​Oliveira

1
Và: s cũng tốt hơn để sử dụng trong trường hợp này.
màu xám

Đây là câu trả lời hữu ích nhất.
Hòa bình

3

Để bình luận các khối mã, tôi thích plugin NERD Commenter .

Chọn một số văn bản:

Shift-V
...select the lines of text you want to comment....

Bình luận:

,cc

Không chú ý:

,cu

Hoặc chỉ cần chuyển trạng thái nhận xét của một dòng hoặc khối:

,c<space>

2

Tôi có thể giới thiệu EnhVerify plugin .

ví dụ. đặt cái này vào vimrc của bạn:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

sau đó bạn có thể nhận xét / bỏ ghi chú các dòng (đã chọn) bằng ', c'


3
Bạn cũng có thể sử dụng Nerd Commenter tại vim.org/scripts/script.php?script_id=1218
Nathan Fellman

1

Đánh dấu khu vực được nhận xét là một khối trực quan ( <C-V)

và làm c#<ESC>p

  1. cthay đổi nó thành "#"
  2. để nó lại

Nếu bạn làm điều đó thường xuyên, hãy xác định một đoạn cắt ngắn (ví dụ \q) trong .vimrc của bạn

:vmap \q c#<ESC>p

1

Trong trường hợp lựa chọn nhiều dòng của ai đó thực sự là một đoạn văn, không cần phải chọn thủ công các dòng. vim có thể làm điều đó cho bạn:

  1. vip: chọn và đánh dấu toàn bộ đoạn
  2. shift-i: chèn văn bản ở đầu dòng
  3. escape: để chế độ chèn / vào chế độ bình thường [bắt đầu dòng vẫn được chọn]
  4. escape: bỏ chọn bắt đầu dòng

0

Để chèn "ABC" vào đầu mỗi dòng:

1) Chuyển đến chế độ lệnh

2):% định mức I ABC


Điều này thêm văn bản ở bên trái của ký tự không phải không gian đầu tiên trong dòng.
Kingsley
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.