代码之家  ›  专栏  ›  技术社区  ›  merlin2011

有没有办法获得视觉块选择的最右边的列?

vim
  •  0
  • merlin2011  · 技术社区  · 7 年前

    virtualedit= . 考虑以下文本文件。

    1 2 1 1 1 1 1 1
    1 3 1 1 1 1 1 1
    1 4 1 1 1 1 1 1 1 1
    1 1 1 1 7 1 1 1
    

    如果我是视觉块,请选择第2行到第4行并使用 $ 要使所选内容成为非矩形,以下代码将无法在所选内容中找到最右边的列。更明确地说,我使用键序列 2G^vjj$ ,在哪里 ^v 是控制-V。

    " rightmostCol becomes 15, not 19 as desired.
    let rightmostCol = virtcol("'>")
    

    是否有其他函数可以调用,或表达式可以传递给 virtcol ,以编程方式获取视觉块选择中最右边列的列号?

    请注意,简单地查找可视块中最长直线的长度是不正确的,因为可视选择也可能是矩形的,并且不应以相同的方式处理这些情况。

    编辑 :如果可以确定视觉块选择是否为矩形,则也可以。

    0 回复  |  直到 7 年前
        1
  •  0
  •   merlin2011    7 年前

    没有直接的方法通过标记来区分这些病例。一种解决方案是自己分析文本,将最长的行长度添加到最左边的可视标记位置。检查这两个标记是很重要的,因为如果在开始时进行选择,它们可能会反转。

    function! RightmostVirtualColumn()
        let reg_v = @v
        silent normal! gv"vy
        let max = 0
        for line in split(getreg('v'), '\n')
            let len = strlen(line)
            let max = max([len, max])
        endfor
        let @v = reg_v
        let max += min([virtcol("'<"), virtcol("'>")]) - 1
        return max
    endfunction
    
        2
  •  0
  •   builder-7000    7 年前

    可以编写VimScript函数:

    function! GetRightmostCol()
       let start=line("'<")
       let end=line("'>")
       let line=start
       let len=len(getline(line))
       while line<=end
          let len=len<len(getline(line))?len(getline(line)):len
          let line+=1
       endwhile
       return len
    endfunction
    

    或者使用寄存器0:

    function! GetRightmostCol()
       let lines=split(getreg(0),"\n")
       let len=0
       for line in lines
          let len=len<len(line)?len(line):len
          let line+=1
       endfor
       return len
    endfunction
    

    然后使用赋值中的函数:

    :let rightmostCol = GetRightmostCol()