Есть ли способ получить самый правый столбец выбора визуального блока? - PullRequest
2 голосов
/ 24 мая 2019

Предположим, что 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, чтобы программно получить номер столбца самого правого столбца в моем выделении визуального блока?

Обратите внимание, что просто найти длину самой длинной строки в визуальном блоке неверно, поскольку визуальный выбор может иметьтакже был прямоугольным, и эти случаи не должны обрабатываться одинаково.

Редактировать : Если бы можно было определить, является ли выбор визуального блока прямоугольным или нет, это также сработало бы.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Нет прямого способа отличить эти случаи по меткам. Одним из решений было бы проанализировать текст самостоятельно, добавив самую длинную строку в крайнее левое положение визуальной метки. Важно проверить обе метки, поскольку они могут быть изменены в случае выбора в начале.

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
0 голосов
/ 25 мая 2019

Вы можете написать функцию 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...