Word Wrap в 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               |
|                                       |
|---------------------------------------|

Любые идеи?

Ответ 1

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

Патч Vim с исправлением на OS X с Homebrew

В частности, формула Echristopherson Homebrew.

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

EDIT: этот патч теперь включен в vim как патч 7.4.338. См.: https://retracile.net/blog/2014/07/18/18.00

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

brew install macvim --with-features=huge --override-system-vim --HEAD 

Ответ 2

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

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

set breakindent

И что это!

-

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

if has("patch-7.4.354")
    set breakindent
endif

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

Ответ 3

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

Ответ 4

Я согласен с ответом, в котором говорится, что "showbreak" - лучший вариант. Showbreak обычно не позволяет помещать в строку show nonprinting символы (например, пробелы или вкладки), так как обычно используется, он просто даст вам индикатор вдоль левого поля, т.е. Никакого реального отступа. Это не здорово, так как основная цель OP, я думаю, состоит в том, чтобы дать завернутые строки отступом, чтобы они не загромождали область левого поля и выглядели как собственные линии.

Таким образом, один способ добавить (уродливый) отступ с помощью showbreak - это просто использовать много символов,.eg, ": 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               |
|                                       |
|---------------------------------------|

У вас по-прежнему нет возможности изменять уровень отступа в соответствии с отступом предыдущей строки, но по крайней мере вы получаете чистый отступ обернутых строк без большого количества видимых помех вдоль левого края окна. Все еще может быть путаница, если отступ обернутой строки меньше, чем от начала фактической строки, но этого, возможно, можно избежать, сделав прорыв "indent" довольно большим (т.е. Больше любого отступа, обычно найденного в вашем коде), но все же достаточно мала, чтобы обеспечить достаточно места для разборчивой упаковки текста. Для многих применений я думаю, что отступ прозрения 40 или 50 пространств будет делать это довольно хорошо.