Форматирование строки (заполнение) в VIM - PullRequest
2 голосов
/ 11 февраля 2011

Форматирование строк в VIM вызывает у меня головную боль.

Полагаю, я очень привык к форматированию строк в Python, где вы можете указать, как Выходная строка будет разделена, сколько пробелов между ними и так далее.

Итак, у меня есть плагин VIM, который выводит информацию в чистый буфер, который выглядит следующим образом:

Line: 1 ==>> ErrorName ==>> File Path: /foo

Я строю эту строку перед добавлением в буфер, и все работает фантастически. Но всякий раз, когда у вас есть номера строк, которые отличаются (по цифрам), вы получаете такие вещи:

Line: 1 ==>> Error ==>> File Path: /foo
Line: 123  ==>> ErrorNameLong ==>> File Path: /foo
Line: 12  ==>> ErrorShort ==>> File Path: /foo

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

Line: 1    ==>> Error         ==>> File Path: /foo
Line: 123  ==>> ErrorNameLong ==>> File Path: /foo
Line: 12   ==>> ErrorShort    ==>> File Path: /foo

Мне хорошо известны плагины, которые помогают (например, tabular.vim), но, поскольку это сам плагин, я не хочу требовать зависимости от другого плагина только для простого форматирования строки.

Это то, что я пробовал до сих пор:

  • Вкладки (и вкладки + пробелы)
  • Поиск и замена вкладок (и вкладок с пробелами после рендеринга в буфере)

Мне кажется, к этому должен быть хороший подход, и я просто упускаю его.

Как добиться нужного мне форматирования строки в VIM?

1 Ответ

4 голосов
/ 11 февраля 2011

Я использую две маленькие функции, ничего особенного, одну для добавления отступов после строки и одну, если я хочу добавить перед строкой. Функция PrePad допускает необязательный аргумент символа заполнения, который я иногда использую для дополнения чисел предшествующими нулями.

function! Pad(s,amt)
    return a:s . repeat(' ',a:amt - len(a:s))
endfunction

 "  Pad('abc', 5) == 'abc  '
 "  Pad('ab', 5) ==  'ab   '


function! PrePad(s,amt,...)
    if a:0 > 0
        let char = a:1
    else
        let char = ' '
    endif
    return repeat(char,a:amt - len(a:s)) . a:s
endfunction

" PrePad('832', 4)      == ' 823'
" PrePad('832', 4, '0') == '0823'

Было бы просто использовать Pad () для создания ваших исходных сообщений журнала. Что-то вроде:

echo 'Line: ' . Pad(linenum,8) . '==>> ' . Pad(errmsg,12) . '==>> FilePath: ' . path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...