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

jfr*_*k53 2 vim if-statement inline remap

我正在尝试在 Vim 中使用内联进行注释重新映射if,以检查它是否已被注释。这是我已经拥有的,当然它不起作用哈哈:

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

我想做的是检查第一个字符是否是 a /。如果是 a/则删除该行的前两个字符,如果不是 a则在该行前面/添加两个字符。//

我原来的情况是这样的:

imap <c-c> <Esc>^i//
Run Code Online (Sandbox Code Playgroud)

这非常有效,但我想要的是能够随心所欲地评论/取消评论。

Pri*_*ash 5

我完全同意 @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>
Run Code Online (Sandbox Code Playgroud)

请注意进行修改以pos确保光标返回到正确的列。该命令startinsert在此类函数中非常有用,可以返回插入模式。使用映射总是更安全noremap,除非有充分的理由不这样做。

这似乎工作得很好,但它不太像 Vim,从长远来看,你可能会发现其他插件更灵活。