Перенос слов в Vim (с сохранением отступа) - PullRequest
86 голосов
/ 13 мая 2010

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

Есть идеи?

Ответы [ 4 ]

23 голосов
/ 27 октября 2014

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

18 голосов
/ 20 февраля 2013

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

Патч Vim с разрывным патчем на 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 
8 голосов
/ 14 мая 2010

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

4 голосов
/ 14 мая 2010

Я согласен с ответом, в котором говорится, что «showbreak» - лучший вариант. Showbreak, как правило, не позволяет вам помещать непечатаемые символы (например, пробелы или символы табуляции) в строку showbreak, так что при обычном использовании он просто даст вам индикатор вдоль левого поля, то есть никакого реального отступа. Это не очень хорошо, так как главная цель 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               |
|                                       |
|---------------------------------------|

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...