Умный обертывание в 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 ответов:
эта функция была реализовано 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'
Если ваш 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), чтобы ускорить это