加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 19:37:52 所属栏目:安全 来源:网络整理
导读:我一直在寻找在Vim中映射一个新的运算符,它需要一个额外的参数。 例如,我们知道ciw会“切入内部”,并将您插入到插入模式,我正在寻找的是采用自定义操作来替换像iw这样的动作的c(例如s),但需要一个额外的参数。 一个微不足道的例子是: Given a line in
我一直在寻找在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()。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读