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


1171

Rubyコードファイルをviで開いています。次のようにコメント化された行があります#

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(-#)の場合もあります。


20
受け入れられた回答は、プラグインを使用せずにコメント/ブロック解除ブロックを達成する方法についての詳細な指示がある回答の1つに変更する必要があります。現在の受け入れ答えは、基本的には、サードパーティ製のプラグインへのリンクだけです。
かすかな信号2017

最高評価の回答では、プラグインについては言及されていません。@ rationalisコメントは誤解を招く可能性があります。修正するか削除してください。ありがとうございます。
ボノボ

回答:


181

NERD Commenterスクリプトを使用しています。コード内のコメントを簡単にコメント、コメント解除、トグルできます。

コメントで述べたように

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


面白い!私はドキュメントを読んで、「セクシーなコメント」があることに気づきました-「\ cs」を使用してください。Rubyの場合、ハッシュタグの代わりに複数行を使用=begin=endてコメントします。
Hegwin 2017

プラグインをインストールする必要があるため、vimを使用する最も速い方法ではないと思います。また、ベストアンサーはすでに多くの票を獲得していますが、解決策としてマークされていません。
ウィルミル2018

137
ここで停止しないでください。ほとんどの投票された答えは、プラグインを必要とせずに以下にあります。stackoverflow.com/a/15588798/2117868およびstackoverflow.com/a/1676690/2117868
kuttumiah 2018

@whirmill「最高」は本当にユースケースに依存すると思います。人生で一度コメントを切り替えたい場合、ビジュアルブロックモードの方が高速です。しかし、プラグインのインストールを気にせず、コメントを切り替えるためにキーストロークをできるだけ少なくし、コメントの追加と削除の操作を区別する必要がない場合は、これが「最良の答え」かもしれません。
Carolus

@Carolus質問が「速い方法は何か」ではなく「最良の方法は何か」で始まっていたら、私はあなたに同意したでしょう。
whirmill

2543

これらのタスクでは、ほとんどの時間ブロック選択を使用します。

カーソルを最初の#文字の上に置いてCtrlV(またはCtrlQgVimの場合)、最後のコメント行まで下に移動してを押すとx、すべての#文字が垂直方向に削除されます。

テキストのブロックにコメントすることはほとんど同じです:

  1. まず、コメントを付ける最初の行に移動し、を押しCtrlVます。これにより、エディターがVISUAL BLOCKモードになります。
  2. 次に、矢印キーを使用して、最後の行まで選択します
  3. 次にShiftI、をINSERT押し#ます。これにより、エディターがモードになり、を押します。これにより、最初の行にハッシュが追加されます。
  4. 次にEsc(1秒後に)を押すと、#選択した他のすべての行に文字が挿入されます。

デフォルトでdebian / ubuntuとともに出荷されるvimの簡略版については、: s/^/#代わりに3番目のステップで入力します(各行の最初の文字の残りの強調表示は、で削除できます:nohl)。

ここでは、視覚的に参照できる2つの小さな画面の記録を示します。

コメント: コメント

コメント解除: コメントを外す


87
デフォルトではCTRL + Vです。Windowsバージョンのgvimでは、Ctrl + Vが貼り付けにすでに使用されているため、Ctrl + Qを使用します。
R.マルティーニョフェルナンデス

8
@amindfv Ctrl + V、n(n は行のn数-1)、j、(nはコメント文字シーケンスの長さの数-1)、l、x。
michael.bartnett 2012

28
「//」でこれをどのように行いますか?
オースティン2014年

74
Escを2回クリックして、その秒を待たないようにすることができます;)
Ahmed Hegazy

45
これは私にはうまくいきませんでした。Shift-私は単純挿入モードに入りました。
ジェレミア

828

vimでブロックをコメントアウトするには:

  • 押すEsc(編集モードまたは他のモードを終了するには)
  • ヒットctrl+ v(ビジュアルブロックモード)
  • / 矢印キーを使用して、必要な行を選択します(すべてが強調表示されるわけではありません。問題ありません)。
  • Shift+ i(大文字のI)
  • たとえば、必要なテキストを挿入します %
  • 押す EscEsc

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

  • 押すEsc(編集モードまたは他のモードを終了するには)
  • ヒットctrl+ v(ビジュアルブロックモード)
  • / 矢印キーを使用して、コメントを解除する行を選択します。

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

    • 左/右矢印キーを使用して、さらにテキストを選択します
    • テキストのチャンクを選択するには、shift+ / 矢印キーを使用します
    • 通常の削除ボタンのように、下の削除キーを繰り返し押すことができます

  • dまたはxを押して、必要に応じて繰り返し文字を削除します

34
@amelia:コメントのショートカットが機能しません。Shift + iを押すと、挿入モードになります。vimのバージョンに依存しますか?
user3527975

7
なぜそれは秒かかるのですか?
Conor Patrick

24
この答えで私が持っている唯一の問題は、矢印キーを使用するように指示することです。
コージーコネモテル2016年

6
代わりにEscを2回押します。:)
アーロンアルフォンサス2017

22
最初はコメントを有効にしても機能しませんでしたが、もう一度読んだ後はうまくいきました。1。選択にはVではなくCtrl-Vを使用していることを確認してください。最後にEscを
押す

335

ときどき、プラグインと.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に感謝します)


スクロールしてこの回答を読むまで、これが進むべき道だと思いましたstackoverflow.com/a/1676690/850996 CTRL + Vを使用したブロック選択(SHIFT + Vによる行選択とは対照的)は、コメントの場所をより適切に制御します文字挿入が行われます。
Shyam Habarakada 2014

2
@Shyam特殊なブロック選択のみのコマンドと組み合わせたctrl-vテクニックは、他のほとんどの回答が推奨するものです。しかし、私は個人的に、normコマンド自体以外に新しい構文を導入しないため、説明した「norm」手法の方が簡単だと思っています。vimについてすでに知っていることを再利用できます。
Magnus

2
インデントされたブロックのコメントを解除するには、と言うと便利です:norm ^x。この方法には一般に、領域選択を使用できるという利点vi{があります(たとえば、中括弧内を選択します)。このようなテキストオブジェクトセレクタは、では機能しませんVisual Block
ivan-k 2014

1
ああ、私はそれを見つけました-centos 6では/bin/vivim 7.2ですが/usr/bin/vim、それはとは異なるビルドであり、このような機能がオフになっています。
rakslice

4
これは断然最良の答えです。特に、vip段落全体を選択するために組み合わせる場合。
me

122

私には次のものがあります.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にコメントを付けたり、コメントを外したりできます(通常モードとビジュアルモードの両方で機能します)。

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


使用するショートカットは何ですか?私はvimコード自体から完全に確認することはできません!
ギデオン2013

通常モードまたはビジュアルモードでは、「、cc」(3文字シーケンス)を使用して現在の行にコメントを付け、「、cu」を使用して現在の行のコメントを解除します。
Dan

8
私はそれが好きです :)!ありがとう!余談ですが、説明するのが難しいとは思いません。a)コマンドを再マップします(非再帰的[これを参照](stackoverflow.com/questions/3776117/…))。したがって、、 ccを押すと、:...が実行されます。b)これは基本的にsed(s / what / towhat / where)コマンドは、^(行の先頭)を、開いたファイルのタイプに基づいて正しく設定されたコメント文字に変更しますc)サイレントなものについては、コマンドからの出力を抑制します。d):nohlsearchは、sed検索の強調表示を停止します
ramrunner

14
これはオートコマンドをロードする正しい方法ではないことに注意してください。それらはaugroup内にある必要があります。そうしないと、vimに複数回追加され、大幅な速度低下を引き起こします。参照:learnvimscriptthehardway.stevelosh.com/chapters/14.html。この質問への回答を追加しました。

いいね。これは、あなたがブロック選択をしているときにコメントを外す方法について私が持っていた質問に対する実際の答えです。
Erwin Rooijakkers 2014

120

vimでコメントする行を指定します。

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

:set number

その後

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

またはこれ:

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

11
各行の最初の文字を変更しているだけなので、末尾に「g」は必要ありません
Magnus

1
(OpenWrtのような)埋め込まれた箱の一部VIMSビジュアルモードを持っていない...だから、これは素晴らしい:)をおかしくされる
kim0

:%s/^/#/gすべての行をコメントアウトする理由を説明できますか?私はパーセント記号%
Bin

18
これらの行のコメントを外すには、次のように記述します:5,17s / ^#/
Iraklis Moutidis

すごい!:それは本当にのようなブロック選択とうまく動作しますva{かとvarルビーのために。
ArturMałecki17年

58

ここに私がそれをする方法があります:

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

  2. ヒットCtrl+ qGVIMまたはCtrl+ vVIMで、その後、コメントアウトする行の最初の文字を選択するには、下に行きます。

  3. 次にを押してc、コメント文字を追加します。

コメント解除も同様に機能し、コメント文字の代わりにスペースを入力するだけです。


44
c最初の文字も削除します。CMSの答えは正解です。つまり、押しIてからコメント文字を入力してからEsc(これはWindows vimにあります)
Samaursa

6
これは機能しますが、「r」は「c」ではなくステップ3で押す必要があります。
David Baucum 2014

または、押しESCた後に2回押すこともできます。cこれでうまくいくはずです
nihiser

これらのオプションはすべて、行の最初の文字を破壊します。
ジョサイア

36

私は.vimrcファイルに単純な追加を考え出しました。これはかなりうまく機能し、簡単に拡張できます。新しいファイルタイプをcomment_mapとそのコメントリーダーに追加するだけです。

ノーマルモードとビジュアルモードへのマッピングを追加しましたが、好きなものに再マッピングできます。「トグル」スタイルの機能のみを使用することを好みます。複数のマッピングを持つクマなど

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>

注意:

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


1
vimはまったくの初心者ですが、マップされた機能を切り替えるにはどのボタンを押す必要がありますか?<leader><Space>一番下のその宣言は何ですか?
Jens Kohl 2014年

2
<leader>を<、>のようなキーに置き換えることができます。次に、スペースを押すと、行のコメント状態が切り替わります。Leaderはリーダーが何であっても、Vimのデフォルトの<leader>は\ですが、「let mapleader = '、'」のように独自に設定できます

すばらしい回答ですが、既にいくつかのコメントがあるコメントブロックには、コメントされていない行とコメントが入れ替わります。たとえば、QtCreatorは、空でないすべての行に先頭コメントがある場合にのみコメントを削除し、それ以外の場合は先頭コメントを追加します。
ideasman42 2016

1
私は少し異なるバージョンを使用\zsして\ze正規表現のトリックを作成しましたが、コードは少し小さくなりました。あなたはそれをここで
SergioAraujo

33

コメントを切り替え

あなたが必要とするすべてである場合はトグルのコメント私はむしろ一緒に行きたいcommentary.vimによってtpope

ここに画像の説明を入力してください

取り付け

病原菌:

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

vim-plug:

Plug 'tpope/vim-commentary'

バンドル:

Plugin 'tpope/vim-commentary'

さらなるカスタマイズ

これを.vimrcファイルに追加します。 noremap <leader>/ :Commentary<cr>

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


ありがとう!将来、html内のcssコメントをサポートする予定ですか?
Dan Oak

25

Control-Vを使用してテキストの長方形を選択します。最初の#文字に移動し、Ctrl+と入力してV、右に1回移動し、コメントの最後まで下に移動します。次のように入力しxます。すべての#文字とそれに続く1つのスペースを削除します。


18

これが私のセクションです.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したりコメントを削除したりできます。


これは初心者が自分で書くことを学ぶ方法として非常に役立ちます.vimrc
11年

3
map通常モードとビジュアルモードをカバーしているため、vmapラインは必要ありません
doubleDown

より良い場所はですafter/ftplugin/ruby.vim
Santosh Kumar

<leader>icand も使用<leader>rc
Hans Kristian

15

私はvim 7.4を使用していますが、これでうまくいきます。
3行コメント/コメント解除していると仮定します。

コメントします:

行は、先頭に何のタブ/スペースを持っていない場合:
ctrl + Vその後、jjjその後、shift + I (cappital i)その後、//その後、esc esc
ラインはあなたがまだのために上記または交換を行うことができます先頭にタブ/スペースを持っている場合c
ctrl + Vその後、jjjその後、cその後、//その後、esc esc

コメント解除します:

:行は先頭に何のタブ/スペースを持っていない場合は
ctrl + Vその後、jjjその後、ll (lower cap L)その後、c

以上の行が先頭にタブ/スペースを持っている場合、あなたのスペースの1とesc
ctrl + Vその後、jjjその後、ll (lower cap L)その後、cその後、spaceその後、esc


9

tcommentプラグインを使用したい:http ://www.vim.org/scripts/script.php?script_id=1173

行または強調表示されたコードブロックにコメントするために、gcとgccをマッピングしました。ファイルの種類を検出し、非常によく機能します。


9

私の前に30の回答があるので、さらに簡単な解決策を試してみましょう#。行の先頭にa を挿入します。次に、1行下に移動してドット(.)を押します。繰り返すには、んj.j.、等...のコメントを解除するには、削除#(あなたがヒットすることができますx以上#)、および逆使用して行うk.などを...


1
初心者でも理解して使える非常にシンプルな答えです。ただし、コメントする大量の行に対しては、かなりゆっくり動作します。この問題を回避I#<Esc>jするには、バッファに書き込むことができます。たとえば、c-してから、を実行するか10@c、または行数に合わせてください。
Daerdemandt 2017年

9

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

#code code
#code
#code code code

カーソルを左上の#記号に合わせ、を押しCtrlVます。これにより、ビジュアルブロックモードになります。下矢印キーをJ3回押すと、3行すべてが選択されます。次にを押しDます。すべてのコメントが消えます。元に戻すには、を押しUます。

viで次の3行にコメントする方法:

code code
code
code code code

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

I//Esc

これは大文字のI、//、およびEscapeです。

を押すESCと、選択したすべての行に、指定したコメント記号が表示されます。


1
「左上の」ハッシュを見逃した場合は、o を押して、ビジュアルモードでカーソルを「反対側」に移動できます。
dylnmc 2016年

これが一番いいと思います。サードパーティは必要ありません。ネイティブvimを使用してください
Ardi Nusawan '12

ベストアンサー、シンプルでサードパーティなし
aze 1983

8

はい、この質問に対する回答は33(主に反復的)です。

Vimで行をコメントアウトする別の方法:モーションです。基本的な考え方は、を入力して段落をヤンクするのと同じ方法を使用して、行をコメント化またはコメント解除yipすることdjです。

このアプローチでは、次のようなことができます。

  • 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

上記の正規表現を変更して、#必要な場所に関する好みに合わせます。


「完全に新しい[...]モーション」は少し上にあるように見えます。t_commentプラグインとvim-commentaryプラグインはどちらもこの回答よりも古いため、モーションを使用してコメント化できます。
リッチ

いい物!賛成。(また、以前使用していたプラグインの代わりにこのアプローチを使い始めるかもしれないと思うので、書いてくれてありがとう!)
Rich


7

最初と最後の行(maとmb)にマークを付けてから、: 'a、' bs / ^#//


6

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

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

5

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>

5

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

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

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

  • 正気
  • 適切にインデントされたコメント
  • 空/不要な行をコメント化しない

使用法

  • Vundle(またはPathogen)を介してインストールします。
  • テキストをハイライト表示し、次の:ように表示されるキーを押します:<,'>
  • ここにCommentary :<,'>Commentaryと入力してを押しEnterます。
  • ブーム。あなたのできたつぼみ。

vim-commentary(tpopeのすべてのプラグインのように)慣用的なvimであるというボーナスがあります。gc=「コメントに行く」、gcap=「段落にコメントする」など
goldenratio '17 / 07/17

これは、ジム・スチュワートによるティム・ポープの回答の編集だったのでしょうか?
jdk1.0

5

この回答は、プラグインをインストールできないが、コメント文字を既存のインデントレベルにしたい場合に最も役立ちます。

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

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':これは最後の巨大な長いコマンドに似ています。この1のユニークな、我々は\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は、次のコマンドをビジュアルモードでマップしますが、再帰的にマップしないことを意味します(つまり、他の方法で使用する可能性のある他のコマンドを変更しないでください)。基本的に、あなたがvimの初心者である場合は、noremap物事を壊さないように常に使用してください。<silent>「あなたの言葉は欲しくない、あなたの行動だけが欲しい」という意味で、コマンドラインには何も出力しないように指示しています。<C-r>マッピングしているもので、この場合はctrl + rです(このマッピングでは、通常モードの "やり直し"に通常どおりCrを使用できます)。C-u少し混乱しますが、基本的には、視覚的な強調表示を見失うことがないようにします(この回答によると、コマンドは最初'<,'>に必要なものになります)。callここでは、名前を付けた関数を実行するようにvimに指示し<cr>enterボタンを押すことを示しています。関数を実際に呼び出すには、一度ヒットする必要があります(それ以外の場合はcall function()、コマンドラインで入力しただけです。また、もう一度ヒットする必要があります(理由はわかりませんが、何でもかまいません)。

とにかく、うまくいけばこれは役立ちます。これは、と強調し何もかかりますvVまたはC-v、最初の行をコメント化されているかどうかをチェックし、そうならば、すべての強調表示された行のコメントを解除しようとすると、そうでない場合、各行にコメント文字の追加の層を追加します。これは私の望ましい動作です。それは後に私のために完璧に動作だから、僕は、それがブロックの各行がコメントされたかどうかを切り替えるにはしたくなかった尋ねる 複数の主題に関する質問を。



3

tpope(https://github.com/tpope/vim-commentary)でvim-commentary を使用できます。次のように使用できます。

を押してビジュアルモードに入る

'v'

次に押す

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

これで、選択に関係するのはEnterキーだけです。

'gc'

これにより、すべての選択がコメント化され、繰り返しキーのコメントが解除されます。

'gc'

3

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

ここで回答のアイデアから始めて、私は自分のコメント機能を開始しました。コメントのオンとオフを切り替えます。それはのようなものを処理でき//print('blue'); //this thing is blue、最初のコメントを切り替えるだけです。さらに、コメントと最初の空白以外の場所に1つのスペースを追加し、行の最初ではありません。さらに、余計に空白をコピーすることはありませんが、コメント(インデントされた行)の際に、この余分な作業を回避するためにズーム(ヘルプは:h \ zs)を使用します。それがミニマリストに役立つことを願っています。提案は大歓迎です。

" 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
カーソル位置も復元する少し異なるバージョンのソリューションを作成しました。その点についてご意見をお聞かせください。github上
SergioAraujo

涼しい。私の投稿を編集してソリューションを追加できます(類似性のため)!
マイク

これは、c、cpp、javaのバックスラッシュを回避し、E488を回避するために置換で別のセパレータを使用することを回避するように変更されました。また、コメントには3つの文字が含まれているため、java、cppの間隔が変更されます。
SergioAraujo 2018年

3

Jasmeet Singh Anand(vim.orgにあります)のcomment.vimを使用します

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するコメント一行
  • CtrlX単一行のコメント解除するには
  • ShiftV複数の行を選択してCtrlCから、選択した複数の行にコメントを付ける
  • ShiftV複数の行を選択してCtrlXから、選択した複数の行のコメントを解除します

3

それらすべての中で最も速くて最も直感的な方法は)、行のウォークダウンコメント用に再マッピングし、次に(ウォークアップコメント解除用に再マッピングすることです。それを試してみてください、あなたは戻ってこないでしょう。

ではルビーバッシュ、2スペースインデントを持ちます:

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、ワードラッピングのやり直しと組み合わせて使用します。


2

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

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

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

//-コメント用ですが、他のキャラクターにも簡単に適応できます。autoqmを使用して、jqnoが提案するようにリーダーを設定できます。

これは、範囲とビジュアルモードを自然に操作する非常にシンプルで効率的な方法です。


2

私は/* ... */(C ansiのコメント)が好きなので、ここが私のトリックです。もちろん、さまざまなケースで使用するためにそれを適応させることができます。


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

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

<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 */

入力するのがたくさんあるので、として保存するかmap@regに保存することをお勧めします.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つの単語を戻し、文字を1つ右に移動し、最後まで削除します。

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

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

v}di/*  */<esc>hhhp

(iv *)途中のどこでも、aを後方に検索して/*削除します。前方を検索し、*/それを削除します。

?/\*<enter>xx/\*/<enter>xx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.