Smart Wrap в Vim - PullRequest
       13

Smart Wrap в Vim

73 голосов
/ 30 июля 2009

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

Например, а не

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

это будет выглядеть как

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>

Ответы [ 8 ]

49 голосов
/ 24 сентября 2014

Эта функция была реализована 25 июня 2014 года как исправление 7.4.338. За этим последовало несколько патчей, доработавших эту функцию, последняя из которых - 7.4.354, так что вам нужна именно эта версия.

:help breakindent
:help breakindentopt

Выдержки из справки vim ниже:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

Также имеет значение showbreak, это будет суффикс суммы смены с указанными вами символами.

Пример конфигурации

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

Замечание о поведении

Если вы не укажете опцию sbr, любые showbreak любые символы, добавленные к отступу. Удаление sbr из приведенного выше примера приводит к эффективному отступу в 4 символа; с этой настройкой, если вы просто хотите использовать showbreak без дополнительного отступа, укажите shift:0.

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

При указании значения min смещенная величина будет сдавлена, если ширина терминала меньше, но символы showbreak всегда сохраняются.

33 голосов
/ 07 февраля 2010

Для этого есть патч, но он существует в течение лет , и в прошлый раз, когда я проверял, он не применялся чисто. См. Запись «Правильно делать отступы для обернутых строк» ​​в http://groups.google.com/group/vim_dev/web/vim-patches - мне бы очень хотелось, чтобы это было в основной строке.

Обновление: похоже, что эта ссылка не соответствует действительности. Вот более свежая версия патча .

Обновление 2: оно было объединено в восходящем направлении (по состоянию на 7.4.345), поэтому теперь вам нужно только :set breakindent.

17 голосов
/ 30 июля 2009

Я не думаю, что возможно иметь точно такой же отступ, но вы все равно можете получить лучшее представление, установив опцию 'showbreak'.

:set showbreak=>>>

Пример:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

Реальная вещь выглядит лучше, чем пример кода выше, потому что Vim использует другой цвет для '>>>'.

8 голосов
/ 30 июля 2009

ОБНОВЛЕНИЕ: В июне 2014 года патч для поддержки опции breakindent был объединен с Vim (версия 7.4.346 или новее для лучшей поддержки).


Вы также можете попробовать :set nowrap, который позволит vim отображать длинные строки, прокручивая вправо. Это может быть полезно для изучения общей структуры документа, но может быть менее удобным для фактического редактирования.

Другие варианты, близкие к тому, что вы ищете: linebreak и showbreak. С помощью showbreak вы можете изменить то, что отображается на левом поле строк, которые обернуты, но, к сожалению, это не позволяет делать отступ в зависимости от текущего контекста.

5 голосов
/ 30 июля 2009

Единственный способ, которым я знаю, что вы могли бы сделать это, это использовать возвращаемый символ (как упомянуто Cfreak) и комбинировать опцию textwidth с различными параметрами отступа. Если ваш отступ настроен правильно (как я полагаю, по умолчанию с html-синтаксисом, но в противном случае смотрите опции autoindent и smartindent), вы можете:

:set formatoptions = tcqw
:set textwidth = 50
gggqG

Если у вас есть какие-либо настройки formatoptions, может быть лучше просто сделать:

:set fo += w
:set tw = 50
gggqG

Что это делает:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

Обратите внимание, что это не то же самое, что мягкая переноска: она будет переносить строки как в исходном файле, так и на экране (если вы, конечно, не сохраните его!). В formatoptions можно добавить другие параметры, которые будут автоматически форматироваться при вводе: подробности в :help fo-table.

Для получения дополнительной информации см .:

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'
3 голосов
/ 30 июля 2009
:set smartindent
:set autoindent

Я думаю, что вы все еще должны использовать возврат, хотя

2 голосов
/ 25 февраля 2014

Макро-решение:


Edit:

Оператор gq{motion} автоматически форматирует в любую переменную "textwidth". Это проще / лучше, чем использовать 80lBi^M, который у меня есть для моего макроса.


Если у вас включен автоиндент

:set autoindent

Тогда ввод возврата в конце строки будет делать отступ на следующую строку на ту же сумму. Вы можете использовать это для жесткого ввода в linewraps, если хотите. Следующий макрос использует это преимущество для автоматического отступа вашего текста:

установить регистр z на:

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

и установить регистр x в:

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

Тогда сделай

@x   

для активации макросов. Через несколько секунд текст будет отображаться с правильными отступами в 80 символов или менее.

Пояснение:

Вот разбор макросов:

Часть 1 (макрос z):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

Часть 2 (макрос х):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one WORD (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

Предостережения:

  • Этот макрос сломается, если есть WORD длиной не более 80 символов.

  • Этот макрос не будет делать умных вещей, таких как отступ строки после тегов.

  • Используйте настройку lazyredraw (: установите lazyredraw), чтобы ускорить это

2 голосов
/ 30 июля 2009

Если ваш HTML достаточно хорошо сформирован, его запуск через xmllint может помочь:

:%!xmllint --html --format
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...