Vim、状況に応じたコメント/コメント解除動作

Vim、状況に応じたコメント/コメント解除動作

私はVimを使って多くのPHPコードを編集しています.vimrc

私は現在、これら2つのマクロを使用してCスタイルのコメント/コメント解除を実行します。

"c-style (//) comment (press the [.] key)
au FileType php vnoremap . :s/^\(\s*\)\(.\+\)$/\1\/\/\2/<CR>:noh<CR>gv
"c-style (//) uncomment (press the [,] key)
au FileType php vnoremap , :s/^\(\s*\)\/\//\1/<CR>:noh<CR>gv

HTMLスタイルの2つのコメント/コメント解除

"html-style (<!-- -->) comment (press the [.] key)
au FileType html vnoremap . :s/^\(\s*\)\(.\+\)$/\1<!-- \2 -->/g<CR>:noh<CR>gv
"html-style (<!-- -->) uncomment (press the [,] key)
au FileType html vnoremap , :s/^\(\s*\)<!-- \(.*\) -->/\1\2/g<CR>:noh<CR>gv

これらのマクロは、意図したファイル形式に適用するとうまく機能しますが、HTMLがPHPファイルに含まれることが多いため、PHPコメントスタイルは役に立ちません。

VimがPHPファイル内でHTMLコードブロックを処理しているかどうかを検出し、正しいコメントアクションを適用する方法はありますか?

編集:ファイル形式を手動で設定でき、利用可能なプラグインがあることがわかります。より良いマクロの作成について詳しく知りたいです。

ベストアンサー1

必要なものを実行するには、関数を作成してそれを目的のキーにマッピングする方法は実際にはありません。

まず:echo synIDattr(synID(line("."), col("."), 1), "name")、カーソルの下の現在の単語のハイライトグループ名が印刷されます。

この情報を使用して、使用するコメントのスタイルを決定できます。

始めるためのおおよその例:

function! s:MyComment () range
    for i in range(a:firstline, a:lastline)
        exe "normal " . i . "gg"
        normal ^
        let stuff = synIDattr(synID(line("."), col("."), 1), "name")
        if strpart(stuff, 0, 4) == "html"
            normal I<!-- 
            normal A -->
        else
            normal I//
        endif
    endfor
endfunction
vmap <silent> . :call <SID>MyComment()<CR>

おすすめ記事