2013-08-20 56 views
2

我想创建一个允许运动控制输出文本的vim映射。似乎没有很多关于此的文档,并且我无法将the sample in vim's help page更改为我需要的内容。这是我所拥有的,它不会给出任何错误,但不会取代文本。我错过了什么?在vim map-operator函数中使用外部命令

nmap ,s :set opfunc=CustomFunc<cr>[email protected] 

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,但它将作为运营商映射(少打字,更灵活,等等)将是很好的。

+0

代替使用'!',使用'system'函数来转换文本,在这种情况下使用'system'的例子可以在这里找到[http://vim.wikia.com/wiki/Act_on_text_objects_with_custom_functions]。另外,'TextTransform'插件将会保存你不需要手动编写运算符函数 –

回答

2

我不认为外部过滤与:!可以是任何其他行,然后行。

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

而在面向行的情况下,下面,要简单得多,咒语修复它:

'[,']!sort 

也就是说,而非silent exe "normal! '[V']!sort"。我认为exec/normal隐含的附加模式切换会导致操作员挂起模式(?)。

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

(光标上W,类型小号):

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

这是非常好的!任何想法如果我选择它时select_save和reg_save会咬我吗?我现在有一个onilent函数,带'silent exe''[,']!sort“'伟大的作品 – redbmk

+0

我不觉得有资格猜测有关selection_save/reg_save没有进一步学习... – sehe

1

Ex命令总是面向行的,所以它不容易工作什么你要。有一些插件可以帮助你(例如Chips VIS plugin或我的NrrwRgn插件,但是我不确定,如果他们在omaps的这种特殊情况下帮助你的话)

相关问题