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

Я просто смотрел этот пост, в котором описывается, как обернуть целые слова в 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               |
|                                       |
|---------------------------------------|

Любые идеи?


person sixtyfootersdude    schedule 13.05.2010    source источник
comment
+1 за попытку сделать вопрос максимально ясным.   -  person Jeffrey Jose    schedule 13.05.2010
comment
Вы хотите, чтобы текст был мягким обтеканием по краю окна или жестким обтеканием, когда строка достигает определенной длины? Я думаю, вам нужна жесткая упаковка (где новая строка вставляется в ваш текст после слова will), но это трудно сказать по вашим примерам.   -  person Bill Odom    schedule 14.05.2010
comment
@Bill, меня больше всего интересует softwrapping, но решение для hardwrapping тоже было бы приемлемо.   -  person sixtyfootersdude    schedule 14.05.2010
comment
В настоящее время в Vim не встроены нужные вам функции. Однако есть патч, который подходит близко: groups.google.com/group/vim_dev / web / vim-patches (это №15, Правильный отступ переносимых строк).   -  person Bill Odom    schedule 14.05.2010
comment
По теме: у VimCasts был хороший эпизод об использовании внешних утилит unix для решения этой проблемы: vimcasts.org/e/18 < / а>   -  person Damien Wilson    schedule 15.05.2010
comment
@BillOdom ваша ссылка не работает   -  person puk    schedule 23.02.2012
comment
@DamienWilson Я могу ошибаться, но я думаю, что OP спрашивает о переносе слов, а не о форматировании слов. Если я использую par, например, свой php-код, он разбивает мои длинные функции на две части.   -  person puk    schedule 23.02.2012
comment
возможный дубликат Smart Wrap в Vim   -  person naught101    schedule 22.07.2014
comment
Я думаю, что это дубликат stackoverflow.com/questions / 1204149 / smart-wrap-in-vim? Rq = 1   -  person naught101    schedule 22.07.2014


Ответы (4)


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

Исправьте 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 
person Exit42    schedule 20.02.2013

Это не сработало, когда вопрос был задан изначально, но с 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, вы не получите сообщение об ошибке.

person JoshuaD    schedule 26.10.2014
comment
Интересно, что это работает на моем cygwin 7.4 vim, но не на моем unbuntu 7.4 vim. Я предполагаю, что он должен получить более широкое распространение, но вскоре получит всеобщее распространение. - person JoshuaD; 27.10.2014
comment
Работает в Vim 7.4 @ ArchLinux. - person Andy Mikhaylenko; 29.10.2014
comment
Вместо этого вы можете использовать этот тест: if has("patch-7.4.354") - person Lawrence Kesteloot; 22.01.2016
comment
Это не отвечает на вопрос относительно замечания OP: такое же количество вкладок (...) плюс один. Это, кстати, тоже очень важно, на мой взгляд, вы часто можете захотеть сохранить дополнительные отступы и оптически сдвинуть обернутые сегменты вправо (плотно расположенные списки, заметки и т. Д.); - person bloody; 25.03.2020

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

person too much php    schedule 13.05.2010
comment
@AlexanderBird Согласно :help 'showbreak', нет, вы не можете - showbreak - это всего лишь строка. - person Rory O'Kane; 06.08.2013

Я согласен с ответом, который гласит, что «разоблачение» - лучший вариант. 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 пробелов.

person Herbert Sitz    schedule 14.05.2010
comment
Вы можете помещать пробелы в showbreak, экранируя их: :set showbreak=\ \ \ \ . Однако для вкладок все еще не работает. - person Bill Odom; 14.05.2010