Выровнять вправо в визуальном блоке - PullRequest
3 голосов
/ 19 марта 2012

Я хотел бы знать, как выровнять по правому краю в визуальном блоке, не изменяя текст раньше и блок.

Я использовал этот код до:

:<C-U>'<,'>s/\%V\(.\{-}\)\(\s\{-}\)\%(\%V\@!\|$\)/\2\1/ 

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

Нет ли способа выровнять текст вправо в визуальном блоке, независимо от того, что написано после блока?

Пример:

text before +align text     text after 
text before   align text    text after
text before  align text     text after
text before     align text+ text after 

Что я хочу сделать, это выбрать блок текста от + до + (см. Пример выше) и выровнять его вправо.Выходные данные должны быть:

text before      align text text after 
text before      align text text after
text before      align text text after
text before      align text text after 

Над кодом работает, но он не работает, если в каждой строке после align text ничего не написано.

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Для правильного решения проблемы со всеми угловыми случаями я бы использовал следующая функция.

function! RightAlignVisual() range
    let lim = [virtcol("'<"), virtcol("'>")]
    let [l, r] = [min(lim), max(lim)]
    exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./\=StrPadLeft(submatch(0),r-l+1)'
endfunction
function! StrPadLeft(s, w)
    let s = substitute(a:s, '^\s\+\|\s\+$', '', 'g')
    return repeat(' ', a:w - strwidth(s)) . s
endfunction
2 голосов
/ 06 июня 2017

Я использую это. Поместите курсор перед текстом, который должен быть выровнен вправо. Выполнить :Right Как это работает:

  1. v0 Визуально выбрать текст от текущей позиции до начала строки
  2. d Удалить выделенный текст и поместить в буфер
  3. :right Выровнять текст по правой стороне курсора
  4. 0 Установить курсор на первый столбец
  5. gv Визуально выберите ту же область, которую мы удалили до
  6. p Заменить выделенное на удаленный текст

    command! Right execute "normal v0d\<CR>:right\<CR>0gvp"

1 голос
/ 20 марта 2012
:'<,'>s/\%V.*\%V/\=printf("%*s", col("'>")-col("'<"), substitute(submatch(0), '^\s*\|\s*$', '', 'g'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...