使用参数定义新的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()。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读