我一直在寻找在Vim中映射一个新的运算符,它需要一个额外的参数。
例如,我们知道ciw会“切入内部”,并将您插入到插入模式,我正在寻找的是采用自定义操作来替换像iw这样的动作的c(例如s),但需要一个额外的参数。
一个微不足道的例子是:
Given a line in a text file
并以正常模式执行(给定第一列上的光标)siw *,它将围绕第一个字与*一样:
*Given* a line in a text file
我知道,这是最优秀的环绕.vim插件。但我只是在这里给出一个例子,并寻找一个关于如何获得映射以使上述工作的答案。
我尝试玩onoremap和opfunc,但似乎无法让他们玩我想要的方式。
所以这是一个运动和操作符等待映射的组合。
这里是问题描述的命令的一个例子,
为说明目的。
原文链接:https://www.f2er.com/bash/388340.html为说明目的。
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()。