2012-08-08 55 views
2

我想在內聯的if中做一個評論重映射,以檢查它是否已被評論。這是我已經,當然它不工作哈哈:Vim內聯重映射來檢查第一個字符

imap <c-c> <Esc>^:if getline(".")[col(".")-1] == '/' i<Delete><Delete> else i// endif 

我想要做的是檢查的第一個字符,如果它是一個/與否。如果是/,則刪除該行上的前兩個字符,如果它不是/,則在行前添加兩個//

我原本是這樣的:

imap <c-c> <Esc>^i// 

這完美地工作,但我想是能夠隨心所欲地發表評論/取消註釋。

+1

我的意思並不是要粗魯,但爲什麼另起爐竈?我會去爲https://github.com/tpope/vim-commentary小而強大 – lucapette 2012-08-08 16:24:44

+0

我試了一堆插件,但無法得到任何工作:( – jfreak53 2012-08-08 17:57:38

回答

3

我@Peter Rincker反對在插入模式下這樣做,並指點你到全功能的插件答案警告完全同意。

但是,我無法抗拒寫這個函數來完成你所要求的。我發現使用函數處理這種映射更容易。作爲一個額外的好處,它會返回您插入模式的行中與您開始相同的位置(已通過插入或刪除字符進行移位)。

function! ToggleComment() 
    let pos=getpos(".") 
    let win=winsaveview() 
    if getline(".") =~ '\s*\/\/' 
     normal! ^2x 
     let pos[2]-=1 
    else 
     normal! ^i// 
     let pos[2]+=3 
    endif 
    call winrestview(win) 
    call setpos(".",pos) 
    startinsert 
endfunction 

inoremap <c-c> <Esc>:call ToggleComment()<CR> 

注意對pos的修改以確保將光標返回到正確的列。在這種類型的函數中,命令startinsert可用於返回插入模式。使用noremap進行映射總是比較安全,除非有很好的理由不這樣做。

這似乎工作得很好,但它不是非常類似Vim,你可能會發現其他插件從長遠來看更加靈活。

+0

哇!謝謝你太多了!當我嘗試製作任何東西時,無法獲取函數爲我工作,所以我只是不再嘗試了:(但那太棒了! – jfreak53 2012-08-08 17:57:19

+0

您需要小心這裏。如果您在一行的開始或結尾處切換註釋它不會正確恢復位置,您可能還想使用' u'將變化分解爲2個單獨的撤銷塊。 – 2012-08-08 18:27:52

+0

它並不是真的需要恢復位置,至少不是爲了我,我不明白爲什麼我需要小心。它正是我所需要的,評論和取消註釋,簡單而有效。 – jfreak53 2012-08-08 19:12:01

4

有許多評論插件VIM:

我強烈建議你在決定推出自己的產品之前首先看看這些插件。它會爲你節省很大的努力。

作爲一個便箋,你通常會想在正常模式下不插入模式下評論/取消註釋。這不僅是vim的方式,而且還會提供更好的撤銷歷史記錄。

如果你已經無法創建自己的映射,我建議你創建一個函數來完成所有的辛苦工作,並通過:call讓你的映射調用該函數。如果你認爲你可以通過簡單的邏輯來獲得不需要函數,那麼你可以使用表達式映射(見:h map-<expr>)。你可能想組織成一個插件,因爲它可能很大。如果是這樣的話,請看:h write-plugin,以便讓您感覺 以正確的方式編寫插件。用於切換評論的簡單表達映射

例子:

nnoremap <expr> <leader>c getline(".") =~ '\m^\s*\/\/' ? '^"_2x' : 'I//<esc>`[' 
+0

謝謝,我試過插件,無法得到任何工作:(所以,因爲它只是一個簡單的評論PHP的只有/這很簡單,我想:) – jfreak53 2012-08-08 17:55:30

+2

你可能想驗證你有一個正常或巨大版本的vim通過':version'。也遵循插件的指示如果你想使用插件,我建議病原體:https://github.com/tpope/vim-pathogen或Vundle:https://github.com/gmarik/vundle/ – 2012-08-08 18:40:34

1

還有這個vimtip! http://vim.wikia.com/wiki/Comment/UnComment_visually_selected_text

我用一個底部與

... 
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR> 
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR> 

,c comments out a region 
,u uncomments a region