微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用参数定义新的Vim运算符

我一直在寻找在Vim中映射一个新的运算符,它需要一个额外的参数。

例如,我们知道ciw会“切入内部”,并将您插入到插入模式,我正在寻找的是采用自定义操作来替换像iw这样的动作的c(例如s),但需要一个额外的参数。

一个微不足道的例子是:

Given a line in a text file

并以正常模式执行(给定第一列上的光标)siw *,它将围绕第一个字与*一样:

*Given* a line in a text file

我知道,这是最优秀的环绕.vim插件。但我只是在这里给出一个例子,并寻找一个关于如何获得映射以使上述工作的答案。

我尝试玩onoremap和opfunc,但似乎无法让他们玩我想要的方式。

所以这是一个运动和操作符等待映射的组合。

这里是问题描述的命令的一个例子,
为说明目的。
nnoremap <silent> s :set opfunc=Surround<cr>g@
vnoremap <silent> s :<c-u>call Surround(visualmode(),1)<cr>
function! Surround(vt,...)
    let s = InputChar()
    if s =~ "\<esc>" || s =~ "\<c-c>"
        return
    endif
    let [sl,sc] = getpos(a:0 ? "'<" : "'[")[1:2]
    let [el,ec] = getpos(a:0 ? "'>" : "']")[1:2]
    if a:vt == 'line' || a:vt == 'V'
        call append(el,s)
        call append(sl-1,s)
    elseif a:vt == 'block' || a:vt == "\<c-v>"
        exe sl.','.el 's/\%'.sc.'c\|\%'.ec.'c.\zs/\=s/g|norm!``'
    else
        exe el 's/\%'.ec.'c.\zs/\=s/|norm!``'
        exe sl 's/\%'.sc.'c/\=s/|norm!``'
    endif
endfunction

获取用户输入,使用函数InputChar(),假设
必需参数是单个字符。

function! InputChar()
    let c = getchar()
    return type(c) == type(0) ? nr2char(c) : c
endfunction

如果需要接受字符串参数,请调用input()而不是InputChar()。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐