Vim如何从功能中设置视觉模式选择?

时间:2013-04-23 21:47:17

标签: vim

我有所需选择的开始和结束(line / col)对。

如何将其设置为实际视觉选择?

例如:

我有缓冲区:

 1 2
 3 4
 5 6

开始:2,1

结束:3,2

:cal SetSelection()

通话后所需的视觉选择:

3 4
5 6

'SetSelection()'是什么样的?

修改

到目前为止,

最佳解决方案,基于答案进行错误检查

"put user in visual mode and set the visual selection

"if arguments are not valid, nothing is changed, and raises an exception

":param 1:

    "Visual mode to leave user in.

    "must be either one of:

    "- 'v' for visual (default)
    "- "\<s-v>" for line visual
    "- "\<c-v>" for block visual
":type 1: string

":returns: 0

":raises: bad mode argument, bad position argument
fu! SetSelection( x, y, x2, y2, ... )
    let valid_mode_strings = ["v","\<s-v>","\<c-v>"]

    if a:0 > 0
        if index( valid_mode_strings, a:1 ) >= 0
            let mode = a:1
        el
            th 'bad mode argument: ' . a:1 . ' valid options: ' . join( valid_mode_strings, ', ' )
        en
    el
        let mode = 'v'
    en

    let oldpos = getpos('.')

    if setpos( '.', [0,a:x,a:y] ) != 0
        exe "norm! \<esc>"
        th 'bad position argument: ' . a:x . ' ' . a:y . ' ' . a:x2 . ' ' . a:y2
    en

    exe 'norm! ' . mode

    if setpos( '.', [0,a:x2,a:y2] ) != 0
        exe "norm! \<esc>"
        cal setpos( '.', oldpos )
        th 'bad position argument: ' . a:x . ' ' . a:y . ' ' . a:x2 . ' ' . a:y2
    en
endf

2 个答案:

答案 0 :(得分:4)

你可以使用函数setpos()来完成这项工作:

fun! SetSelection()
    call setpos('.',[0,2,1])
    normal! v
    call setpos('.',[0,3,2])
endf

在上面的代码中,[2,1][3,2]应该作为传入的参数。我只是硬编码使其变得简单。

还有一些错误处理留给你。例如论证验证等。

答案 1 :(得分:2)

对于这个目的,大多数vim都有m<m>个标记。 :help m<

call setpos("'<", [0, 2, 1])
call setpos("'>", [0, 3, 2])
normal! gv

某些vim安装没有。在这些情况下,您可以保存和恢复用户标记,或使用上下文标记`

call cursor([2, 1])
normal! m`
call cursor([3, 2])
normal! v``