首页 > 解决方案 > 如何将可视范围传递给没有数字或在 vim 中使用 :command 的函数?

问题描述

如何从脚本而不是命令行/映射将视觉选择传递给函数。我想知道这样的事情是否可能?或者如果有一个函数可以获得一个范围?

我想要的是:

:call LowerToUpper('<,'>)
:call LowerToUpper(GetVisualRange())

不是这个

:call LowerToUpper(1,5)
command! -range Edit call LowerToUpper(<line1>,<line2>)
:'<,'>LowerToUpper

下面是函数示例:

function! LowerToUpper(first,last) abort
for lineno in range(a:first,a:last)
    let line = getline(lineno) 
    let newLine= substitute(line, '\v(\w)','\U\1','g')
    call setline(lineno,newLine)
endfor
endfunction

解决方案可能是创建一个返回视觉选择 GetVisualSelection() 的函数。

标签: vim

解决方案


您可以使用range修饰符来实现您的功能。

function! LowerToUpper() abort range
    for lineno in range(a:firstline, a:lastline)
        let line = getline(lineno)
        let newLine = substitute(line, '\v(\w)','\U\1','g')
        call setline(lineno, newLine)
    endfor
endfunction

'<,'>call LowerToUpper()

这主要是作为传递line("'<")line("'>")隐式传递的捷径。参数名称a:firstlinea:lastline是固定的。


推荐阅读