私は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(-#
)かもしれません。
NERD Commenterスクリプト を使います。コード内のコメントを簡単にコメント、コメント解除、または切り替えできます。
コメント /で述べたように
用法に混乱している人のために、デフォルトのリーダーは "\"であるので10\ccは10行をコメントし、10\cuはそれらの10行のコメントを外します
それらのタスクのために私はほとんどの時間を使います ブロック選択 。
最初の#
文字にカーソルを合わせて、 CtrlV (または CtrlQ gVim)の場合は、最後のコメント行まで進み、を押します。 xこれにより、すべての#
文字が垂直方向に削除されます。
テキストのブロックをコメントするためのものはほとんど同じです。
VISUAL BLOCK
モードにします。INSERT
モードにしてからを押します。 #。これは最初の行にハッシュを追加します。#
文字を挿入します。デフォルトでdebian/ubuntuに同梱されているvimの簡易版の場合は、代わりに3番目のステップで: s/^/#
を入力してください。
これは視覚的な参照のための2つの小さなスクリーン録画です。
%
複数の文字を選択する場合は、1つを使用するか、これらの方法を組み合わせてください
私のプラグインと.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に感謝します)
私の.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でコメントする行を指定してください:
行番号を明らかにします。
:set number
それから
:5,17s/^/#/ this will comment out line 5-17
またはこれ:
:%s/^/#/ will comment out all lines in file
これが私のやり方です。
コメントアウトしたい最初の行の最初の文字に移動します。
ヒット Ctrl+q GVIMの場合 Ctrl+v VIMでは、それからコメントアウトするために行の最初の文字を選択するために下に行きます。
その後を押します cコメント文字を追加します。
コメント解除は同じ方法で機能します。コメント文字の代わりにスペースを入力するだけです。
私は私の.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に追加され、パフォーマンスが大幅に低下します。
必要なのが コメントの切り替え であれば、 commentary.vim による tpope にします。
病原体:
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
+ /
を押すことでコメントを切り替えることができます。
テキストの長方形を選択するには、Control-Vを使用します。最初の#
文字に移動します。 Ctrl+Vコメントを最後まで右に移動してから下に移動します。今x
をタイプしてください:あなたはすべての#
文字とそれに続く一つのスペースを削除しています。
これが私の.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 コメントを削除します。
私の前に30の答えがあるので、さらに簡単な解決策を提供しようとします。行の先頭に#
を挿入します。次に、1行下に移動してドット(.
)を押します。繰り返すには、j
、.
、j
、.
などを実行します。コメントを解除するには、#
を削除します(x
上の#
)、およびk
、.
などを使用して逆の操作を行います...
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選択したすべての行に、指定したコメント記号が付きます。
私は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
私はtcommentプラグインを使うのが好きです: http://www.vim.org/scripts/script.php?script_id=1173
行または強調表示されたコードブロックをコメントするために、gcとgccをマップしました。それはファイルの種類を検出し、本当にうまくいきます。
はい、この質問にはすでに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
#
がどこにあるべきかに関してあなたの好みに合うように上の正規表現を修正してください:
EnhancedCommentify を使用します。それは私が必要とするすべてのもの(プログラミング言語、スクリプト、設定ファイル)をコメントします。私はビジュアルモードバインディングでそれを使います。コメントしたいテキストを選択してco/cc/cdを押すだけです。
vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR>
最初と最後の行(maとmb)に印を付けてから、次のようにします。 'a、' bs/^#//
あなたがすでに行番号を知っているなら、n,ms/# //
はうまくいくでしょう。
私はTim Popeの vim-commentary pluginを使います。
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>
vim-commentary
と呼ばれるtpope
によってこの人生を変えるプラグインがあります
https://github.com/tpope/vim-commentary
このプラグインはを提供します:
使い方:
:<,'>
として表示されます:<,'>Commentary
と入力して押します Enter。私は 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、および通常のファイル
通常モードとビジュアルモードの両方で、異なるソースファイルの行にコメントを付けたりコメントを外したりします。
使用法:
最も早く直感的な方法は、)
を改行してコメントアウトし、(
を改行してコメント解除することです。それを試してみて、あなたは戻ってこないでしょう。
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
の使用とうまく組み合わせています。
これがC-v
とそれに続くI
メソッドに基づく基本的なワンライナーです。
このコマンド(:Comment
)は、選択した文字列を選択した行の先頭に追加します。
command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"
この行を.vimrc
に追加して、単一の引数を受け入れ、その引数を現在の選択の各行の先頭に配置するコマンドを作成します。
例えば。次のテキストが選択されている場合
1
2
:Comment //
を実行すると、結果は次のようになります。
//1
//2
ここで答えのアイデアから始めて、私は私自身のコメント機能を始めました。それはコメントのオンとオフを切り替えます。これは//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>
この簡単なスニペットは私の.vimrcからのものです。
function! CommentToggle()
execute ':silent! s/\([^ ]\)/\/\/ \1/'
execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction
map <F7> :call CommentToggle()<CR>
// - コメント用ですが、他の文字にも簡単に適用できます。 jqnoが示唆しているように、autocmdを使ってリーダーを設定することができます。
これは非常に単純で効率的な方法で、範囲とビジュアルモードを自然に使用します。
あなたはtpope( https://github.com/tpope/vim-commentary )でvim-commentaryを使うことができます。
を押してビジュアルモードに入ります
'v'
その後を押します
'j' repeatedly or e.g 4j to select 4 row
今あなたが選択をしなければならないのはエンターキーだけです:
'gc'
これにより、リピートキーのコメントを解除するために、すべての選択がコメントアウトされます。
'gc'
これには vim-multiple-cursors を使います。
この答えは、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()
とタイプしただけです)そして代用品を完全に通過させるためにもう一度それを打たなければなりません。 。
とにかく、うまくいけばこれは役立ちます。これはv
、V
、またはC-v
でハイライトされたものをすべて取り、最初の行がコメントされているかどうかをチェックします。これは私の望ましい行動です。ブロック内の各行がコメントされているかどうかをトグルしたくなかったので、 質問multiple 件について質問した後でも、私にとっては完璧に機能します。
この質問にはすでにたくさんの答えがありますが、私が書いた小さなプラグインに一言で言うと私はいまだにそう思います: commentify 。
Commentifyはcommentstring
設定を使ってコードのブロックをコメントアウトする方法を決定するので、あなたの設定では異なるコメントタイプのマッピングを維持する必要はなく、行ベースのコメント(例えば//
)とブロックコメント(例えば、/* */
).
また、同じショートカットをマッピングします(デフォルトは ctrl+c2つのマッピングや複雑なコマンドセットを覚えておく必要はありません。
私は/* ... */
(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 */
@reg
にmap
または.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
とてもいい質問ですが、いい答えはそれほど多くありません。まず、ここではブロック挿入モードを使用することは簡単ではない解決策ですが、キーストロークが多すぎるため、コード編集のパフォーマンスを向上させるには、選択した行で作業する必要があります。誰も言及していないもう一つのポイント:コメント記号をどこに置くべきか - 行の最初の部分にあるのか、それとも実際のテキストの前にあるのか?おそらく好みの問題ですが、私の意見では、コードを読みやすくするためにテキストの前に置くべきです。コメント記号が行頭に置かれると、インデントされたコードの視覚的な一貫性が損なわれるので、箇条書きリストそれを念頭に置いて、私は次の解決策になった(私は#コメントの例を作る)。私の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つを少し変更しました。コメントアウトするには 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>
行をコメントにするには(全言語用):
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
:%s/^/\/\// g
文字との間のスペースを削除します。このコマンドを使用して、.CファイルまたはCPPファイルをコメント化します。
@ CMSのソリューションは、行をコメントアウトする最も「ネイティブな」方法です。 @ CMSの2番目のステップでは、 CtrlVあなたも使うことができます r# コメントを追加する x それらを削除します。 46ページのDrew Neilの Practical Vim がこのテクニックをよく説明しています。
他の良い方法はex modeコマンドを使うことです。 :[範囲]normali##⌴。明らかに、これを使ってキーストロークを節約するには、15行以上をコメントアウトする必要があります。
"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コードのブロックをコメント/コメント解除するための最もエレガントな方法は何ですか? の人からオリジナルのコードを入手し、いくつかの小さな変更を加えました(ショートカットキーの変更、#の後のスペースの追加).
私は個人的に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>
ファイル全体のコメントを解除するには
:g/.spare[1-9].*/,+2s/^/\/\//
上記のコードは、「スペア」を含むすべての行をコメントアウトし、その後に数字を追加して、それが見つかった行からさらに2行コメント化します。そのような用途の詳細については、 http://vim.wikia.com/wiki/Search_and_replace#Details をご覧ください。
Tcommentやnerdcommenterのようないくつかのvimプラグインがあります。
私はコメントを目的としてtcommentを使います。
gcc:現在の行のコメントを切り替えます。 v {motion} gc:視覚的に選択した行の範囲のコメントを切り替えます。
例:v3jgcは3行の領域を切り替えます。
これらのコマンドは、あらゆる言語のコメントを処理するのに役立ちます。
この解決策は、/をコメントにマップしますか。コメント解除(単一マッピングを使用したコメントの切り替えは複雑すぎて正しく実装できません)。 /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>"