Vim内联重映射来检查第一个字符

问题描述:

我想在内联的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

我@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

有许多评论插件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

还有这个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