Разверните текст в VIM

Приведенный ниже вопрос актуален, когда кто-то хочет скопировать текст из Vim во что-то другое, например, в веб-браузер.

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

Ответы на вопрос(3)

Решение Вопроса

v i p J

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

:%norm vipJ

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

 19 июн. 2012 г., 21:03
@ Дерек, ты прав. Я знаю теги движения, такие как at, iB и т. Д. (Комбинируя движения с i и a). Но я хотел дать четкий ответ, не отвлекаясь.
 Ray14 июн. 2012 г., 21:34
Спасибо! Я полагаю, это самый простой метод из доступных? Я полагаю, ничего такого, что делает это для всего документа за один раз?
 15 июн. 2012 г., 08:00
@Ray Я отредактировал свой ответ и добавил команду для выполнения для всего документа.
 19 июн. 2012 г., 20:48
Что бы это ни стоило, вам не нужно переходить к началу абзаца. Точка «ip» в этой команде он будет захватывать весь абзац, в котором вы находитесь, независимо от того, находитесь ли вы в начале.
 16 июн. 2012 г., 09:06
Лучше использовать:normal команда с!-спецификатор в этом случае, чтобы избежать конфликтов с пользовательскими сопоставлениями.

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

# Title 1

## Title 2

Станет:

# Title 1 ## Title 2

С ответом ib проблема заключается в списках:

- item1
- item2

становится:

- item1 - item2

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

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

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

жима уже другой ответ, давайте рассмотрим решение той же проблемы с помощью линейно-ориентированные команды Ex.

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

:,-/\n$/j

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

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

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

 25 июн. 2013 г., 05:42
@ Омар: Отличный улов, спасибо! Ответ был обновлен в связи с этим делом.
 20 июн. 2013 г., 22:47
В этой команде есть небольшая ошибка: если у вас есть однострочный абзац, он приклеивается к началу следующего абзаца.
 20 мая 2016 г., 21:54
Я делал это, как в ответе @ fatih, но по какой-то причине он объединяет очень короткие абзацы, поэтому я пришел сюда в поисках альтернатив, и это прекрасно работает, спасибо!

Ваш ответ на вопрос