web-dev-qa-db-ja.com

Vimで行をコメント/コメント解除する簡単な方法は何ですか?

私はviでRubyコードファイルを開いています。#でコメントアウトされている行があります。

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

最初のdef ... endセクションのすべての行のコメントを外したいとしましょう。 Vimでそれを行うための効率的な方法は何ですか?

一般的に、私は行をコメントしたりコメントを外したりする簡単で流動的な方法を探しています。ここではRubyのコードを扱っていますが、それはJavaScript(//)またはHaml(-#)かもしれません。

980
Ethan

NERD Commenterスクリプト を使います。コード内のコメントを簡単にコメント、コメント解除、または切り替えできます。

コメント /で述べたように

用法に混乱している人のために、デフォルトのリーダーは "\"であるので10\ccは10行をコメントし、10\cuはそれらの10行のコメントを外します

157
Manuel Ceron

それらのタスクのために私はほとんどの時間を使います ブロック選択

最初の#文字にカーソルを合わせて、 CtrlV (または CtrlQ gVim)の場合は、最後のコメント行まで進み、を押します。 xこれにより、すべての#文字が垂直方向に削除されます。

テキストのブロックをコメントするためのものはほとんど同じです。

  1. まず、コメントしたい最初の行に行き、を押します。 CtrlV。これはエディタをVISUAL BLOCKモードにします。
  2. 次に矢印キーを使って最後の行まで選択します
  3. 今すぐ押す ShiftIこれはエディタをINSERTモードにしてからを押します。 #。これは最初の行にハッシュを追加します。
  4. その後を押します Esc (ちょっと待ってください)そうすれば、それは他のすべての選択された行に#文字を挿入します。

デフォルトでdebian/ubuntuに同梱されているvimの簡易版の場合は、代わりに3番目のステップで: s/^/#を入力してください。

これは視覚的な参照のための2つの小さなスクリーン録画です。

コメント: Comment

コメント解除: Uncomment

2136
CMS

Vimのブロックをコメントアウトするには

  • 押す Esc (編集または他のモードを終了するため)
  • ヒット ctrl+v (視覚ブロックモード)
  • 上/下矢印キーを使用して必要な行を選択します(すべてが強調表示されるわけではありません。大丈夫です)。
  • Shift+i (首都I)
  • あなたが望むテキストを挿入してください、すなわち%
  • 押す EscEsc

Vimでブロックをコメント解除するには:

  • 押す Esc (編集または他のモードを終了するため)
  • ヒット ctrl+v (視覚ブロックモード)
  • 使用 / コメントを外す行を選択するには、矢印キーを押します。

    複数の文字を選択する場合は、1つを使用するか、これらの方法を組み合わせてください

    • 左右の矢印キーを使ってテキストをさらに選択します
    • テキスト使用の塊を選択するために shift + / 矢印キー
    • 通常の削除ボタンのように、下の削除キーを繰り返し押すことができます
  • 押す d または x 必要なら繰り返し文字を削除する
746
amelia

私のプラグインと.vimrcが助けにならない、またはNerdCommenterが間違っているリモートボックスに砲弾を投げかけることがあります(例えば、HTMLに埋め込まれたJavaScript)。 

このような場合、ローテクな代替手段は組み込みのnormコマンドです。これは指定された範囲の各行で任意のvimコマンドを実行するだけです。例えば:

#でコメントする:

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

これにより、各行の先頭に "#"が挿入されます。次のように入力すると、範囲が埋められるので、実際は:'<,'>norm i#のようになります

コメント解除 #

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

これは各行の最初の文字を削除します。 //のように2文字のコメントを使用した場合は、両方の文字を削除するために:norm xxを実行します。 

OPの質問のようにコメントがインデントされている場合は、次のように削除を固定できます。 

:norm ^x

つまり、「最初の非スペース文字に移動してから1文字削除します」という意味です。ブロック選択とは異なり、この手法はコメントのインデントが不均一であっても機能します。

注意 normは文字通り通常のvimコマンドを実行するだけなので、コメントに限定されず、各行を複雑に編集することもできます。コマンドシーケンスの一部としてエスケープ文字が必要な場合は、ctrl-vを入力してからエスケープキーを押します(さらに簡単に言うと、クイックマクロを記録してから、normを使用して各行でそのマクロを実行します)。

注2 normを多用している場合は、もちろんマッピングを追加することもできます。たとえば、〜/ .vimrcに次の行を追加すると、視覚的に選択した後でctrl-nの代わりに:normを入力できます。

vnoremap <C-n> :norm

注3 :素のままのvimにはnormコマンドがコンパイルされていない場合があるので、強化版(通常は/ bin/viではなく/ usr/bin/vim)を使用してください。

(この回答に改良を加えてくれた@Manbroskiと@raksliceに感謝します)

261
Magnus

私の.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>

これで、,ccを入力して行をコメント化し、,cuを使用して行をコメント解除できます(通常モードと表示モードの両方で機能します)。

(私は何年も前にいくつかのウェブサイトからそれを盗んだので私はそれがもうどのように動くかを完全に説明することができない:)。説明されている場所に コメント があります。)

109
jqno

vimでコメントする行を指定してください:

行番号を明らかにします。

:set number

それから 

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

またはこれ:

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

これが私のやり方です。

  1. コメントアウトしたい最初の行の最初の文字に移動します。

  2. ヒット Ctrl+q GVIMの場合 Ctrl+v VIMでは、それからコメントアウトするために行の最初の文字を選択するために下に行きます。

  3. その後を押します cコメント文字を追加します。

コメント解除は同じ方法で機能します。コメント文字の代わりにスペースを入力するだけです。

53
Marcin

私は私の.vimrcファイルに簡単に追加することを思いつきました。単にcomment_mapとそのコメントリーダーに新しいファイルタイプを追加するだけです。

通常モードと視覚モードへのマッピングを追加しましたが、好きなものに再マッピングすることができます。私は 'toggle'スタイルの機能を持つことだけを好みます。一つは複数のマッピングなどを持っている 

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>

注意:

私はファイルの種類や読み込みにコールバックやフックを使用しません。なぜならそれらはVimの起動を.vimrc静的関数/ mapよりも遅くするのですが、それが私の好みです。私はまたそれを単純かつ高性能に保つようにしました。 autocommandを使用する場合は、autocommandグループに配置する必要があります。そうしないと、コールバックがロードされるファイルごとに複数回filetypeに追加され、パフォーマンスが大幅に低下します。 

28
user427390

コメントを切り替える

必要なのが コメントの切り替え であれば、 commentary.vim による tpope にします。

enter image description here

Installation

病原体:

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

vim-plug:

Plug 'tpope/vim-commentary'

Vundle: 

Plugin 'tpope/vim-commentary'

さらなるカスタマイズ

これをあなたの.vimrcファイルに追加してください:noremap <leader>/ :Commentary<cr>

SublimeやAtomと同じように、Leader + /を押すことでコメントを切り替えることができます。

24
Flavio Wuensche

テキストの長方形を選択するには、Control-Vを使用します。最初の#文字に移動します。 Ctrl+Vコメントを最後まで右に移動してから下に移動します。今xをタイプしてください:あなたはすべての#文字とそれに続く一つのスペースを削除しています。

22

これが私の.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>

通常モードとビジュアルモードでは、これを押すと ,ic コメントを挿入する,rc コメントを削除します。

14
innaM

私の前に30の答えがあるので、さらに簡単な解決策を提供しようとします。行の先頭に#を挿入します。次に、1行下に移動してドット(.)を押します。繰り返すには、j.j.などを実行します。コメントを解除するには、#を削除します(x上の#)、およびk.などを使用して逆の操作を行います...

9
imagineerThat

viの次の3行のコメントを解除する方法

#code code
#code
#code code code

左上の#シンボルの上にカーソルを置き、を押します。 CtrlV。これにより、ビジュアルブロックモードになります。下向き矢印を押すか J 3行すべてを選択するために3回。その後を押します D。すべてのコメントが消えます。元に戻すには、を押します U

viの以下の3行にコメントする方法

code code
code
code code code

左上の文字の上にカーソルを置き、を押します CtrlV。これにより、ビジュアルブロックモードになります。押す  または J 3行すべてを選択するために3回。次にを押します。

I//Esc

これが私の首都であり、//、そしてEscapeです。

押すとき ESC選択したすべての行に、指定したコメント記号が付きます。

9
Ivor Scott

私はvim 7.4を使っていて、これは私のために働きます。
3行コメントしている/コメントしていないと仮定します。 

コメントします: 

行の先頭にタブやスペースがない場合 
ctrl + V、次にjjj、そしてshift + I (cappital i)そして//then esc esc 
行の先頭にタブやスペースがある場合でも、上記の方法を実行することも、cと交換することもできます。 
ctrl + V、次にjjj、次にc、そして//then esc esc 

コメントを解除するには

行頭にタブやスペースがない場合 
ctrl + Vそしてjjjそしてll (lower cap L)そしてc 

行の先頭にタブ/スペースがある場合は、1つ上にスペースを空けてesc 
ctrl + V、次にjjj、次にll (lower cap L)、そしてcそしてspaceそしてesc 

9
Andy

私はtcommentプラグインを使うのが好きです: http://www.vim.org/scripts/script.php?script_id=1173

行または強調表示されたコードブロックをコメントするために、gcとgccをマップしました。それはファイルの種類を検出し、本当にうまくいきます。 

9
Rick

はい、この質問にはすでに33の(ほとんど繰り返しの)答えがあります。

これはVimでコメントアウトするための別のアプローチです: motion 。基本的な考え方は、yipを入力して段落をヤンクするのと同じ方法で、またはdjを入力して2行を削除するのと同じ方法で、行をコメントアウトまたはコメントアウト解除することです。

この方法では、次のようなことができます。

  • ccjは次の2行をコメントアウトし、cukはコメントを外します。

  • cci{はブロックをコメントアウトし、cui{はコメントを外します。

  • ccipは段落全体をコメントアウトし、cuipはコメント解除します。

  • 最後の行までコメントアウトするにはccG、最初の行までコメントアウトするにはcugg

あなたが必要とするのは、 動きの上で動作する2つの関数 、および各関数のための2つのマッピングです。まず、マッピング:

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>

g@演算子およびoperatorfunc変数についてのマニュアルを参照してください。)

そして今関数:

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

#がどこにあるべきかに関してあなたの好みに合うように上の正規表現を修正してください:

7
n.r.

EnhancedCommentify を使用します。それは私が必要とするすべてのもの(プログラミング言語、スクリプト、設定ファイル)をコメントします。私はビジュアルモードバインディングでそれを使います。コメントしたいテキストを選択してco/cc/cdを押すだけです。

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

最初と最後の行(maとmb)に印を付けてから、次のようにします。 'a、' bs/^#//

6
SDGator

あなたがすでに行番号を知っているなら、n,ms/# //はうまくいくでしょう。

5
uckelman

私はTim Popeの vim-commentary pluginを使います。 

4
Jim Stewart

Philとjqnoの答えを組み合わせて、スペースを使ってコメントを元に戻しました。

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>
4
mathewguest

vim-commentaryと呼ばれるtpopeによってこの人生を変えるプラグインがあります

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

このプラグインはを提供します:

  • 正気
  • 適切にインデントされたコメント
  • 空の/不要な行をコメントアウトしません

使い方

  • Vundle(または私が推測する病原体)を介してインストールしてください。
  • テキストをハイライトしてを押します : これは:<,'>として表示されます
  • ここに解説を:<,'>Commentaryと入力して押します Enter
  • ブーム。あなたのやった芽。
4
Weston Ganger

私は Jasmeet Singh Anandのcomments.vim (vim.orgにあります)を使います、

C、C++、Java、PHP [2345]、proc、CSS、HTML、htm、XML、XHTML、vim、vimrc、SQL、sh、ksh、csh、Perl、tex、fortran、ml、caml、ocaml、 vhdl、haskel、および通常のファイル

通常モードとビジュアルモードの両方で、異なるソースファイルの行にコメントを付けたりコメントを外したりします。

使用法:

  • CtrlC 1行にコメントする
  • CtrlX 単一行をコメント解除する
  • ShiftV 複数の行を選択して CtrlC 選択した複数行にコメントを付ける
  • ShiftV 複数の行を選択して CtrlX 選択した複数行のコメントを解除する
3
Ronan

最も早く直感的な方法は、)を改行してコメントアウトし、(を改行してコメント解除することです。それを試してみて、あなたは戻ってこないでしょう。

2スペースのインデントで、RubyまたはBashになります。

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

C/C++またはPHPの場合は、4スペースのインデントが必要です。

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

欠点は、文の移動のために()を失うことです(ただし、dasはそこに記入することができます)。 CtrlV 長いセクションを扱うため。しかし、それはかなりまれです。

そしてCスタイルでは、長いコメントは次のように扱うのが一番です。

set cindent
set formatoptions=tcqr

...これは、ワードラップをやり直すためのV[move]gqの使用とうまく組み合わせています。

3
eukras

これがC-vとそれに続くIメソッドに基づく基本的なワンライナーです。

このコマンド(:Comment)は、選択した文字列を選択した行の先頭に追加します。

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

この行を.vimrcに追加して、単一の引数を受け入れ、その引数を現在の選択の各行の先頭に配置するコマンドを作成します。

例えば。次のテキストが選択されている場合

1
2

:Comment //を実行すると、結果は次のようになります。

//1
//2
3
bgran

ここで答えのアイデアから始めて、私は私自身のコメント機能を始めました。それはコメントのオンとオフを切り替えます。これは//print('blue'); //this thing is blueのようなものを扱うことができ、最初のコメントを切り替えるだけです。さらに、最初の非空白文字が行頭にはないところにコメントと単一の空白文字を追加します。コメントしたり行を字下げしたりするときに、この余分な作業を避けるために。提案は大歓迎です。

" 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>
3
mike

この簡単なスニペットは私の.vimrcからのものです。

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

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

// - コメント用ですが、他の文字にも簡単に適用できます。 jqnoが示唆しているように、autocmdを使ってリーダーを設定することができます。

これは非常に単純で効率的な方法で、範囲とビジュアルモードを自然に使用します。

2
Phil

あなたはtpope( https://github.com/tpope/vim-commentary )でvim-commentaryを使うことができます。

を押してビジュアルモードに入ります

'v'

その後を押します 

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

今あなたが選択をしなければならないのはエンターキーだけです:

'gc'

これにより、リピートキーのコメントを解除するために、すべての選択がコメントアウトされます。

'gc'
2
Kingsley Ijomah

これには vim-multiple-cursors を使います。

  1. 地域を選択するには、を押してコメントアウトする地域の最初または最後の行の最初の文字に移動します。  (それはゼロで、文字 "o"ではありません)その後を押します V を使用して地域を選択します J、 K または上下の矢印キー。
  2. 次にを押して、選択範囲の各行に仮想カーソルを置きます。 CtrlN
  3. その後を押します I 選択範囲の各行を同時に編集します。
2
nrz

この答えは、1).vimrcに貼り付けるための正しいコードを示し、ブロックコメント/コメント解除を行うためにvim 7.4+を取得する一方、ビジュアルモードでは1ショートカットでインデントレベルを維持し、2)それを説明するためです。

これがコードです: 

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>

使い方:

  • let b:commentChar='//':これはvimに変数を作成します。ここでのbはスコープを表し、この場合はバッファに含まれています。つまり、現在開かれているファイルを意味します。あなたのコメント文字は文字列であり、引用符で囲む必要があります。引用符は、コメントを切り替えるときに置換されるものの一部ではありません。

  • autocmd BufNewFile,BufReadPost *...:オートコマンドはさまざまなことをトリガーします。この場合、これらは新しいファイルまたは読み取りファイルが特定の拡張子で終了したときにトリガーされます。起動したら、次のコマンドを実行します。これにより、ファイルタイプに応じてcommentCharを変更できます。これを行うには他の方法がありますが、初心者にとっては混乱しやすいものです(私のように)。

  • function! Docomment():関数はfunctionで始まりendfunctionで終わることによって宣言されます。関数は大文字で始めなければなりません。 !は、この関数がDocomment()として定義されている以前の関数をこのバージョンのDocomment()で上書きすることを保証します。 !がないとエラーが発生しますが、それはvimのコマンドラインで新しい関数を定義していた可能性があります。

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e':Executeはコマンドを呼び出します。この場合、substituteを実行しています。これは、バッファ全体の場合は%、強調表示されたセクションの場合は'<,'>のような範囲をとることができます(デフォルトでは現在の行です)。 ^\s*は、行頭とそれに続く任意の量の空白に一致するように正規表現され、その後に(&のために)追加されます。 escape()は引用符で囲むことができないため、ここでの.は文字列連結に使用されます。 escape()を使用すると、引数(この場合は\および/)に一致するcommentChar内の文字を、先頭に\を付加することによってエスケープすることができます。この後、substituteフラグを持つe文字列の末尾と再度連結します。このフラグにより​​、暗黙のうちに失敗することができます。つまり、特定の行で一致するものが見つからなかった場合、それについて叫ぶことはありません。全体として、この行は最初のテキストの直前にコメント文字とそれに続くスペースを置くことを可能にします。つまり、インデントレベルを維持します。

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e':これは私たちの最後の巨大な長い命令に似ています。これに特有のものとして、\vをエスケープする必要がないことを確認する()と、1で作成したグループを参照する()があります。基本的には、任意の量の空白で始まり、その後にコメント文字とそれに続く任意の量の空白が続く行と一致しており、最初の一連の空白のみを保持しています。繰り返しますが、eはその行にコメント文字がなければ黙って失敗させます。

  • let l:line=getpos("'<")[1]:これはコメント文字と同じように変数を設定しますが、lはローカルスコープ(この関数に対してローカル)を参照します。 getpos()は、この場合は強調表示の開始位置を取得します。[1]は、行番号だけを気にし、列番号などは気にしないことを意味します。

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1:あなたはifがどのように機能するのか知っています。 match()は最初のものに2番目のものが含まれているかどうかをチェックします。そこで、強調表示を始めた行をつかみ、それが空白で始まりその後にコメント文字が続くかどうかをチェックします。 match()は、これが真の場合はインデックスを返し、一致が見つからなかった場合は-1を返します。 ifはゼロ以外のすべての数値を真と評価するので、出力が-1より大きいかどうかを確認するために出力を比較する必要があります。 vimの比較は、falseの場合は0、trueの場合は1を返します。これは、ifが正しく評価するために必要なことです。

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>vnoremapは、次のコマンドをビジュアルモードでマップすることを意味しますが、再帰的にマップしないでください(他の方法で使用される可能性のある他のコマンドを変更しないことを意味します)。基本的に、もしあなたが初心者であれば、必ずnoremapを使ってあなたが物を壊さないようにしてください。 <silent>は、「あなたの言葉が欲しくない、ただあなたの行動が欲しい」という意味で、コマンドラインには何も表示しないように伝えます。 <C-r>は私たちがマッピングしているもので、この場合はctrl + rです(このマッピングでは通常モードの "redo"にC-rを普通に使うことができます)。 C-uはちょっとややこしいですが、基本的には視覚的な強調表示を見失うことがないようにします( この答え によると、コマンドは'<,'>で始まります)ここでのcallは、名前を付けた関数を実行するようにvimに指示するだけで、<cr>enterボタンを押すことを意味します。実際にその関数を呼び出すには一度それを打つ必要があります(そうでなければコマンドラインでcall function()とタイプしただけです)そして代用品を完全に通過させるためにもう一度それを打たなければなりません。 。 

とにかく、うまくいけばこれは役立ちます。これはvV、またはC-vでハイライトされたものをすべて取り、最初の行がコメントされているかどうかをチェックします。これは私の望ましい行動です。ブロック内の各行がコメントされているかどうかをトグルしたくなかったので、 質問multiple 件について質問した後でも、私にとっては完璧に機能します。 

2
jeremysprofile

この質問にはすでにたくさんの答えがありますが、私が書いた小さなプラグインに一言で言うと私はいまだにそう思います: commentify

Commentifyはcommentstring設定を使ってコードのブロックをコメントアウトする方法を決定するので、あなたの設定では異なるコメントタイプのマッピングを維持する必要はなく、行ベースのコメント(例えば//)とブロックコメント(例えば、/* */).

また、同じショートカットをマッピングします(デフォルトは ctrl+c2つのマッピングや複雑なコマンドセットを覚えておく必要はありません。

1
Jaymon

私は/* ... */(C ansi comments)が好きです、それでここでそれはあなたのための私のトリックです。もちろん、さまざまなケースで使用するように調整することができます。


/ * ... * /でコメント 

テキストを選択します(先頭に移動し、ビジュアルブロックを開始し、}でジャンプします)。

<c-V>}

選択範囲に適用するコマンドを入力します

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

コマンドは次のようになります。:'<,'>norm i /* ^[$a */

詳細は(i *)をご覧ください。


コメントを外します/ * ... * / 

テキストを選択します(以前と同じように、または他の方法でも)。

<c-V>}

選択範囲に適用するコマンドを入力します

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

コマンドは次のようになります。:'<,'>norm :s-\s*/\*\s*-^M$bbld$

詳細は(ii *)をご覧ください。


結果 

効果はコメント行です。

Comment block
Comment block
Comment block

次のようになります(およびその逆)。

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

@regmapまたは.vimrcとして保存するほうが賢明です。タイプするのは大変だからです。ブロック全体に対して単一の/**/を好む場合は、次のようにします。

単一の/ * * /ブロック全体でコメント

たとえばqcと記録してから、段落の始めにコメントして、レジスターに保存します。

v}di/*  */<esc>hhhp

記録を終えるために、もう一度qを忘れないでください。

詳細は(iii *)をご覧ください。


ブロックから単一の/ * * /のコメントを外す

@uのようにレジスタに保存します。ブロック内の任意の場所にカーソルを置きます。

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

qコマンドを終了してレジスタを保存します。

詳細は(iv *)をご覧ください。


結果 

効果は複数の行に対する単一のコメントです。

Comment block
Comment block
Comment block

次のようになります(およびその逆)。

/* Comment block
Comment block
Comment block */

説明

(i *)これは、選択されたすべての行に同じコマンドを繰り返し適用するnormを使用して機能します。コマンドは単に/*を挿入し、その行の終わりを見つけて*/を挿入することによって終了します。

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

(ii *)また、すべての行で検索/置換を繰り返すためにnormを使用します。 spaces /* spacesを検索し、何も置き換えないでください。その後、行の終わりを見つけ、2つの単語を後ろに、文字を右に、最後まで削除します。

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

(iii *)段落をv}で選択して削除し、コメントを開いて閉じて挿入し、中央に移動して削除したブロックを貼り付けます。

v}di/*  */<esc>hhhp

(iv *)途中のどこでも、後ろに/*を見つけてそれを削除します。前方に*/を見つけ、それを削除します。

?/\*<enter>xx/\*/<enter>xx
1
Dr Beco

とてもいい質問ですが、いい答えはそれほど多くありません。まず、ここではブロック挿入モードを使用することは簡単ではない解決策ですが、キーストロークが多すぎるため、コード編集のパフォーマンスを向上させるには、選択した行で作業する必要があります。誰も言及していないもう一つのポイント:コメント記号をどこに置くべきか - 行の最初の部分にあるのか、それとも実際のテキストの前にあるのか?おそらく好みの問題ですが、私の意見では、コードを読みやすくするためにテキストの前に置くべきです。コメント記号が行頭に置かれると、インデントされたコードの視覚的な一貫性が損なわれるので、箇条書きリストそれを念頭に置いて、私は次の解決策になった(私は#コメントの例を作る)。私のvimrcで:

vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>

キー1は、選択されたすべての行のテキストの前(空白の後)に#を挿入します。 #を2回挿入するのではなく、すでに#があるかどうかをチェックします。そして空行も無視します。
キー2は、1つの#を削除します。また、行の右側のコメントを安全に保ちます。


更新 :これはファイルの種類に依存するコメントコマンドの切り替え方法の例です。これらの事についてもっと学ぶために読んでください: http://learnvimscriptthehardway.stevelosh.com/chapters/14.html

それを機能させるためだけに、あなたの.vimrcファイルに次の行を入れてください。 

" build the whole regex search/replace command
function! Build()
    let b:Comment_ON='''<,''>s:^\(\s*\)\([^\t ]\):\1' . b:cs . '\2:e'
    let b:Comment_OFF='''<,''>s:^\(\s*\)' . b:cs . '\(\s*\):\1\2:e'
endfunction

" run this group on Filetype event
augroup SetCS
    autocmd!
    "default comment sign
    autocmd FileType * let b:cs='--'
    "detect file type and assign comment sign
    autocmd FileType python,Ruby let b:cs='#'
    autocmd FileType c,cpp,Java,javascript,php let b:cs = '\/\/'
    autocmd FileType vim let b:cs='"'
    autocmd FileType * call Build()
augroup END

vnoremap 1 :<C-u>execute b:Comment_ON<CR>
vnoremap 2 :<C-u>execute b:Comment_OFF<CR>
1
Mikhail V

私は個人的にはコメントの "トグル"機能は好きではありません。それは既にコードに含まれているコメントを破壊するからです。また、コメント文字を常に左端に表示したいので、コメントブロックを簡単に見ることができます。また、これを入れ子にして動作させたい(最初にブロックをコメントアウトし、その後囲むブロックをコメントアウトする場合)したがって、解決策の1つを少し変更しました。コメントアウトするには F5 を、コメント解除するには Shift - F5 を使用します。また、s /コマンドの最後に/ gを追加しました。

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 = '"'
autocmd FileType nasm             let b:comment_leader = ';'

function! CommentLine()
    execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction

function! UncommentLine()
    execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction

map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>
0
Flo

行をコメントにするには(全言語用): 

  • noremap <silent> ,// :call CommentLine() <CR>

行数 、および ビジュアルモード で呼び出すこともできます。 4行コメントするには 4、// を使用し、コメント解除するには 4、/ を使用します。 

行をコメント解除するには(すべての言語に対して): 

  • noremap <silent> ,/ :call UnCommentLine() <CR>

新しいシンボル[コメント]を追加したい場合 そして リストを追加していくつかの行を追加します 関数内。 コメント記号 のいずれかですでに定義されている言語を追加したい場合は、対応するリストに自分の言語名を追加してください(正しい名前を取得するには: ファイルを開くvimで :set ft を使ってあなたの言語の正しい名前を取得してください )。 

CommentLine()の定義

function! CommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm I// elseif (index(hash_ft_list, &ft) != -1) :norm I# elseif (index(perct_ft_list, &ft) != -1) :norm I% elseif (index(mail_ft_list, &ft) != -1) :norm I> elseif (index(quote_ft_list, &ft) != -1) :norm I" endif endfunction

UnCommentLine()の定義

function! UnCommentLine() let slash_ft_list = ['c' , 'cpp', 'Java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog'] let hash_ft_list = ['sh' , 'Ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'Perl'] let perct_ft_list = ['tex'] let mail_ft_list = ['mail'] let quote_ft_list = ['vim'] if (index(slash_ft_list, &ft) != -1) :norm ^2x elseif (index(hash_ft_list, &ft) != -1) :norm ^x elseif (index(perct_ft_list, &ft) != -1) :norm ^x elseif (index(mail_ft_list, &ft) != -1) :norm ^x elseif (index(quote_ft_list, &ft) != -1) :norm ^x endif endfunction

0
AnuragChauhan

:%s/^/\/\// g

文字との間のスペースを削除します。このコマンドを使用して、.CファイルまたはCPPファイルをコメント化します。

@ CMSのソリューションは、行をコメントアウトする最も「ネイティブな」方法です。 @ CMSの2番目のステップでは、 CtrlVあなたも使うことができます r# コメントを追加する x それらを削除します。 46ページのDrew Neilの Practical Vim がこのテクニックをよく説明しています。

他の良い方法はex modeコマンドを使うことです。 :[範囲]normali##。明らかに、これを使ってキーストロークを節約するには、15行以上をコメントアウトする必要があります。

0
jfmercer
"comment (cc) and uncomment (cu) code 
noremap   <silent> cc      :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
noremap   <silent> cu      :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj

1行または複数行を#でコメント/コメント解除することができます。複数の行を入力するには、行を選択してからcc/cuショートカットを入力するか、または番号を入力してからcc/cuを入力します。 7ccはカーソルから7行をコメントアウトします。 

私は VimでRubyコードのブロックをコメント/コメント解除するための最もエレガントな方法は何ですか? の人からオリジナルのコードを入手し、いくつかの小さな変更を加えました(ショートカットキーの変更、#の後のスペースの追加).

0
konyak

私は個人的にa-la Visual Studioについてコメントしたいと思いました。私は仕事でそれに慣れてきたので、それは私の筋肉の記憶を引き継いだ(vsvimを使って)。つかいます shift+v 必要な行を選択してからを押す ctrl+k、 ctrl+c コメントする Ctrl+k、 Ctrl+u コメントを解除する。

:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>
0
scx

ファイル全体のコメントを解除するには

  1. Esc挿入モードを終了します
  2. gg 1行目の最初の文字に移動
  3. ctrl+Vまたは ctrl+shift+vは現在の文字を選択します
  4. Gまたは shift+gは最後の行に移動します
  5. x選択を削除します
0
JSON C11
:g/.spare[1-9].*/,+2s/^/\/\//

上記のコードは、「スペア」を含むすべての行をコメントアウトし、その後に数字を追加して、それが見つかった行からさらに2行コメント化します。そのような用途の詳細については、 http://vim.wikia.com/wiki/Search_and_replace#Details をご覧ください。

0
Mohit Kumar

Tcommentやnerdcommenterのようないくつかのvimプラグインがあります。 

私はコメントを目的としてtcommentを使います。

gcc:現在の行のコメントを切り替えます。 v {motion} gc:視覚的に選択した行の範囲のコメントを切り替えます。 

例:v3jgcは3行の領域を切り替えます。

これらのコマンドは、あらゆる言語のコメントを処理するのに役立ちます。

0
dvk317960

この解決策は、/をコメントにマップしますか。コメント解除(単一マッピングを使用したコメントの切り替えは複雑すぎて正しく実装できません)。 /usr/share/vim/vim*/ftplugin/*.vimが宣言されている場合、filetype plugin onのようなファイルから生成されたVIMの組み込みcommentstringオプションからコメント文字列を取ります。

filetype plugin on
autocmd FileType * let b:comment = split(&commentstring, '%s', 1)
autocmd FileType * execute "map <silent> <Leader>/ :normal 0i" . b:comment[0] . "<C-O>$" . b:comment[1] . "<C-O>0<CR>"
autocmd FileType * execute "map <silent> <Leader>? :normal $" . repeat('x', strlen(b:comment[1])) . "0" . strlen(b:comment[0]) . "x<CR>"
0
sgtpep