2010-10-06 29 views
3

我有一個簡單的目標:映射Ctrl-C,一個命令,我不認爲我曾用它來殺死vim,在一行的開頭自動插入正確的字符(s)根據文件的文件類型將該行註釋掉。將vim變量插入到文本中用於評論快捷鍵

我想我可以使用自動命令識別文件類型,並在打開文件時將vim變量設置爲正確的註釋字符。所以,我想是這樣的:

" Control C, which is NEVER used. Now comments out lines! 
autocmd BufNewFile,BufRead *.c let CommentChar = "//" 
autocmd BufNewFile,BufRead *.py let CommentChar = "#" 
map <C-C> mwI:echo &CommentChar<Esc>`wll 

那地圖標誌着我目前的位置,去插入模式行的開頭,相呼應,在這一點上註釋字符(S),進入命令行模式,可以追溯到到設置的標記,並右移兩個字符以彌補插入的註釋字符(假設C風格註釋)。

斜體部分是我遇到麻煩的部分;它只是作爲一個場所持有人來代表我想要做的事情。你能幫我弄清楚如何做到這一點?如果您使用strlen(CommentChar)將正確的空格數量向右移動,則可獲得獎勵積分! vim-master的額外獎勵點數,包括如何在視覺模式下進行塊式評論!

我對vim腳本還是比較新的;我的.vimrc只有98行,所以如果你能幫我解釋你提供的任何答案!謝謝。

回答

5

你可以在這裏使用<C-r>

noremap <C-c> mwI<C-r>=g:CommentChar<CR><Esc>`wll 

看到:h i_CTRL-R

也看NERDCommenter插件,它映射將是這樣的:

" By default, NERDCommenter uses /* ... */ comments for c code. 
" Make it use // instead 
let NERD_c_alt_style=1 
noremap <C-c> :call NERDComment(0, "norm")<CR> 

而且你不會有自己定義註釋字符。

+0

'='寄存器真棒:) – Benoit 2010-10-06 06:21:04

+0

感謝您解釋這一切。我曾閱讀過關於i_CTRL-R但並未理解的內容。感謝你,我已經得到了我的小腳本來工作(但將wll更改爲'w:exe「normal」.strlen(CommentChar)。「l」以使光標回到正確的位置)。同樣感謝你,我放棄了我的腳本,現在正在使用NERDCommenter!但至少我在這個過程中瞭解了更多關於vim的知識。 – physicsmichael 2010-10-06 15:52:14

2

我在某些時候把它從vim tips wiki上拿下來,並自己使用它。唯一的缺點是它出於某種原因在線的末尾添加了空格,可能是我忽略的一些小事。

" Set comment characters for common languages 
autocmd FileType python,sh,bash,zsh,ruby,perl,muttrc let StartComment="#" | let EndComment="" 
autocmd FileType html let StartComment="<!--" | let EndComment="-->" 
autocmd FileType php,cpp,javascript let StartComment="//" | let EndComment="" 
autocmd FileType c,css let StartComment="/*" | let EndComment="*/" 
autocmd FileType vim let StartComment="\"" | let EndComment="" 
autocmd FileType ini let StartComment=";" | let EndComment="" 

" Toggle comments on a visual block 
function! CommentLines() 
    try 
     execute ":[email protected]^".g:StartComment." @\@g" 
     execute ":[email protected] ".g:EndComment."[email protected]@g" 
    catch 
     execute ":[email protected]^@".g:StartComment." @g" 
     execute ":[email protected][email protected] ".g:EndComment."@g" 
    endtry 
endfunction 

" Comment conveniently 
vmap <Leader>c :call CommentLines()<CR> 
+2

感謝StartComment和EndComment的心態。這對其他任務也很有用。 – physicsmichael 2010-10-06 15:53:16

+0

希望我能對此讚賞兩次!順便說一句,最後的空格是由@字符之前和之後的執行行中的硬編碼空格造成的。把它們拿出來,如果你喜歡在實際的StartComment和EndComment vars中加入補償空格 – Magnus 2013-02-18 18:02:34

+0

我發現有一點小改進很有用:使用b:StartComment和b:EndComment(用於初始化和使用)。這允許你在不同的緩衝區中有不同的值。如果您打開多個使用不同評論字符的文件類型,這一點非常重要。 – Matthew 2013-02-23 07:22:42

相關問題