Умная упаковка в Vim

80

Мне было интересно, есть ли у 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>
Саша
источник
См. Также stackoverflow.com/q/759577/240633
ergosys
Вам следует пересмотреть ответы, поскольку что-то изменилось.
1
Используйте :set autoindentи:set smartindent
Шаммел Ли

Ответы:

62

Эта функция была реализована 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символы всегда сохраняются.

Доминикас Мостаускис
источник
2
Короче говоря, добавление set breakindentв вашу конфигурацию vim приведет к разрыву строки и переносу по отступу - вместо того, чтобы разрыв и начало следующей строки, как если бы это была новая строка.
james2doyle
3
А добавление set breakindentopt=shift:4к вашей конфигурации vim приведет к появлению дополнительных 4 пробелов.
fritzo
В этом ответе поможет добавление дополнительных примеров для breakindentopt. Синтаксис не очевиден из справочной документации. Спасибо @fritzo за пример в вашем комментарии.
Mnebuerquo
33

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

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

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

эргосис
источник
Мне бы очень этого хотелось, я сделаю HTML-разметку более читаемой
Хосе Элера
Я не вижу патча на этом сайте. Кто-нибудь еще может подтвердить?
puk
Очевидно, сайт был недавно перестроен, и эти ссылки не работают. На том же сайте есть недавняя запись в блоге с еще более новым патчем.
ergosys
1
Этого действительно не хватает. Я не понимаю, почему этого нет в основной линии, особенно. так как патч очень хорошо написан.
cseelus 01
2
Спасибо @Vitor Eiji за обновление. Это отличные новости.
ergosys
17

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

:set showbreak=>>>

Пример:

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

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

слишком много php
источник
5
вы также можете использовать :set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ (комбинация пробелов с обратной косой чертой делает пробел символа разрыва. Таким образом, вы можете добавить достаточно пробелов, чтобы они были глубже, чем большая часть вашего обернутого кода (например, 10 пробелов будут глубже, чем 2, четыре пробела табуляции, а 14 будут глубже, чем 3 четыре пробела); приятной особенностью пространства является то, что оно меньше отвлекает визуально (если вы этого хотите).
Джероми Энглим 01
7
@Jeromy Anglim Небольшое исправление: тогда set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ он гораздо менее читабеленlet &showbreak=repeat(' ', 14)
ZyX
8

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


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

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

Грег Хьюгилл
источник
5

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

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

Cfreak
источник
2

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

:%!xmllint --html --format
Аркадий
источник
2

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


Редактировать:

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


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

:set autoindent

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

установите регистр 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), чтобы ускорить это

Майкл Аснес
источник