1

vimの現在の行/ブロックをコメントアウトするために見つけたいくつかのvimrcコードを見つけて変更しました。

"
" Commenting blocks
"
autocmd FileType c,cpp,java noremap <buffer> <Leader>c :s,^\(\s*\)[^// \t]\@=,\1// ,e<CR>:nohls<CR>zvj
autocmd FileType sh,python  noremap <buffer> <Leader>c :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
autocmd FileType vim        noremap <buffer> <Leader>c :s,^\(\s*\)[^\" \t]\@=,\1\" ,e<CR>:nohls<CR>zvj

autocmd Filetype c,cpp,java noremap <buffer> <Leader>u :s,^\(\s*\)// \s\@!,\1,e<CR>:nohls<CR>zvj
autocmd Filetype sh,python  noremap <buffer> <Leader>u :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj
autocmd Filetype vim        noremap <buffer> <Leader>u :s,^\(\s*\)\" \s\@!,\1,e<CR>:nohls<CR>zvj

元のコードでは、autocmd FileType行を使用して変数を設定し、行のコメントを定義していました。これは次のように見えました。

autocmd FileType c,cpp,java let b:cmtldr=//
autocmd FileType sh,python  let b:cmtldr=#
autocmd FileType vim        let b:cmtldr=\"

noremap <buffer> <Leader>c :s,^\(\s*\)[^&b:cmtldr \t]\@=,\1&b:cmtldr ,e<CR>:nohls<CR>zvj

しかし、これは私にとってはうまくいきませんでした。リテラル文字列「&b:cmtldr」に貼り付けられただけなので (& なしでも試しました)、コードの最初のブロックに変更しました。しかし、私のOCDはそれをさせません。このコンテキストでvimで変数を使用する方法をいくつか検索しましたが、何も役に立ちませんでした。助言がありますか?

4

1 に答える 1

1

ここには2つの間違った構文があります。

  1. :letはとは異なる:setため、ここで式を使用する必要があり、のようになりますlet b:cmtldr="\""
  2. 変数の値を正規表現に入れる方法はなく、それを使用\=して置換文字列に入れる必要があります。使用する:executeか、<C-r>ここで使用することをお勧めします。

    noremap \c :s,\v(\s*)(\V<C-r>=escape(b:cmdldr, '\,')<CR>\v|\s)@!,\=submatch(1).b:cmtldr,e<CR>:nohl<CR>zvj
    

    (実際にここにあるという意味ではなかったと思います<buffer>。コマンドラインから開いた最初のファイルに対してのみコメントが有効になります。)


なぜ車輪の再発明をするのですか、コメントプラグインはすでにたくさんありますか?私は個人的にNERDConmenterを使用しています。コメントに使用するように構成できます。\cデフォルトでは<Leader>cc、このような方法でコメントに使用します(使用可能なオプションは他にもあります)。

于 2012-11-10T22:27:50.130 に答える