В 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.