2010-05-13 2 views
82

Я просто смотрел this post, в котором описывается, как обернуть целые слова в vim. Принятое решение было это:Word Wrap in Vim (сохранение отступа)

:set formatoptions=l 
:set lbr 

Который берет этот текст (вкладки отображаются в виде \ т):

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

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

*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    | 
|          | 
|---------------------------------------| 

Любые идеи?

+27

+1 для усилий, направленных на то, чтобы задать вопрос как можно яснее. –

+0

Вы хотите, чтобы текст был мягким обертыванием на краю окна или жесткой оберткой, когда линия достигла определенной длины? Я думаю, что вам нужна жесткая упаковка (где в текст добавляется новая строка после слова «будет»), но на ваших примерах трудно сказать. –

+0

@Bill, меня больше всего интересует softwrapping, но решение для жесткой обложки также будет приемлемым. – sixtyfootersdude

ответ

16

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

Patch Vim with the breakindent patch on OS X with Homebrew

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

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

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

На Йосемити (Mac OS X), я использовал команду Заснеженный с hombrew:

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

Патч, похоже, не работает с последним macvim на homebrew? @ Exit42, как вы его заработали? – snowbound

+0

nvm. Я скомпилировал macvim с дождевой краской «brew install macvim --with-features = огромный --override-system-vim --HEAD» – snowbound

+1

См. Мой ответ ниже: http://stackoverflow.com/questions/2828174/word-wrap -in-vim-saveing-indentation/26578161 # 26578161 Нет необходимости в патче в новых версиях vim. – JoshuaD

7

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

+0

Можете ли вы установить функцию showbreak как функцию? –

+0

@AlexanderBird Согласно [': help 'showbreak''] (http://vimdoc.sourceforge.net/htmldoc/options.html#%27showbreak%27), нет, вы не можете -' 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 включен юникод), каждый из которых может быть занесена в строку 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 пространств будет делать это довольно хорошо.

+7

Вы можете помещать пробелы в showbreak, экранируя их: ': set showbreak = \ \ \ \'. Однако все же не работает для вкладок. –

19

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

добавить на .vimrc:

set breakindent 

И это все!

-

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

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

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

+0

Интересно, что это работает на 7,4 vim моего cygwin, но не в 7,4 vim моего unbuntu. Я предполагаю, что он должен получить немного более широкое распространение, но скоро увидит всеобщее усыновление. – JoshuaD

+1

Работает в Vim 7.4 @ ArchLinux. –

+1

Вместо этого вы можете использовать этот тест: 'if has (" patch-7.4.354 ")' –