Cách nhanh chóng để bình luận / dòng chú thích trong Vim là gì?


1171

Tôi có một tệp mã Ruby mở trong vi, có những dòng nhận xét với #:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

Nói rằng tôi muốn bỏ ghi chú tất cả các dòng trong phần đầu tiên def ... end. Cách hiệu quả để làm điều đó trong Vim là gì?

Nói chung, tôi đang tìm kiếm một cách dễ dàng và trôi chảy để bình luận và dòng chú thích. Ở đây tôi đang xử lý mã Ruby, nhưng nó có thể là JavaScript ( //) hoặc Haml ( -#).


20
Câu trả lời được chấp nhận nên được thay đổi thành một trong những câu trả lời có hướng dẫn chi tiết về cách thực hiện các khối nhận xét / không ghi chú mà không cần sử dụng plugin. Các câu trả lời được chấp nhận hiện nay về cơ bản là chỉ là một liên kết đến một plugin của bên thứ ba.
ngất xỉu

Câu trả lời được đánh giá tốt nhất không đề cập đến bất kỳ plugin nào, @rationalis nhận xét của bạn là sai lệch, bạn có thể vui lòng sửa nó hoặc xóa nó, cảm ơn bạn.
bonobo

Câu trả lời:


181

Tôi sử dụng kịch bản NERD Commenter . Nó cho phép bạn dễ dàng nhận xét, bỏ ghi chú hoặc chuyển đổi nhận xét trong mã của bạn.

Như đã đề cập trong các ý kiến :

Đối với bất kỳ ai bị nhầm lẫn bởi cách sử dụng, nhà lãnh đạo mặc định là "\" vì vậy 10 \ cc sẽ nhận xét mười dòng và 10 \ cu sẽ bỏ qua mười dòng đó


Hấp dẫn! Tôi đọc tài liệu và thấy có một "bình luận gợi cảm" - chỉ cần sử dụng "\ cs". Đối với Ruby, nó sẽ sử dụng =begin=endnhận xét nhiều dòng thay vì thẻ băm.
Hegwin

Tôi nghĩ rằng đó không phải là cách nhanh nhất để làm điều đó với vim vì nó yêu cầu phải cài đặt một plugin. Ngoài ra, câu trả lời tốt nhất đã nhận được nhiều phiếu hơn nhưng nó không được đánh dấu là giải pháp.
whifyill

137
Đừng dừng lại ở đây. Hầu hết các câu trả lời được bình chọn dưới đây mà không có yêu cầu của bất kỳ plugin nào. stackoverflow.com/a/15588798/2117868stackoverflow.com/a/1676690/2117868
kuttumiah

@whirmill Tôi nghĩ "tốt nhất" thực sự phụ thuộc vào trường hợp sử dụng. Chế độ khối trực quan nhanh hơn nếu tôi muốn chuyển đổi nhận xét một lần trong đời. Nhưng nếu tôi không cài đặt plugin và muốn tạo ra càng ít lần nhấn phím càng tốt để chuyển đổi nhận xét và không phải phân biệt thao tác giữa thêm hoặc xóa nhận xét - thì đây có thể là "câu trả lời tốt nhất".
Carolus

@Carolus Tôi đã đồng ý với bạn nếu câu hỏi đã bắt đầu với "cách tốt nhất" thay vì "cách nhanh chóng".
whertill

2543

Đối với những nhiệm vụ tôi sử dụng hầu hết các lựa chọn khối thời gian .

Đặt con trỏ của bạn vào #ký tự đầu tiên , nhấn CtrlV(hoặc CtrlQcho gVim) và đi xuống cho đến dòng nhận xét cuối cùng và nhấn x, sẽ xóa tất cả các #ký tự theo chiều dọc.

Để bình luận một khối văn bản gần như giống nhau:

  1. Đầu tiên, đi đến dòng đầu tiên bạn muốn bình luận, nhấn CtrlV. Điều này sẽ đặt trình soạn thảo trong VISUAL BLOCKchế độ.
  2. Sau đó, sử dụng phím mũi tên và chọn cho đến dòng cuối cùng
  3. Bây giờ nhấn ShiftI, sẽ đưa trình chỉnh sửa vào INSERTchế độ và sau đó nhấn# . Điều này sẽ thêm một hàm băm vào dòng đầu tiên.
  4. Sau đó nhấn Esc(cho nó một giây) và nó sẽ chèn một #ký tự trên tất cả các dòng được chọn khác.

Đối với phiên bản rút gọn của vim được vận chuyển với debian / ubfox theo mặc định, hãy nhập : s/^/#bước thứ ba thay vào đó (có thể xóa bất kỳ dấu sáng nào còn lại của ký tự đầu tiên của mỗi dòng :nohl).

Dưới đây là hai bản ghi màn hình nhỏ để tham khảo trực quan.

Bình luận: Bình luận

Không chú ý: Thất bại


87
Theo mặc định, đó là CTRL + V. Phiên bản windows của gvim sử dụng Ctrl + Q vì Ctrl + V đã được sử dụng để dán.
R. Martinho Fernandes

8
@amindfv Ctrl + V, n(trong đó n là dòng num - 1), j, n(trong đó n num số độ dài của chuỗi ký tự nhận xét - 1), l, x.
michael.bartnett

28
Làm thế nào bạn sẽ làm điều này với '//'?
AustinT

74
Bạn có thể nhấp Esc hai lần để không đợi giây đó;)
Ahmed Hegazy

45
Điều này đã không làm việc cho tôi. Shift-Tôi đã chuyển sang chế độ chèn đơn giản.
Lão máu

828

Để nhận xét các khối trong vim:

  • nhấn Esc(để rời khỏi chỉnh sửa hoặc chế độ khác)
  • nhấn ctrl+ v(chế độ khối trực quan)
  • sử dụng các phím / mũi tên để chọn các dòng bạn muốn (nó sẽ không làm nổi bật mọi thứ - không sao cả!)
  • Shift+ i(vốn I)
  • chèn văn bản bạn muốn, ví dụ %
  • nhấn EscEsc

Để khối uncomment trong vim:

  • nhấn Esc(để rời khỏi chỉnh sửa hoặc chế độ khác)
  • nhấn ctrl+ v(chế độ khối trực quan)
  • sử dụng các phím / mũi tên để chọn các dòng không ghi chú.

    Nếu bạn muốn chọn nhiều ký tự, hãy sử dụng một hoặc kết hợp các phương thức sau:

    • sử dụng các phím mũi tên trái / phải để chọn thêm văn bản
    • để chọn khối văn bản sử dụng phím shift+ / mũi tên
    • bạn có thể liên tục ấn các phím xóa bên dưới, như nút xóa thông thường

  • nhấn dhoặc xđể xóa các ký tự, lặp đi lặp lại nếu cần thiết

34
@amelia: Phím tắt nhận xét không phù hợp với tôi. Shift + tôi đưa tôi đến chế độ chèn. Có phụ thuộc vào phiên bản vim không?
dùng3527975

7
Tại sao nó mất một giây?
Conor Patrick

24
Vấn đề duy nhất tôi có với câu trả lời này là nó bảo bạn sử dụng các phím mũi tên .
warmconemotel

6
Nhấn Esc hai lần thay thế. :)
Aaron Alphonsus

22
Lúc đầu, các bình luận cho phép tôi không hoạt động nhưng sau khi đọc nó lại hoạt động tốt: 1. đảm bảo bạn sử dụng Ctrl-V, không phải V cho lựa chọn 2. khi chèn nó sẽ xuất hiện khi bạn chỉ sửa đổi một dòng 3. tất cả các lần chèn xảy ra khi bạn nhấn Esc vào cuối
timurb

335

Đôi khi, tôi bị bóc vỏ vào một hộp từ xa nơi các plugin và .vimrc của tôi không thể giúp tôi hoặc đôi khi NerdVerer đã hiểu sai (ví dụ: JavaScript được nhúng trong HTML).

Trong những trường hợp này, một lựa chọn công nghệ thấp là normlệnh tích hợp, chỉ chạy bất kỳ lệnh vim tùy ý nào ở mỗi dòng trong phạm vi chỉ định của bạn. Ví dụ:

Bình luận với # :

1. visually select the text rows (using V as usual)
2. :norm i#

Điều này chèn "#" vào đầu mỗi dòng. Lưu ý rằng khi bạn nhập: phạm vi sẽ được điền vào, vì vậy nó sẽ thực sự trông giống như:'<,'>norm i#

Không chú ý # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

Điều này xóa ký tự đầu tiên của mỗi dòng. Nếu tôi đã sử dụng một nhận xét 2 char như // thì tôi chỉ cần làm :norm xxđể xóa cả hai ký tự.

Nếu các bình luận được thụt lề như trong câu hỏi của OP, thì bạn có thể neo phần xóa của mình như thế này:

:norm ^x

có nghĩa là "đi đến ký tự không phải không gian đầu tiên, sau đó xóa một ký tự". Lưu ý rằng không giống như lựa chọn khối, kỹ thuật này hoạt động ngay cả khi các bình luận có vết lõm không đều!

Lưu ý : Vì normthực sự chỉ là thực thi các lệnh vim thông thường, bạn không bị giới hạn về nhận xét, bạn cũng có thể thực hiện một số chỉnh sửa phức tạp cho từng dòng. Nếu bạn cần ký tự thoát như một phần của chuỗi lệnh của mình, hãy nhập ctrl-v rồi nhấn phím thoát (hoặc thậm chí dễ dàng hơn, chỉ cần ghi một macro nhanh và sau đó sử dụng định mức để thực thi macro đó trên mỗi dòng).

Lưu ý 2 : Tất nhiên bạn cũng có thể thêm ánh xạ nếu bạn thấy mình sử dụng normnhiều. Ví dụ: đặt dòng sau vào ~ / .vimrc cho phép bạn nhập ctrl-nthay vì :normsau khi thực hiện lựa chọn trực quan của bạn

vnoremap <C-n> :norm

Lưu ý 3 : Đôi khi vim xương trần không cónorm lệnh được biên dịch vào nó, vì vậy hãy chắc chắn sử dụng phiên bản tăng cường, tức là / usr / bin / vim, không phải / bin / vi

(Cảm ơn @Manbroski và @rakslice vì những cải tiến được đưa vào câu trả lời này)


Tôi nghĩ rằng đây là cách để đi cho đến khi tôi cuộn để đọc câu trả lời này stackoverflow.com/a/1676690/850996 Lựa chọn khối bằng CTRL + V (trái ngược với lựa chọn dòng với SHIFT + V) cho phép kiểm soát bình luận tốt hơn nhiều chèn nhân vật diễn ra.
Shyam Habarakada

2
@Shyam Kỹ thuật ctrl-v kết hợp với các lệnh chỉ chọn khối đặc biệt là điều mà hầu hết các câu trả lời khác khuyên dùng; tuy nhiên cá nhân tôi thấy kỹ thuật "định mức" mà tôi đã mô tả là dễ dàng hơn vì nó không đưa ra bất kỳ cú pháp mới nào ngoài chính lệnh Norm, vì vậy tôi có thể sử dụng lại những gì tôi đã biết về vim.
Magnus

2
Đối với việc bỏ ghi chú một khối thụt lề, rất hữu ích để nói :norm ^x. Phương pháp này nói chung có lợi thế là làm việc với các lựa chọn vùng (ví dụ: vi{sẽ chọn bên trong dấu ngoặc nhọn). Bộ chọn đối tượng văn bản như vậy không làm việc với Visual Block.
ivan-k

1
À, tôi chỉ cần tìm ra nó - trên centos 6 /bin/vilà vim 7.2, nhưng nó là một bản dựng khác so với /usr/bin/vim, và nó có các tính năng như thế này bị tắt.
rakslice

4
Đây là câu trả lời tốt nhất. Đặc biệt là khi kết hợp với vipđể chọn cả một đoạn.
meh

122

Tôi có những điều sau đây .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

Bây giờ bạn có thể nhập ,ccđể nhận xét một dòng và ,cubỏ ghi chú một dòng (hoạt động cả ở chế độ bình thường và trực quan).

(Tôi đã đánh cắp nó từ một số trang web nhiều năm trước vì vậy tôi không thể giải thích hoàn toàn cách thức hoạt động của nó nữa :). Có một bình luận nơi nó được giải thích.)


Lối tắt tôi nên sử dụng là gì? Tôi không thể chắc chắn từ chính mã vim!
gideon

ở chế độ bình thường hoặc trực quan, sử dụng ", cc" (chuỗi 3 ký tự) để nhận xét dòng hiện tại và ", cu" để bỏ ghi chú dòng hiện tại.
Dan

8
tôi thích nó :)! cảm ơn! Bên cạnh đó, tôi không thấy khó giải thích. a) nó lặp lại một lệnh (không đệ quy [xem cái này] ( stackoverflow.com/questions/3776117/ mẹo ) vì vậy bây giờ khi bạn nhấn, cc: ... điều này được thực thi. b) bây giờ về cơ bản đây là một sed (s) Lệnh / what / Towhat / where) thay đổi ^ (bắt đầu dòng) thành ký tự nhận xét được đặt chính xác dựa trên loại tệp bạn đã mở c) như đối với các điều im lặng họ chỉ chặn đầu ra từ các lệnh. d): nohlsearch ngăn nó làm nổi bật tìm kiếm sed
ramrunner

14
Lưu ý, đây không phải là cách chính xác để tải autocommands. Họ nên ở trong một nhóm, nếu không họ sẽ được thêm vào vim nhiều lần và gây ra rất nhiều chậm. Xem: learnvimscriptthehardway.stevelosh.com/ch chương / 14.html . Tôi đã thêm câu trả lời của mình cho câu hỏi này.

Đẹp. Đây là một câu trả lời thực tế cho câu hỏi tôi đã có về cách (bỏ) nhận xét trong khi bạn có một lựa chọn khối.
Erwin Rooijakkers

120

Chỉ định dòng nào để bình luận trong vim:

Hiển thị số dòng:

:set number

sau đó

:5,17s/^/#/     this will comment out line 5-17

hoặc này:

:%s/^/#/        will comment out all lines in file

11
Vì bạn chỉ thay đổi ký tự đầu tiên của mỗi dòng, bạn không cần "g" ở cuối
Magnus

1
Một số vims trên các hộp nhúng (như openwrt) không có chế độ trực quan .. Vì vậy, điều này thật tuyệt vời :)
kim0

bạn có thể giải thích tại sao :%s/^/#/gsẽ bình luận ra tất cả các dòng? Tôi đã tự hỏi ký hiệu phần trăm%
Bin

18
Và để bỏ ghi chú những dòng này bạn có thể viết: 5,17s / ^ # /
Iraklis Moutidis

Tuyệt quá! Nó thực sự hoạt động độc đáo với lựa chọn khối như: va{hoặc với varruby.
Artur Małecki

58

Đây là cách tôi làm điều đó:

  1. Chuyển đến ký tự đầu tiên trên dòng đầu tiên bạn muốn nhận xét.

  2. Nhấn Ctrl+ qtrong GVIM hoặc Ctrl+ vtrong VIM, sau đó đi xuống để chọn ký tự đầu tiên trên các dòng để nhận xét.

  3. Sau đó nhấn cvà thêm ký tự nhận xét.

Uncommenting hoạt động theo cùng một cách, chỉ cần gõ một khoảng trắng thay vì ký tự nhận xét.


44
ccũng xóa ký tự đầu tiên. Câu trả lời của CMS đã đúng, tức là nhấn Irồi gõ (các) ký tự nhận xét và sau đó Esc(đây là trên windows vim)
Samaursa

6
Điều này hoạt động, ngoại trừ 'r' cần được nhấn ở bước ba, không phải 'c'.
David Baucum

cách khác, bạn có thể nhấn ESChai lần sau khi nhấn cvà điều đó sẽ thực hiện thủ thuật
nihiser

Tất cả các tùy chọn này là phá hủy của ký tự đầu tiên trên dòng.
Giô

36

Tôi đã đưa ra một bổ sung đơn giản cho tệp .vimrc của tôi hoạt động khá tốt và có thể được mở rộng dễ dàng. Bạn chỉ cần thêm một kiểu tệp mới vào comment_map và trưởng nhóm bình luận của nó.

Tôi đã thêm ánh xạ vào chế độ bình thường và trực quan, nhưng bạn có thể ánh xạ lại bất cứ thứ gì bạn thích. Tôi chỉ thích có chức năng kiểu 'chuyển đổi'. Một con gấu có nhiều ánh xạ, v.v.

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

Ghi chú:

Tôi không sử dụng bất kỳ cuộc gọi lại hoặc móc vào các loại tệp / tải, vì tôi thấy chúng làm chậm quá trình khởi động của Vim hơn .vimrcchức năng / bản đồ tĩnh nhưng đó chỉ là sở thích của tôi. Tôi cũng đã cố gắng làm cho nó đơn giản và hiệu quả. Nếu bạn sử dụng autocommands, bạn cần chắc chắn đưa chúng vào nhóm autocommand nếu không các cuộc gọi lại được thêm vào filetype nhiều lần trên mỗi tệp và gây ra sự suy giảm hiệu năng.


1
Tôi hoàn toàn mới với vim, tôi nên nhấn nút nào để chuyển đổi chức năng được ánh xạ? <leader><Space>Tuyên bố đó ở phía dưới là gì?
Jens Kohl

2
Bạn có thể thay thế <Leader> bằng một khóa như <,>. Sau đó, bạn nhấn, SPACE và nó sẽ chuyển trạng thái nhận xét của dòng. Nhà lãnh đạo là bất kể nhà lãnh đạo của bạn là ai, <lãnh đạo> mặc định của Vim là \, nhưng bạn có thể đặt riêng của mình như "let mapleader = ','"

Câu trả lời tuyệt vời, mặc dù một điều khó chịu, các khối bình luận đã có một số bình luận, sẽ trao đổi bình luận cho các dòng không bình luận. QtCreator ví dụ chỉ xóa các bình luận nếu tất cả các dòng không trống có các bình luận hàng đầu, nếu không thì thêm một bình luận hàng đầu.
ideaman42

1
Tôi đã tạo một phiên bản hơi khác bằng cách sử dụng \zs\zethủ thuật regex, mã trở nên nhỏ hơn một chút. bạn có thể thấy nó ở đây
SergioAraujo

33

Chuyển đổi ý kiến

Nếu tất cả những gì bạn cần là chuyển đổi các bình luận Tôi muốn đi với bình luận.vim của tpope .

nhập mô tả hình ảnh ở đây

Cài đặt

Tác nhân gây bệnh:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim-cắm:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Tùy chỉnh thêm

Thêm phần này vào tệp .vimrc của bạn: noremap <leader>/ :Commentary<cr>

Bây giờ bạn có thể chuyển đổi nhận xét bằng cách nhấn Leader+ /, giống như Sublime và Atom.


cảm ơn! nó sẽ hỗ trợ bình luận css bên trong một html nào đó trong tương lai?
Dan Oak

25

Sử dụng Control-V để chọn hình chữ nhật của văn bản: chuyển đến #ký tự đầu tiên , nhập Ctrl+ V, di chuyển sang phải một lần, rồi xuống, cho đến cuối bình luận. Bây giờ gõ x: bạn đang xóa tất cả các #ký tự theo sau bởi một khoảng trắng.


18

Đây là một phần của tôi .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

Ở chế độ bình thường và ở chế độ trực quan, điều này cho phép tôi nhấn ,icđể chèn nhận xét và ,rcxóa nhận xét.


Điều này rất hữu ích cho người mới bắt đầu học cách viết riêng .vimrc.
thú vị nhất vào

3
mapbao gồm các chế độ thông thường và trực quan, do đó bạn không cần các vmapdòng
doubleDown

Nơi tốt hơn là trong after/ftplugin/ruby.vim.
Santosh Kumar

cũng sử dụng <leader>ic<leader>rc
Hans Kristian

15

Tôi sử dụng vim 7.4 và điều này làm việc cho tôi.
Giả sử chúng tôi đang bình luận / không chú ý 3 dòng.

Bình luận:

nếu dòng không có tab / không gian ngay từ đầu:
ctrl + Vsau đó jjjrồi shift + I (cappital i)sau đó //sau đó esc esc
nếu dòng có tab / không gian ở đầu bạn vẫn có thể làm các việc trên hoặc hoán đổi cho c:
ctrl + Vrồi jjjsau đó csau đó //sau đó esc esc

Để bỏ ghi chú:

nếu các dòng không có tab / dấu cách ở đầu:
ctrl + Vthì jjjsau ll (lower cap L)đóc

nếu các dòng có tab / dấu cách ở đầu, sau đó bạn khoảng trắng trên và esc
ctrl + Vsau jjjđó ll (lower cap L)sau cđó spacesau đóesc



9

Với 30 câu trả lời trước tôi, tôi sẽ cố gắng đưa ra một giải pháp thậm chí còn dễ dàng hơn: Chèn một câu #ở đầu dòng. Sau đó đi xuống một dòng và nhấn dot ( .). Để lặp lại, đừng j, ., j, ., vv ... để bỏ ghi chú, loại bỏ một #(bạn có thể nhấn xtrên #), và làm điều ngược lại sử dụng k, ., vv ...


1
Đó là một câu trả lời rất đơn giản ngay cả người mới bắt đầu cũng có thể hiểu và sử dụng. Tuy nhiên, nó hoạt động khá chậm trên số lượng lớn các dòng để bình luận. Để giải quyết vấn đề đó, bạn có thể ghi I#<Esc>jvào bộ đệm - nói, c- và sau đó làm 10@c, hoặc bất kỳ số dòng nào phù hợp với bạn.
Daerdemandt

9

Làm thế nào để bỏ ghi chú ba dòng sau trong vi:

#code code
#code
#code code code

Đặt con trỏ lên #biểu tượng phía trên bên trái và nhấn CtrlV. Điều này đặt bạn trong chế độ khối hình ảnh. Nhấn mũi tên xuống hoặc Jba lần để chọn cả ba dòng. Sau đó nhấn D. Tất cả các ý kiến ​​biến mất. Để hoàn tác, nhấn U.

Cách nhận xét ba dòng sau trong vi:

code code
code
code code code

Đặt con trỏ lên trên ký tự bên trái, nhấn CtrlV. Điều này đặt bạn trong chế độ khối hình ảnh. Nhấn hoặc Jba lần để chọn cả ba dòng. Sau đó nhấn:

I//Esc

Đó là thủ đô I, // và Escape.

Khi bạn nhấn ESC, tất cả các dòng được chọn sẽ nhận được biểu tượng nhận xét bạn đã chỉ định.


1
nếu bạn bỏ lỡ băm "phía trên bên trái", bạn có thể nhấn o để di chuyển con trỏ sang "phía bên kia" trong chế độ trực quan.
dylnmc

Tôi nghĩ rằng điều này là tốt nhất để sử dụng. Không cần bất kỳ bên thứ ba nào, chỉ cần sử dụng vim bản địa
Ardi Nusawan

câu trả lời hay nhất, đơn giản và không có bất kỳ bên thứ ba nào
vào

8

Có, đã có 33 câu trả lời (chủ yếu lặp đi lặp lại) cho câu hỏi này.

Đây là một cách tiếp cận khác về cách nhận xét các dòng trong Vim: chuyển động . Ý tưởng cơ bản là bình luận hoặc bỏ dòng bằng cách sử dụng cùng một phương pháp như kéo một đoạn bằng cách gõ yiphoặc xóa 2 dòng bằng cách gõ dj.

Cách tiếp cận này sẽ cho phép bạn làm những việc như:

  • ccjđể bình luận 2 dòng tiếp theo, và cukbỏ ghi chú chúng;

  • cci{để bình luận một khối ra, và cui{bỏ ghi chú nó;

  • ccipđể bình luận toàn bộ một đoạn, và cuipbỏ ghi chú nó.

  • ccGđể bình luận tất cả mọi thứ cho đến dòng cuối cùng, và cuggđể bỏ qua mọi thứ cho đến dòng đầu tiên.

Tất cả những gì bạn cần là 2 chức năng hoạt động theo chuyển động và 2 ánh xạ cho mỗi chức năng. Đầu tiên, ánh xạ:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(Xem hướng dẫn về g@toán tử và operatorfuncbiến.)

Và bây giờ các chức năng:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

Sửa đổi các biểu thức chính quy ở trên cho phù hợp với sở thích của bạn về vị trí #nên có:


"Chuyển động hoàn toàn mới [...]" có vẻ hơi vượt trội: các plugin t_comment và vim-bình luận, cả hai đều có trước câu trả lời này, cho phép bạn nhận xét bằng cách sử dụng chuyển động.
Giàu

Đồ tốt! Nâng cao. (Tôi cũng nghĩ rằng tôi có thể bắt đầu sử dụng phương pháp này thay vì plugin tôi đã sử dụng trước đó, vì vậy cảm ơn bạn đã viết nó!)
Rich

7

Nếu bạn đã biết số dòng, thì n,ms/# //sẽ hoạt động.


thực sự mà có lẽ nên được: n, ms / ^ \ s # // Vì bạn có thể đã dẫn khoảng trắng và có thể không làm theo băm với một.
Bỏ qua Huffman

7

Tôi đánh dấu các dòng đầu tiên và cuối cùng (ma và mb), sau đó thực hiện: 'a,' bs / ^ # //


6

Tôi sử dụng EnhizedVerify . Nó nhận xét mọi thứ tôi cần (ngôn ngữ lập trình, tập lệnh, tập tin cấu hình). Tôi sử dụng nó với các ràng buộc chế độ trực quan. Chỉ cần chọn văn bản bạn muốn bình luận và nhấn co / cc / cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

5

Tôi đã kết hợp câu trả lời của Phil và jqno và đưa ra các nhận xét bỏ qua với khoảng trắng:

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

5

Có plugin thay đổi cuộc sống này bằng cách tpopegọivim-commentary

https://github.com/tpope/vim-commentary

Plugin này cung cấp :

  • Sự tỉnh táo
  • Nhận xét thụt lề đúng cách
  • Không bình luận ra những dòng trống / không cần thiết

Cách sử dụng :

  • Cài đặt qua Vundle (hoặc Pathogen tôi đoán).
  • Đánh dấu văn bản của bạn và nhấn :sẽ hiển thị như:<,'>
  • Gõ bình luận ở đây :<,'>Commentaryvà nhấn Enter.
  • Bùng nổ. Nụ của bạn đã hoàn thành

vim-commentary(giống như tất cả các plugin của tpope) có phần thưởng là vim thành ngữ. gc= "đi bình luận", gcap= "đi bình luận một đoạn", v.v.
Goldenratio

Đây có thể chỉ là một bản chỉnh sửa câu trả lời Tim Pope của Jim Stewart?
jdk1.0

5

Câu trả lời này hữu ích nhất nếu bạn không thể cài đặt plugin nhưng bạn vẫn muốn các ký tự nhận xét của mình tuân theo các mức thụt đầu dòng hiện có.

Câu trả lời này là ở đây để 1) hiển thị mã chính xác để dán vào một .vimrcđể có được vim 7.4+để làm khối cho ý kiến / uncommenting trong khi vẫn giữ mức thụt đầu dòng với 1 phím tắt trong chế độ trực quan và 2) để giải thích nó. Đây là mã:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

Làm thế nào nó hoạt động:

  • let b:commentChar='//': Điều này tạo ra một biến trong vim. các bđây đề cập đến phạm vi, mà trong trường hợp này được chứa vào bộ đệm, có nghĩa là tập tin hiện đang mở. Các ký tự nhận xét của bạn là các chuỗi và cần được gói trong dấu ngoặc kép, các trích dẫn không phải là một phần của những gì sẽ được thay thế khi bật các bình luận.

  • autocmd BufNewFile,BufReadPost *...: Autocommands kích hoạt những thứ khác nhau, trong trường hợp này, đây là những kích hoạt khi một tệp mới hoặc tệp đọc kết thúc với một phần mở rộng nhất định. Sau khi được kích hoạt, thực thi lệnh sau, cho phép chúng ta thay đổi commentChartùy thuộc vào filetype. Có nhiều cách khác để làm điều này, nhưng chúng khó hiểu hơn đối với người mới (như tôi).

  • function! Docomment(): Hàm được khai báo bằng cách bắt đầu bằng functionvà kết thúc bằng endfunction. Chức năng phải bắt đầu bằng một vốn. các !Đảm bảo rằng chức năng này ghi đè bất kỳ chức năng trước đó định nghĩa là Docomment()với phiên bản này của Docomment(). Không có !, tôi có lỗi, nhưng đó có thể là do tôi đang xác định các hàm mới thông qua dòng lệnh vim.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Thực thi cuộc gọi một lệnh. Trong trường hợp này, chúng tôi đang thực thi substitute, có thể lấy một phạm vi (theo mặc định đây là dòng hiện tại), chẳng hạn như %cho toàn bộ bộ đệm hoặc '<,'>cho phần được tô sáng. ^\s*là regex để khớp với bắt đầu của một dòng theo sau bởi bất kỳ khoảng trắng nào, sau đó được thêm vào (do &). Ở .đây được sử dụng để nối chuỗi, vì escape()không thể được gói trong dấu ngoặc kép. escape()cho phép bạn thoát ký tự commentCharphù hợp với các đối số (trong trường hợp này \/) bằng cách thêm chúng vào a \. Sau đó, chúng tôi nối lại một lần nữa với phần cuối của substitutechuỗi, trong đó cóecờ. Cờ này cho phép chúng tôi thất bại trong âm thầm, có nghĩa là nếu chúng tôi không tìm thấy kết quả khớp trên một dòng nhất định, chúng tôi sẽ không hét lên về nó. Nhìn chung, dòng này cho phép chúng ta đặt một ký tự nhận xét theo sau là khoảng trắng ngay trước văn bản đầu tiên, nghĩa là chúng ta giữ mức thụt lề.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Điều này tương tự như lệnh dài lớn cuối cùng của chúng tôi. Duy nhất với cái này, chúng tôi có \v, đảm bảo rằng chúng tôi không phải trốn thoát (), và 1, đề cập đến nhóm chúng tôi đã thực hiện với chúng tôi (). Về cơ bản, chúng tôi khớp một dòng bắt đầu với bất kỳ khoảng trắng nào và sau đó là ký tự nhận xét của chúng tôi theo bất kỳ khoảng trắng nào và chúng tôi chỉ giữ bộ khoảng trắng đầu tiên. Một lần nữa, echúng ta hãy âm thầm thất bại nếu chúng ta không có một nhân vật bình luận trên dòng đó.

  • let l:line=getpos("'<")[1]: điều này đặt một biến giống như chúng ta đã làm với ký tự nhận xét của mình, nhưng lđề cập đến phạm vi cục bộ (cục bộ cho hàm này). getpos()trong trường hợp này, bắt đầu đánh dấu của chúng tôi và [1]phương tiện chúng tôi chỉ quan tâm đến số dòng, không phải những thứ khác như số cột.

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: bạn biết cách làm ifviệc match()kiểm tra xem thứ thứ nhất có chứa thứ thứ hai không, vì vậy chúng tôi lấy dòng mà chúng tôi bắt đầu tô sáng và kiểm tra xem nó có bắt đầu bằng khoảng trắng theo sau là ký tự nhận xét của chúng tôi không. match()trả về chỉ mục nơi điều này là đúng và -1nếu không tìm thấy kết quả khớp nào. Vì ifđánh giá tất cả các số khác không là đúng, chúng tôi phải so sánh đầu ra của chúng tôi để xem nó có lớn hơn -1 không. So sánh vimtrả về 0 nếu sai và 1 nếu đúng, đó là điều ifmuốn xem để đánh giá chính xác.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapcó nghĩa là ánh xạ lệnh sau trong chế độ trực quan, nhưng không ánh xạ đệ quy (có nghĩa là không thay đổi bất kỳ lệnh nào khác có thể sử dụng theo các cách khác). Về cơ bản, nếu bạn là người mới làm quen với vim, hãy luôn sử dụng noremapđể đảm bảo bạn không phá vỡ mọi thứ. <silent>có nghĩa là "Tôi không muốn lời nói của bạn, chỉ hành động của bạn" và bảo nó không in bất cứ điều gì lên dòng lệnh. <C-r>là thứ chúng ta lập bản đồ, đó là ctrl + r trong trường hợp này (lưu ý rằng bạn vẫn có thể sử dụng Cr bình thường để "làm lại" trong chế độ bình thường với ánh xạ này). C-uhơi khó hiểu, nhưng về cơ bản, nó đảm bảo bạn không bị mất dấu của việc làm nổi bật hình ảnh của bạn (theo câu trả lời này, nó làm cho lệnh của bạn bắt đầu với '<,'>đó là những gì chúng ta muốn).callỞ đây chỉ nói với vim để thực thi chức năng mà chúng ta đã đặt tên và<cr>đề cập đến việc nhấn enternút. Chúng ta phải nhấn nó một lần để thực sự gọi hàm (nếu không chúng ta vừa gõ call function()vào dòng lệnh, và chúng ta phải nhấn nó một lần nữa để thay thế chúng ta đi qua tất cả các cách (không thực sự chắc chắn tại sao, nhưng bất cứ điều gì).

Dù sao, hy vọng điều này sẽ giúp. Điều này sẽ lấy bất cứ thứ gì được tô sáng bằng v, Vhoặc C-v, kiểm tra xem dòng đầu tiên có được nhận xét hay không, nếu có, cố gắng bỏ ghi chú tất cả các dòng được tô sáng và nếu không, hãy thêm một lớp ký tự nhận xét cho mỗi dòng. Đây là hành vi mong muốn của tôi; Tôi không chỉ muốn nó chuyển đổi xem mỗi dòng trong khối có được nhận xét hay không, vì vậy nó hoạt động hoàn hảo với tôi sau khi hỏi nhiều câu hỏi về chủ đề này.



3

Bạn có thể sử dụng bình luận vim của tpope ( https://github.com/tpope/vim-commentary ) bạn có thể sử dụng nó như sau:

Vào chế độ trực quan bằng cách nhấn

'v'

Sau đó nhấn

'j' repeatedly or e.g 4j to select 4 row

Bây giờ tất cả những gì bạn phải làm với lựa chọn là nhập các phím:

'gc'

Điều này sẽ nhận xét tất cả các lựa chọn, để bỏ sót các phím repead:

'gc'

3

Đây là một lớp lót cơ bản dựa trên phương pháp C-vtiếp theo được Inêu ở trên.

Lệnh này ( :Comment) thêm một chuỗi đã chọn vào đầu của bất kỳ dòng nào được chọn.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

Thêm dòng này vào của bạn .vimrcđể tạo một lệnh chấp nhận một đối số duy nhất và đặt đối số ở đầu mỗi dòng trong lựa chọn hiện tại.

Ví dụ: nếu văn bản sau được chọn:

1
2

và bạn chạy cái này : :Comment //, kết quả sẽ là:

//1
//2

3

Bắt đầu với những ý tưởng trong câu trả lời ở đây, tôi bắt đầu chức năng bình luận của riêng mình. Nó bật / tắt bình luận. Nó có thể xử lý những thứ như //print('blue'); //this thing is bluevà chỉ cần bật bình luận đầu tiên. Hơn nữa, nó thêm ý kiến ​​và một không gian duy nhất nơi không có khoảng trắng đầu tiên và không ở ngay đầu dòng. Thông thường, nó không cần sao chép các khoảng trắng một cách không cần thiết, nhưng sử dụng các mức thu phóng (: h \ zs để được trợ giúp) để tránh công việc phụ này, khi bình luận và dòng thụt vào. Hy vọng nó sẽ giúp một số người theo chủ nghĩa tối giản ngoài kia. Đề nghị được chào đón.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>

1
Tôi đã thực hiện một phiên bản hơi khác của giải pháp của bạn cũng khôi phục vị trí con trỏ, tôi muốn ý kiến ​​của bạn về điều đó. trên github
SergioAraujo 23/03/18

Mát mẻ. Bạn có thể chỉnh sửa bài viết của tôi và thêm giải pháp của bạn (vì tương tự)!
chước

Nó đã thay đổi để tránh dấu gạch chéo ngược c, cpp, java và sử dụng dấu phân cách khác thay thế để tránh E488. Ngoài ra, khoảng cách thay đổi cho java, cpp vì các bình luận có ba ký tự, // cộng với khoảng trắng, điều này được thực hiện bởi l: space.
SergioAraujo

3

Tôi sử dụng bình luận.vim từ Jasmeet Singh Anand (tìm thấy trên vim.org),

Nó hoạt động với C, C ++, Java, PHP [2345], Proc, CSS, HTML, htm, XML, XHTML, vim, vimrc, SQL, sh, ksh, csh, Perl, tex, fortran, ml, caml, ocaml, tập tin vhdl, haskel và bình thường

Nó nhận xét và bỏ dòng nhận xét trong các tệp nguồn khác nhau ở cả chế độ bình thường và trực quan

Sử dụng:

  • CtrlCđể bình luận một dòng
  • CtrlXđể bỏ bình luận một dòng
  • ShiftVvà chọn nhiều dòng, sau đó CtrlCđể nhận xét nhiều dòng được chọn
  • ShiftVvà chọn nhiều dòng, sau đó CtrlXbỏ bình luận nhiều dòng đã chọn

3

Phương pháp nhanh nhất và trực quan nhất của tất cả chúng là ánh xạ lại )để bình luận xuống các dòng, và sau đó( cho đi bộ - không chú ý. Hãy thử nó và bạn sẽ không quay trở lại.

Trong Ruby hoặc Bash , với thụt lề 2 không gian:

map ) I# <Esc>j
map ( k^2x

Trong C / C ++ hoặc PHP , với thụt lề 4 không gian:

map ) I//  <Esc>j
map ( k^4x

Nhược điểm là bạn bị mất ()chuyển động câu (nhưng dascó thể điền vào đó), và đôi khi bạn sẽ rơi lại vào lựa chọn và thay thế hoặc CtrlVđể xử lý các phần dài. Nhưng điều đó khá hiếm.

Và đối với kiểu C, các bình luận dài được xử lý tốt nhất với:

set cindent
set formatoptions=tcqr

... Kết hợp tốt với việc sử dụng V[move]gqđể làm lại cách gói từ.


2

Đoạn mã đơn giản này là từ .vimrc của tôi:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

Đó là // - Nhận xét, nhưng bạn có thể điều chỉnh nó dễ dàng cho các nhân vật khác. Bạn có thể sử dụng autocmd để đặt người lãnh đạo như jqno đề xuất.

Đây là một cách rất đơn giản và hiệu quả làm việc với các phạm vi và chế độ trực quan một cách tự nhiên.


2

Tôi thích /* ... */(C ansi bình luận), vì vậy đây là mẹo của tôi dành cho bạn. Bạn có thể điều chỉnh nó để sử dụng trong các trường hợp khác nhau, tất nhiên.


Nhận xét với / * ... * /

Chọn văn bản (đi đến bắt đầu, bắt đầu khối trực quan, nhảy với }):

<c-V>}

Nhập lệnh sẽ được áp dụng trong lựa chọn

:norm i/* <c-v><esc>$a */

Lệnh sẽ giống như: :'<,'>norm i /* ^[$a */

Xem (i *) để biết chi tiết.


Bỏ ghi chú / * ... * /

Chọn văn bản (như trước hoặc theo cách khác bạn muốn):

<c-V>}

Nhập lệnh sẽ được áp dụng trong lựa chọn

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

Lệnh sẽ giống như: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Xem (ii *) để biết chi tiết.


Kết quả

Hiệu quả là bình luận theo từng dòng:

Comment block
Comment block
Comment block

Trở thành (và ngược lại):

/* Comment block */
/* Comment block */
/* Comment block */

Tốt hơn là lưu nó dưới dạng một số maphoặc @regtrong của bạn .vimrc, bởi vì nó rất nhiều để gõ. Nếu bạn thích một khối /**/toàn bộ khối, hãy sử dụng:

Nhận xét với một / * * / toàn bộ khối

Lưu nó trong một đăng ký bằng cách ghi lại, nói qc, sau đó, ở đầu đoạn để bình luận:

v}di/*  */<esc>hhhp

và đừng quên qmột lần nữa, để hoàn thành hồ sơ.

Xem (iii *) để biết chi tiết.


Bỏ ghi chú một / * * / từ một khối

Lưu nó trong đăng ký, nói , @u. Đặt con trỏ của bạn ở bất cứ đâu trong khối và:

?/\*<enter>xx/\*/<enter>xx

Lưu thanh ghi bằng cách hoàn thành qlệnh.

Xem (iv *) để biết chi tiết.


Kết quả

Hiệu ứng là một nhận xét duy nhất cho nhiều dòng:

Comment block
Comment block
Comment block

Trở thành (và ngược lại):

/* Comment block
Comment block
Comment block */

Giải thích

(i *) Nó hoạt động bằng cách sử normdụng lặp đi lặp lại cùng một lệnh trong mỗi dòng được chọn. Lệnh chỉ cần chèn a /*, tìm điểm cuối của dòng đó và kết thúc bằng cách chèn một*/

:norm i/* <c-v><esc>$a */

(ii *) Nó cũng sử dụng normđể lặp lại tìm kiếm / thay thế trên mỗi dòng. Tìm kiếm spaces /* spacesvà thay thế bởi không có gì. Sau đó, tìm thấy kết thúc của dòng, trở lại hai từ, bên phải một chữ cái, xóa đến cuối.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Chọn đoạn văn bằng cách v}xóa nó, chèn một bình luận mở và đóng, di chuyển đến giữa của nó và dán khối đã xóa.

v}di/*  */<esc>hhhp

(iv *) Bất cứ nơi nào ở giữa, tìm thấy ngược a /*, xóa nó; tìm về phía trước a */, xóa nó đi.

?/\*<enter>xx/\*/<enter>xx
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.