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


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

:set formatoptions=l
:set lbr

который принимает этот текст (вкладки отображаются как t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|ttthis is a like of text that will wr|ap here                            
|ttcan you see the wrap               |
|                                       |
|---------------------------------------|

Это выполняет такое поведение (вкладки отображаются как t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|ttthis is a like of text that will   |
|wrap here                              |
|ttcan you see the wrap               |
|                                       |
|---------------------------------------|

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

 *Inside of window                        *Outside of window
|---------------------------------------|    
|ttthis is a like of text that will   |
|tttwrap here                        |
|ttcan you see the wrap               |
|                                       |
|---------------------------------------|

какие идеи?

4 84

4 ответа:

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

патч Vim с патчем breakindent на OS X с Homebrew

в частности, формула доморощенного эхристоферсона.

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

EDIT: этот патч теперь входит в комплект 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 

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

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

Я согласен с ответом, который говорит, что "showbreak" является лучшим вариантом. 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 "отступом" довольно большим (т. е. больше, чем любой отступ, обычно встречающийся в вашем коде), но все же достаточно маленьким, чтобы обеспечить достаточное пространство для разборчивой обертки текста. Для многих применений я думаю, что отступ showbreak 40 или 50 пробелов сделает это довольно хорошо.