Vim内联重映射来检查第一个字符
我想在内联的if
中做一个评论重映射,以检查它是否已被评论。这是我已经,当然它不工作哈哈:Vim内联重映射来检查第一个字符
imap <c-c> <Esc>^:if getline(".")[col(".")-1] == '/' i<Delete><Delete> else i// endif
我想要做的是检查的第一个字符,如果它是一个/
与否。如果是/
,则删除该行上的前两个字符,如果它不是/
,则在行前添加两个//
。
我原本是这样的:
imap <c-c> <Esc>^i//
这完美地工作,但我想是能够随心所欲地发表评论/取消注释。
我@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,你可能会发现其他插件从长远来看更加灵活。
有许多评论插件VIM:
我强烈建议你在决定推出自己的产品之前首先看看这些插件。它会为你节省很大的努力。
作为一个便笺,你通常会想在正常模式下不插入模式下评论/取消注释。这不仅是vim的方式,而且还会提供更好的撤销历史记录。
如果你已经无法创建自己的映射,我建议你创建一个函数来完成所有的辛苦工作,并通过:call
让你的映射调用该函数。如果你认为你可以通过简单的逻辑来获得不需要函数,那么你可以使用表达式映射(见:h map-<expr>
)。你可能想组织成一个插件,因为它可能很大。如果是这样的话,请看:h write-plugin
,以便让您感觉 以正确的方式编写插件。用于切换评论的简单表达映射
例子:
nnoremap <expr> <leader>c getline(".") =~ '\m^\s*\/\/' ? '^"_2x' : 'I//<esc>`['
谢谢,我试过插件,无法得到任何工作:(所以,因为它只是一个简单的评论PHP的只有/这很简单,我想:) – jfreak53 2012-08-08 17:55:30
你可能想验证你有一个正常或巨大版本的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
我的意思并不是要粗鲁,但为什么另起炉灶?我会去为https://github.com/tpope/vim-commentary小而强大 – lucapette 2012-08-08 16:24:44
我试了一堆插件,但无法得到任何工作:( – jfreak53 2012-08-08 17:57:38