[英]Using external commands in vim map-operator function
我想创建一个vim映射,该映射允许动作控制输出什么文本。 关于这方面似乎没有太多的文档,并且我无法使vim帮助页面中的示例适应我的需要。 这就是我所拥有的,它没有错误,但不能代替文本。 我想念什么?
nmap ,s :set opfunc=CustomFunc<cr>g@
function! CustomFunc(type, ...)
let sel_save = &selection
let &selection = "inclusive"
let reg_save = @@
if a:type == 'line'
silent exe "normal! '[V']!sort"
elseif a:type == 'block'
silent exe "normal! `[\<C-V>`]!sort"
else
silent exe "normal! `[v`]!sort"
endif
let &selection = sel_save
let @@ = reg_save
endfunction
我使用!sort
作为一个非常简单的测试示例。 这里的想法是您可能有一个类似的代码块:
{
Hello, World!
Hello, Earth!
Hello, Planet!
}
如果要在{}块中将光标移动到某处并键入,si{
,它将替换为
{
Hello, Earth!
Hello, Planet!
Hello, World!
}
解决方法是vi{:!sort<cr>
,或者如果您有vmap ,s :!sort
然后是vi{,s
,但最好将其作为运算符映射(键入更少,更灵活等)。 。
我不认为使用:!
外部过滤:!
沿线可以是其他任何东西。
如果您需要这样的东西,我认为您需要诉诸system
功能之类的东西并“手动”操作缓冲区内容,而不是依靠Vim的过滤命令。
在逐行情况下,以下更简单的方法可以解决此问题:
'[,']!sort
即,代替silent exe "normal! '[V']!sort"
。 我认为exec / normal
所隐含的其他模式切换会杀死操作员挂起的模式(?)。
{
Hello, World!
Hello, Earth!
Hello, Planet!
}
( W
光标,类型为, S i B ):
{
Hello, Earth!
Hello, Planet!
Hello, World!
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.