Как я могу обернуть текст в Vim до некоторой длины?

102

Поговорим об относительных мерах. Мой Vim выглядит так:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Хотелось бы, чтобы было меньше:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Как я могу это получить? А как мне управлять настройкой длины такого блока?

Лео Леопольд Герц 준영
источник
Вы имеете в виду перенос текста, а не отступ текста?
lc.
lc: Не знаю разницы. Я собирался написать wrap, как мне рекомендовали, но у меня так и не получилось.
Лео Леопольд Герц 준영

Ответы:

177

На самом деле вы можете сделать две вещи:

  1. Позвольте vim отформатировать (т.е. изменить) ваш текст так, чтобы строки были короче, вставив разрывы строк
  2. Оставьте строки как есть, но отобразите их завернутыми

Какой ты хочешь?

Вариант 1 будет достигнут путем установки textwidth(например :set textwidth=30(из ответа Swaarop)). Затем вы можете переформатировать текст, выделив его (в визуальном режиме) и набрав gq. (textwidth может быть сокращено как tw, таким образом :set tw=30.)

Вариант 2 можно переключить, запустив :set wrap / :set nowrap. Это приведет к переносу строк, которые слишком длинные для окна.

Оба независимы.

Sleske
источник
33
+1 для ключевой команды gq из визуального режима, это очень полезно
Fire Crow
3
К вашему сведению, это разбивается на пробелы, и gqgq ничего не делает с строкой, как показано в вопросе, даже если tw = 5.
dlamblin
2
@Dlamblin: Верно. Если вы хотите сложить точно заданную ширину без учета пробелов, используйте foldкоманду, как в ответе fgm.
sleske
Насколько я понимаю, ваш вариант не работает. wrapбудет переноситься на границе окна, а не на textwidth.
DerWeh
@DerWeh: Да, обертка будет переноситься по границе окна. Я отредактировал, чтобы уточнить.
sleske
60

После установки «textwidth» вы можете выделить текст в визуальном режиме и нажать gq, чтобы красиво обернуть его (вы также можете использовать Q в некоторых старых / устаревших конфигурациях).

Несколько полезных советов:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Влад Догару
источник
3
+1, я случайно нажал gq, находясь в vim, последние полчаса пытался увидеть, во что я попал. Это так полезно.
user176121 01
gqqтакже переносит текущую строку (вместо gqgqили gq$).
Эш
21

Использование fold (1) - это одна из возможностей:

:%!fold -w5 

Результат:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Фриц Г. Менер
источник
1
Это также не учитывает места для складывания
Лайонел
7
@ Лионель: Да. Чтобы соблюсти пробелы, добавьте параметр «-s» в команду сворачивания.
sleske
14
:set textwidth=30
Swaroop CH
источник
Как textwidth обрабатывает это, когда нет пробелов, как в исходном примере плаката? У меня была игра, и она, похоже, форматируется на основе ширины текста, только если есть пробелы (или предположительно, если для переменной breakat установлено что-то еще).
Энди
3
@Andy textwidthне справится с ситуацией без пробелов. Для этого вы можете написать свою собственную formatexprфункцию.
Swaroop CH
8

Если у вас есть текст без пробелов, который вы хотите разбить на определенную длину, нет необходимости использовать внешний foldили писать свой собственный formatexpr.

:%s/\(.\{80\}\)/\1\r/g

разбивает все строки на 80 символов.

kthy
источник
2
Это спасло мне день при воскрешении сертификата OpenSSL. Спасибо
Дженгиз