Изменить ширину переноса в текстовом файле с помощью Vim - PullRequest
3 голосов
/ 23 августа 2009

Я хочу отформатировать текстовые файлы srt subtitle, чтобы избежать проблем с переносом на моем медиаплеере.

Мне нужно установить ширину переноса строки на количество символов, например. 43

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

Я нашел следующее решение в сети ..

: установить tw = 43
gggqG

Это работает, но не совсем так, как я хочу.

* 1014 Е.Г. *

У меня есть этот текст:

557
00: 47: 39,487 -> 00: 47: 42,453
Мне придется выполнить некоторые процедуры,
и я попросил вас проверить, что они для меня

после форматирования я получаю:

557 00: 47: 39,487 -> 00: 47: 42,453 Я буду
придется выполнить некоторые процедуры, и я
попросил вас проверить, что они за
мне

Кажется, игнорируются разрывы строк / CR. Как видите, в первой строке добавлено «Я буду».

Как мне заставить его не игнорировать переносы строк?

РЕДАКТИРОВАТЬ: apoligies о форматировании, впервые с помощью stackoverflow!

Ответы [ 5 ]

6 голосов
/ 23 августа 2009

Вы можете использовать опцию пробела formatoptions и сделать так, чтобы строки, которые вы хотите обернуть, заканчивались пробелом.

:set tw=43
:set fo+=w
:g/^\a/s/$/ /
gggqG

Третья строка добавляет пробел в конце любой строки, начинающейся с буквы, и fo+=w останавливает gq от объединения строк, которые не заканчиваются пробелами.

См:

:help fo-table
:help 'formatoptions'
:help gq
:help :g

Редактировать в ответ на комментарии

:g/^\a/s/$/ /

Это означает:

:g/   " Search the file
^\a   " For lines starting (^) with an alphabetic character (\a - equivalent to [A-Za-z])
/     " Then on each line that the regexp matches (i.e. each line starting with an alphabetic character)
s/    " Substitute...
$     " The end of line (zero-width match at the end of the line)
/ /   " With a space (slashes are delimiters)

Команда global (:g) будет работать только с текущим файлом, но строки textwidth и formatoptions будут длиться весь сеанс. Если вы хотите, чтобы эти параметры использовались только в текущем буфере, используйте :setlocal вместо:

:setlocal tw=43
:setlocal fo+=w
:help :setlocal
2 голосов
/ 23 августа 2009

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

:g/^[a-zA-Z]/normal gqq

Это будет запускать команду p00ya для каждой текстовой строки в файле.

1 голос
/ 23 августа 2009

Хотя это и не совсем надежно (или элегантно), если вы можете предположить, что строки субтитров не начинаются с цифр, вы можете настроить Vim для обработки их как комментариев.

:set comments=:0,:1,:2,:3,:4,:5,:6,:7,:8,:9
gggqG

Строки, начинающиеся с 0-9, будут рассматриваться как комментарии и не будут объединяться с текстом.

1 голос
/ 23 августа 2009

Со следующим текстом (т.е. только 3 строки):

557
00:47:39,487 --> 00:47:42,453
I will have to complete some procedures, and I asked you to check out what they are for me

Используйте gqq (формат текущей строки) в 3-й строке после установки tw. Форматирование по абзацу не будет работать, поскольку vim будет рассматривать все 3 строки как часть одного и того же абзаца (абзацы заканчиваются только пустой строкой).

0 голосов
/ 23 августа 2009

Я не могу точно понять, в чем проблема из-за форматирования вашего поста, но вы можете захотеть проверить настройку 'formatoptions' в справке vim, а именно: он fo-table, который содержит кучу флагов настройки.

Эта ссылка может быть полезна.

...