2012-06-14 6 views
23

Вопрос ниже применим, когда вы хотите скопировать текст из Vim в другое, скажем, веб-браузер.Unwrap text in vim

У меня обычно есть опция tw=80, когда я редактирую файлы, особенно файлы LaTeX. Однако, скажем, я хочу написать письмо в Vim с параметром tw=80, а затем я хочу скопировать его и вставить в веб-браузер. Прежде чем копировать и вставлять, я хочу развернуть текст так, чтобы не было разрыва строки каждые 80 символов или около того. Я пробовал tw=0, а затем gq, но это просто обертывает текст шириной по умолчанию 80 символов. Мой вопрос в том, как я разворачиваю текст, чтобы каждый абзац моего письма отображался как одна строка? Есть ли для этого легкая команда?

ответ

39

Перейти к началу вами пункта и введите:

v я р J

Для всего документа объединить его с нормой:

:%norm vipJ 

Эта команда только разворачивает абзацы. Я предполагаю, что это то поведение, которое вы хотите.

+0

Спасибо! Полагаю, это самый простой способ? Ничего, что делает это для всего документа за один раз, я предполагаю? – Ray

+2

@Ray Я отредактировал свой ответ и добавлю команду для выполнения для всего документа. –

+1

В этом случае лучше использовать команду ': normal' с'! '-specifier, чтобы избежать столкновений с пользовательскими сопоставлениями. –

10

Поскольку соединение строк абзаца с использованием команд Нормального режима уже покрыто , ответ на другой вопрос давайте рассмотрим ту же проблему с помощью линейных команд Ex.

Предположим, что курсор расположен в первой строке абзаца. Затем до распакуйте его, можно просто присоединить следующие строки до последней строки этого абзаца. Удобный способ сделать это - запустить команду :join , разработанную именно для этой цели. Для определения диапазона строк для команды , кроме очевидной стартовой строки, которая является текущей, необходимо указать , чтобы указать конечную линию. Его можно найти, используя шаблон , соответствующий самому концу абзаца, то есть символ новой строки, за которым следует пустая строка. Таким образом, перевод указанного определения синтаксиса Ex-команды, мы получим:

:,-/\n$/j 

Для всех пунктов, которые будут развернуты, запустите эту команду на первой строке каждый пункт. Полезным инструментом для перехода через них, повторяющим заданную последовательность действий , является команда :global. Поскольку :global сканирует линии от сверху вниз, первая строка абзаца - это только первая непустая строка среди оставшихся необработанных. Это наблюдение дает нам команду

:g/./,-/\n$/j 

, которая более эффективна, чем ее простые обычные модели с обычным режимом.

+0

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

+1

@ Омар: Отличная добыча, спасибо! Ответ был обновлен, чтобы рассмотреть этот случай. –

+0

Я делал это так, как в ответе @ fatih, но по какой-то причине он объединяет очень короткие абзацы вместе, поэтому я пришел сюда искать альтернативы, и это отлично работает, спасибо! – dbmrq

4

Проблема с :%norm vipJ заключается в том, что если у вас есть последовательные строки длиной менее 80 символов, они также присоединятся к ним, даже если они разделены пустой строкой.Например следующий пример:

# Title 1 

## Title 2 

Станет:

# Title 1 ## Title 2 

С ответом И.Б., проблема есть со списками:

- item1 
- item2 

становится:

- item1 - item2 

Спасибо до this forum post Я обнаружил еще один способ достижения этой цели, которую я завернутый в функции, которая работает намного лучше для меня, так как он не делает ничего из этого:

function! SoftWrap() 
    let s:old_fo = &formatoptions 
    let s:old_tw = &textwidth 
    set fo= 
    set tw=999999 " works for paragraphs up to 12k lines 
    normal gggqG 
    let &fo = s:old_fo 
    let &tw = s:old_tw 
endfunction 

Edit: Обновленный метод, потому что я понял, что это не работает на установка Linux. Удалите строки, содержащие fo, если эта новая версия не работает с MacVim (у меня нет возможности протестировать).