Vim - 基于语法在上下文中更改命令的行为

时间:2014-03-09 04:40:51

标签: vim

我倾向于有这样的评论专栏:

// This is a comment. 
// This is the second line of a comment paragraph.

// This is a second paragraph...

我把光标放在这些线的中间,我想开始添加一些东西。通常是在段落的开头添加一个句子。点击I会将我带到//之前。这是我想经常做的事情,它有点让我觉得没有一个快速的方法去没有一堆移动命令或像^wi这样的尴尬的目标。

我想将I命令调整为“智能”,这样只有当我的光标位于注释语法区域时,我才希望vim执行^wi

我可以这样做吗?我很确定我能做到这一点因为我在某个地方有一个小命令能够告诉我光标所在的语法类型。

2 个答案:

答案 0 :(得分:2)

您可以保留这样的映射,将光标移动到/

之后的第一个单词
nmap <leader>I F/wi

这是一个小型演示:

demo gif

答案 1 :(得分:2)

你可以做一个单行,但是当涉及条件时,我更喜欢使用一个函数:

:nnoremap I :call SmartInsert()<CR>

在函数中,您可以使用synIDattr()来获取活动语法项的名称;请参阅:help synID()下的示例。然后,您可以根据名称是否包含“注释”采取不同的操作。根据需要移动光标,然后使用:startinsert结束功能。

:help synIDattr()
:help =~?
:help :if
:help :startinsert
:help user-functions

OP编辑:感谢您的出色点。我开始写这个函数,就在这里。这真的很方便。

function! SmartInsert()
    if synIDattr(synID(line("."), col("."), 1), "name") =~ "LineComment$"
        normal! ^w    " Can enhance this with something more general (no need tho)
        startinsert
    else
        call feedkeys('I', 'n')
    endif
endfun

nnoremap I :call SmartInsert()<CR>