我想创建一个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
上,键入,S1):
{
Hello, Earth!
Hello, Planet!
Hello, World!
}
Ex命令总是线条化的,所以它不容易满足您的需要。有一些插件可以帮助你(例如Dr.Chips VIS插件或我的NrwRgn插件。但我不确定它们是否在omaps的特定情况下对你有帮助。