2

我想创建一个 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 :!sortthen vi{,s,但最好将它作为运算符映射(更少输入,更灵活等)。

4

2 回答 2

2

我不认为外部过滤:!可以是任何其他东西然后线。

如果你需要这样的东西,我认为你需要求助于system函数之类的东西并“手动”操作缓冲区内容,而不是依赖 Vim 的过滤命令。

在逐行的情况下,以下更简单的咒语修复了它:

'[,']!sort

也就是说,而不是silent exe "normal! '[V']!sort". 我认为 exec/ 隐含的额外模式切换normal会杀死操作员挂起模式(?)。

{
    Hello, World!
    Hello, Earth!
    Hello, Planet!
}

(光标在 上W,输入,SiB):

{
    Hello, Earth!
    Hello, Planet!
    Hello, World!
}
于 2013-08-20T20:04:31.493 回答
1

Ex 命令始终是逐行的,因此它不容易按您的意愿工作。有一些插件可以帮助您解决这个问题(例如 Dr. Chips VIS 插件或我的NrrwRgn插件。但我不确定它们是否在特定的 omaps 情况下对您有所帮助。

于 2013-08-20T20:49:48.327 回答