在vim-map操作符函数中使用外部命令



我想创建一个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的特定情况下对你有帮助。

相关内容

最新更新