gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:12:23 26 4
gpt4 key购买 nike

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

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 内联重映射以检查第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11868538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com