繁体   English   中英

在vim map-operator函数中使用外部命令

[英]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!
}

Ex命令始终按行排列,因此无法轻松实现所需的功能。 有一些插件可以帮助您解决此问题(例如Dr. Chips VIS插件或我的NrrwRgn插件。但是我不确定,在特定的omaps情况下它们是否对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM