В VIM, как разбить одну действительно длинную строку на несколько строк?


170

Скажем, у меня есть супер длинная строка в редакторе VIM (скажем, около 300+ символов). Как бы я разбил это на несколько строк, чтобы границы слов примерно разбились на 80 символов?

Пример:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

в

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

Ответы:


254

Vim делает это очень легко (разбивать строки на границах слов).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Я бы посоветовал вам проверить :help gqи :help gw.

Также установка textwidth ( tw) даст вам автоматический разрыв строки при превышении во время набора текста. Он также используется gq, хотя, если он отключен, gqразмер окна изменяется на 79, в зависимости от того, что будет первым.

:set tw=80

При настройке параметров формата для включения ширины текста vim автоматически обрывается при настройке tw.

:set fo+=t

5
Так что для вашего случая gqкоманда будет <ESC>(выйти из режима вставки / замены / и т.д.), затемgq80l
— MidnightLightning

6
Это противоположность Ctrl + j (объединяет несколько строк в одну).
— Измир Рамирес

9
Вим не перестает меня удивлять. Это чистое золото.
— Jondlm

10
просто для следующего человека, который найдет это, gq только не разбивает строку сплошного текста, ему нужны пробелы, чтобы сделать свое дело
— stringy05

2
[бежит gqq] аааааа, это красиво
— underscore_d

85

Сначала установите vim так, чтобы он понимал, что вы хотите 80 символов:

:set tw=80

затем выделите строку:

V

и заставить vim переформатировать его:

gq

17

Это на самом деле не связано с VIM, но вы можете использовать программу fmt, как в

$ fmt myfile

38
:%! fmt% "Можно связать это с vim :)
— Максим Слойко

2
Полезно для vi, хотя я бы предпочел gqq на vim.
— WhyNotHugo

13

Для сплошных линий текста выделите область с помощью v в обычном режиме, затем нажмите

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

Это добавит новую строку в конце каждого 80-го символа.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

Это единственное решение, которое работало для длинной строки base64.
— Jviotti

6

Если вы используете * nix, возможно, у вас есть в foldналичии.

Выберите область, которую вы хотите использовать v, затем вы можете разбить на пробелы шириной 80, используя:

!fold --spaces --width=80

Это по сути то же самое, что и использование gq.

Однако, если вы просто хотите разбить символ 80 и не ограничиваться пробелами, вы можете использовать:

!fold --width=80

Если вы хотите одним нажатием клавиши просто установить сопоставление - я использовал

vmap <f1> !fold --width=80<CR>


Это ответ, который работает для длинных строк, не разделенных пробелами. Однако в macOS вам может понадобиться использовать gfold вместо fold.
— Аарон Д

на Mac OS я должен был сделать! fold -w 80
— user674669

5

Чтобы разбить длинные строки в полном документе без удаления уже существующих разрывов строк, используйте:

:set formatoptions+=w
:set tw=80
gggqG

4

Мне нужно было переформатировать весь файл, а не одну строку. Как указывает Wernsey, я мог бы использовать 'fmt', но следующая последовательность действий в vim также добилась цели (заимствуя из различных ответов здесь):

<ESC>
:setl tw=80 fo=t
1GVGgq

3

Как быстро и противно, возможно, попробуйте следующую карту:

map q 080lwbels<CR><ESC>

который говорит:

  • начать 0-ю позицию строки,
  • перейти к 80-му символу вправо,
  • перейти к началу следующего слова,
  • вернуться к предыдущему слову,
  • перейти к концу текущего слова,
  • идите на один символ вправо и
  • заменить CR для этого символа.

Тогда нажатие на q и CR разбьет строку на куски на границе слова.


-1

Я вручную вставил '\' (а затем CR / tab для форматирования) в каждый LONGLINE после последнего пробела, но перед столбцом 80. То есть:

1 this is a long, long, line

теперь выглядит

1 this is a long, \
        long line

и компилируется нормально.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.