Перенос слов в Vim (с сохранением отступов)

92

Я как раз смотрел этот пост, в котором описывается, как обернуть целые слова в vim. Принятое решение было таким:

:set formatoptions=l
:set lbr

Что принимает этот текст (вкладки показаны как \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Это выполняет подобное поведение (вкладки показаны как \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Однако я бы хотел переопределить эту функцию. Я бы хотел, чтобы перед строкой в ​​оболочке было такое же количество вкладок, что и в строке выше плюс один. Т.е.:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Любые идеи?

шестьдесят футов
источник
34
+1 за усилия, направленные на то, чтобы сделать вопрос максимально ясным.
Джеффри Хосе,
Вы хотите, чтобы текст был мягким обтеканием по краю окна или жестким, когда строка достигает определенной длины? Я думаю, вам нужна жесткая упаковка (когда в текст вставляется новая строка после слова «будет»), но это сложно сказать по вашим примерам.
Билл Одом,
@Bill, меня больше всего интересует softwrapping, но и Hardwrapping тоже подойдет.
sixtyfootersdude
1
В Vim пока нет нужной вам функциональности. Однако есть патч, который подходит близко: groups.google.com/group/vim_dev/web/vim-patches (это № 15, «Правильный отступ обернутых строк»).
Билл Одом,
Связанный: У VimCasts был хороший эпизод об использовании внешних утилит unix для решения этой проблемы: vimcasts.org/e/18
Дэмиен Уилсон

Ответы:

18

У пластыря есть то, что вы ищете. Я успешно применил его, используя инструкции, найденные в этой теме:

Исправьте Vim с помощью патча breakindent для OS X с помощью Homebrew

В частности, формула домашнего пивоварения Эхристоферсона.

Я знаю, что эта ветка устарела, но она популярна в Google, и я встречал ее несколько раз, пытаясь найти решение.

РЕДАКТИРОВАТЬ: этот патч теперь включен в vim как патч 7.4.338. См .: https://retracile.net/blog/2014/07/18/18.00

В Yosemite (Mac OS X) я использовал команду snowbound с hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 
Выход42
источник
патч не работает с последней версией macvim на homebrew? @ Exit42, как ты заставил его работать?
Заснеженный
nvm. Я скомпилировал macvim на переднем крае домашнего пивоваренияbrew install macvim --with-features=huge --override-system-vim --HEAD
заснеженный
1
См. Мой ответ ниже: stackoverflow.com/questions/2828174/… В более новых версиях vim нет необходимости в патче.
JoshuaD
26

Это не сработало, когда вопрос был задан изначально, но с 25 июня 2014 года это будет работать. (Предполагая, что вы обновляете свой vim до версии более новой, чем эта дата)

Добавьте в свой .vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

Вот и все!

-

Некоторые люди (включая меня) используют один файл .vimrc на нескольких компьютерах. В этом случае важно, чтобы эта строка была надежной (чтобы избежать раздражающих сообщений об ошибках). Это немного лучше:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Таким образом, если вы используете более раннюю версию vim, вы не получите сообщение об ошибке.

ДжошуаД
источник
Интересно, что это работает на моем cygwin 7.4 vim, но не на моем unbuntu 7.4 vim. Я предполагаю, что он должен получить более широкое распространение, но скоро получит всеобщее распространение.
JoshuaD
1
Работает в Vim 7.4 @ ArchLinux.
Энди Михайленко
1
Вместо этого вы можете использовать этот тест:if has("patch-7.4.354")
Лоуренс Кестелут
Это не отвечает на вопрос о замечании OP: такое же количество вкладок (...) плюс один . Это, кстати, тоже очень важно, на мой взгляд, вы часто можете захотеть сохранить дополнительный отступ и оптически сдвинуть обернутые сегменты вправо (плотно расположенные списки, заметки и т. Д.);
кровавый
8

Лучшее, что вы получите, - это showbreakвариант, который будет помещать фиксированную строку перед каждой обернутой строкой (я использую set showbreak=...).

слишком много php
источник
@AlexanderBird По словам :help 'showbreak', нет, нельзя - showbreakэто всего лишь строка.
Рори О'Кейн,
4

Я согласен с ответом, который гласит, что «разоблачение» - лучший вариант. Showbreak обычно не позволяет вам помещать непечатаемые символы (например, пробелы или табуляции) в строку showbreak, поэтому при обычном использовании он просто даст вам индикатор вдоль левого поля, т. Е. Без реального отступа. Это не очень хорошо, поскольку основная цель OP, я думаю, состоит в том, чтобы дать обернутым строкам отступ, чтобы они не загромождали область левого поля и не выглядели как собственные линии.

Итак, один из способов добавить (некрасивый) отступ с помощью showbreak - просто использовать много символов, например, ": set showbreak => --------------->". В результате получается что-то вроде этого:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Лучшей альтернативой может быть использование неразрывных пробелов (при условии, что ваш экземпляр Vim поддерживает Unicode), каждый из которых можно ввести в строку showbreak, используя последовательность клавиш ctrl-v, 160. Таким образом, вы можете ввести пустую строку showbreak с левой стороны, которая будет выглядеть как настоящий отступ. Например, ": set showbreak =......... >>" где каждый '.' в команде на самом деле является неразрывный пробел, вводимый нажатием ctrl-V, 160. Таким образом, вы получите обертку с красивым отступом, например:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

У вас по-прежнему нет возможности изменять уровень отступа в соответствии с отступом предыдущей строки, но, по крайней мере, вы получаете чистый отступ обернутых строк без большого визуального беспорядка вдоль левого края окна. По-прежнему может возникнуть путаница, если отступ обернутой строки меньше, чем отступ начала фактической строки, но этого, возможно, можно было бы избежать, сделав «отступ» showbreak достаточно большим (то есть больше, чем любой отступ, обычно встречающийся в вашем коде. ), но все же достаточно мал, чтобы обеспечить достаточно места для разборчивого переноса текста. Я думаю, что для многих случаев использования отступы в 40 или 50 пробелов вполне подойдут.

Герберт Зитц
источник
7
Вы можете поместить пробелы в showbreak вытекания их: :set showbreak=\ \ \ \ . Однако для вкладок все еще не работает.
Билл Одом,