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

前端之家收集整理的这篇文章主要介绍了使用参数定义新的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()。

猜你在找的Bash相关文章