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

时间:2019-05-24 08:34:36

标签: vim

假设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是Control-V。

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

我是否可以调用其他一些函数或可以传递给virtcol的表达式,以编程方式获取Visual Block选择项中最右边的列的列号?

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

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

2 个答案:

答案 0 :(得分:0)

您可以编写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()

答案 1 :(得分:0)

没有直接的方法可以通过标记来区分这些情况。一种解决方案是自己分析文本,将最长的行长添加到最左侧的可视标记位置。检查这两个标记非常重要,因为如果一开始就选择了它们,它们可能会被颠倒。

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
相关问题