3

В почтовой ветке Алиса и Боб отправили мне письмо с невероятно длинными строками. Я хотел бы отправить ответ, который выглядит следующим образом:

alice> blah blah blah, foo dee bar dee baz, ho hum and then
alice> she said: "what do you think I am, a top poster?"

Teh lulz

bob> that's not funny

Yes it is lol :D

Я хочу, чтобы каждая строка имела максимальную ширину из n символов, и чтобы каждая строка имела префикс «$ {name}>». Я не хотел бы возиться с каждой строкой, то есть я хотел бы ввести что-то, довольно близкое к минимальному [имя 1, имя 2, иди обернуть вещи], но в любом случае что-то, что O(1) по длине входные строки (вероятно, O(k) в количестве длинных строк, по одному g q } для каждой).

Возможно ли это и как? Если нет, то как мне лучше всего это приблизить?

3 ответа3

3

Можно использовать один из вариантов :set formatoptions+=n в сочетании с пользовательским formatlistpat . Опция n переформатирует нумерованные списки, добавляя к пробелу эквивалентное количество пробелов. Он может быть адаптирован для использования в этом случае путем определения соответствующего лидера списка:

set fo+=n
let &flp='\w\+> '

Чтобы проиллюстрировать эффекты, рассмотрим следующий пример:

alice> foo bar baz qux foo bar baz qux
bob> foo bar baz qux foo bar baz qux

Используя tw=20 в этом случае, g q } производит:

alice> foo bar baz
       qux foo bar
       baz qux
bob> foo bar baz qux
     foo bar baz qux

Этот метод правильно переносит строки без изменения tw , но он только добавляет пробелы. Если перед каждой новой строкой необходимо добавить name> требуется еще одна операция, но это, по крайней мере, обрабатывает перенос.


Кроме того, цитаты в этом формате могут рассматриваться как comments . К сожалению, этот метод не принимает регулярные выражения и поэтому требует явных имен. Флаг b может использоваться для запроса пробела после лидера комментария:

set comments+=b:alice>,b:bob>

При этом, используя тот же пример, что и выше, переформатирование дает:

alice> foo bar baz
alice> qux foo bar
alice> baz qux
bob> foo bar baz qux
bob> foo bar baz qux

Вот простая функция, которая использует это, и соответствующая команда для удобства:

function! Format(name1, name2)
    execute "set comments+=b:" . a:name1 . ">,b:" . a:name2 . ">"
    execute "normal gq}"
    execute "set comments-=b:" . a:name1 . ">,b:" . a:name2 . ">"
endfunction

command! -nargs=* F call Format(<f-args>)

Таким образом :F alice bob может быть использована для получения результатов образца выше.

1

Если у вас довольно свежая версия Vim (echo v:version > 703 || v:version == 703 && has("patch541")), вы можете использовать set formatoptions+=j .

Это говорит Vim при переформатировании с gqq сохранять лидеры комментариев (например, # в большинстве языков сценариев или * для комментариев в стиле javadoc).

Все, что осталось сделать, это правильно настроить comments :

set comments+=b:alice>,b:bob>

Как отмечалось ранее, comments еще не поддерживают регулярные выражения, поэтому вам нужно явно указать имена всех респондентов.

0

Один из методов, который я считаю крайне неудовлетворительным, заключается в следующем:

  • вычислить ширину, в которую должен быть обернут текст длинной строки
  • установить ширину переноса (err, textwidth , no?) соответственно
  • завернуть длинную очередь
  • :'<,'> S /^ /алиса /
  • повторить для следующей длинной строки
  • когда все длинные строки сделаны, восстановите ширину переноса до нормальной.

В частности, я ленивый и не хочу делать вычисления. Входные данные - O(1) и O(k), поэтому мой список требований, по-видимому, неполон. Такова жизнь :-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .