假设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选择项中最右边的列的列号?
请注意,简单地在可视块中找到最长线的长度是不正确的,因为可视选择也可以是矩形的,并且这些情况不应以相同的方式处理。
编辑:如果可以确定可视块选择是否为矩形,那也可以。
答案 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