2012-11-10 71 views
1

我發現,改性一些的vimrc代碼我發現註釋出電流線/塊VIM:如何使用變量簡化此vim快捷方式?

" 
" 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」(我也嘗試過沒有&),所以我改變它到第一個代碼塊。但是,我的強迫症不會讓我失望。我已經完成了一些在這種情況下如何在vim中使用變量的方法,但是我沒有嘗試過。有什麼建議麼?

回答

1

你有兩個錯誤的語法在這裏:

  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>這裏:它將使只爲你在命令行打開的第一個文件發表評論。)


爲什麼重新發明輪子,已經有很多評論插件了?我個人使用NERD評論員。它可以配置爲使用\c進行評論,默認情況下它使用<Leader>cc以這種方式發表評論(還有更多可用選項)。

+0

我自定義和學習vim在同一時間。所以搜索/複製/編寫這些東西,幫助我學習vim語言。尤其是這一點,大多數搜索結果都指向我的插件,但我希望腳本能夠學習。所以我一直在黑客攻擊並試圖強制它工作(如你所見:D)。我相信我最終會換用一個插件,但現在這是一個練習。 – Joel