Vim、状況依存のコメント/コメント解除動作


9

私は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

そして、これら2つはHTMLスタイルでコメント/コメント解除します

"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

これらのマクロは、目的のファイルタイプに適用すると問題なく機能しますが、PHPファイル内にHTMLが埋め込まれていることが多いため、PHPのコメントスタイルは役に立ちません。

VimがPHPファイル内のHTMLコードのチャンクで動作しているかどうかを検出し、正しいコメント動作を適用する方法はありますか?

編集:私は手動でファイルタイプを設定できること、そしてこれに使用できるプラグインがあることを知っています、より良いマクロを書くことについてもっと学びたいと思っていました。


2
あなたは、ソート探しのだだからVimのEmacsのMMMモードにアナログリードに、vim.wikia.com/wiki/...
ジル「SO-停止されて悪」

回答:


2

あなたがやりたいことをするために、関数を書いてそれをあなたの好みのキーにマッピングする方法は本当にありません。

開始: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>

0

使用するコメントのタイプを手動で選択することに同意できる場合は、このヒントをお勧めします

覚えておくべき4つの組み合わせがあります。

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.