Умный обертывание в Vim


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

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

<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 69

8 ответов:

эта функция была реализовано 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.

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

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

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

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

:set showbreak=>>>

пример:

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

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

обновление: в июне 2014 года, a патч для поддержки breakindent опции был объединен в Vim (версия 7.4.346 или более поздняя для лучшей поддержки).


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

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

единственный способ, которым я знаю, что вы могли бы сделать это, - использовать символ возврата (Как упоминалось 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'
:set smartindent
:set autoindent

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

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

:%!xmllint --html --format

Решение Макроса:


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 (макро x):

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)

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

  • этот макрос сломается, если есть слово, которое составляет 80 символов или больше.

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

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