Розумна упаковка у 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
Use :set autoindentand:set smartindent
Shammel Lee

Відповіді:


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 пробіли.
фріцо

Цій відповіді допомогло б додавання додаткових прикладів для breakindentopt. Синтаксис не очевидний з довідкового документа. Дякую @fritzo за приклад у вашому коментарі.
Mnebuerquo

33

Для цього є патч, але він тривав роками, і минулого разу, коли я перевірив, не застосовувався належним чином. Дивіться запис "Правильно відступити загорнуті рядки" на http://groups.google.com/group/vim_dev/web/vim-patches - я дуже хочу, щоб це потрапило в основну лінію.

Оновлення: це посилання, здається, закріплено. Ось більш оновлена ​​версія виправлення .

Оновлення 2: його об’єднали вгору за течією (станом на 7.4.345), тому тепер вам потрібно лише :set breakindent.


Мені б цього дуже хотілося, я зроблю HTML-розмітку набагато
читальнішою

Я не бачу жодного патча на цьому сайті. Хтось ще може підтвердити?
пук

Очевидно, сайт нещодавно був відновлений, і ці посилання порушені. На тому самому сайті є нещодавня публікація в блозі з ще новішою версією.
ergosys

1
Цього насправді не вистачає. Я не розумію, чому це не в основній лінії, особливо. оскільки патч дуже добре написаний.
cseelus

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 використовує інший колір для '>>>'.


5
Ви також можете використовувати :set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ (комбінація пробілу з косою рискою робить простір символів розриву. Таким чином, ви можете додати достатньо пробілів, щоб бути глибшим, ніж більшість вашого загорнутого коду (наприклад, 10 пробілів було б глибше 2 чотирьох пробілів, а 14 було б глибше, ніж 3 чотири космічні вкладки); приємною особливістю простору є те, що він менш візуально відволікає увагу (якщо це те, що ви хочете).
Jeromy Anglim

7
@Jeromy Anglim Незначне виправлення: set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ набагато менш читабельне тодіlet &showbreak=repeat(' ', 14)
ZyX

8

ОНОВЛЕННЯ: У червні 2014 року виправлення для підтримки breakindentопції було об’єднано у Vim (версія 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'

3
:set smartindent
:set autoindent

Я думаю, ви все одно повинні використовувати повернення, хоча


2

Якщо ваш HTML достатньо добре сформований, може допомогти його запуск через xmllint :

:%!xmllint --html --format

2

Макрорішення:


Редагувати:

Експлуатувати gq{motion}автоматичні формати з будь-якою змінною "textwidth". Це простіше / краще, ніж використання 80lBi^MI для мого макросу.


Якщо у вас увімкнено автовідступ

: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 (: встановити lazyredraw), щоб пришвидшити це

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.