Перенесення слів у Vim (збереження відступу)


92

Я просто дивився на цю публікацію яка описує, як обернути цілі слова у 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               |
|                                       |
|---------------------------------------|

Будь-які ідеї?


34
+1 за зусилля, спрямовані на те, щоб зробити питання максимально зрозумілим.
Джеффрі Хосе

Чи хочете ви, щоб текст м'яко обертався по краю вікна, або жорсткий, коли рядок досягає певної довжини? Я думаю, ви хочете важко обгортати (де новий текст вставляється у ваш текст після слова "will"), але це важко визначити на ваших прикладах.
Білл Одом

@Bill, я в основному зацікавлений у м'якій упаковці, але рішення з жорсткої упаковки також буде прийнятним.
sixtyfootersdude

1
Потрібна функціональність наразі не вбудована у Vim. Однак є патч, який наближається: groups.google.com/group/vim_dev/web/vim-patches (це № 15, "Правильно відступити загорнуті рядки").
Білл Одом

Пов’язане: VimCasts мав хороший епізод про використання зовнішніх службових програм unix для вирішення цієї проблеми: vimcasts.org/e/18
Damien Wilson

Відповіді:


18

Breakindent патч має те , що ви шукаєте. Я успішно застосував його, використовуючи інструкції, наведені в цій темі:

Виправіть Vim із розривним патчем на OS X за допомогою Homebrew

Зокрема, формула Homebrew ехрістоферсона.

Я знаю, що ця тема стара, але вона популярна в Google, і я неодноразово стикався з нею при спробі знайти рішення.

EDIT: Цей патч тепер включений до vim як патч 7.4.338. Див .: https://retracile.net/blog/2014/07/18/18.00

На Йосеміті (Mac OS X) я використовував команду snowbound з hombrew:

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

патч, здається, не працює з останньою версією macvim на доморощеній мові? @ Exit42 як ти змусив його працювати?
засніжений

нвм. Я склав macvim з доморощеним кровоточивим краємbrew install macvim --with-features=huge --override-system-vim --HEAD
засніжений

1
Дивіться мою відповідь нижче: stackoverflow.com/questions/2828174/… Немає потреби у виправленні в нових версіях vim.
ДжошуаД

26

Це не спрацювало, коли спочатку було задано питання, але станом на 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, ви не отримуєте повідомлення про помилку.


Цікаво, що це працює на 7.4 vim мого cygwin, але не на 7.4 vim мого unbuntu. Я припускаю, що це має набути дещо більш широкого поширення, але незабаром відбудеться загальне усиновлення.
ДжошуаД

1
Працює у Vim 7.4 @ ArchLinux.
Енді Михайленко,

1
Ви можете використовувати цей тест замість цього:if has("patch-7.4.354")
Лоуренс Кестелут

Це не відповідає на запитання щодо зауваження ОП: однакова кількість вкладок (...) плюс одна . Це, до речі, дуже важливо, на мій погляд, ви також можете часто захотіти зберегти додаткові відступи та оптично зсунути загорнуті сегменти вправо (щільно розташовані списки, примітки тощо);
криваві

8

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


@AlexanderBird За словами :help 'showbreak', ні, ви не можете - showbreakце лише рядок.
Rory O'Kane

4

Я погоджуюсь з відповіддю, яка говорить, що "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 увімкнено Unicode), кожен з яких можна ввести в рядок showbreak, використовуючи послідовність клавіш ctrl-v, 160. Таким чином ви можете ввести рядок шоу-брейку, який порожній зліва і здається справжнім відступом. Наприклад, ": встановити 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 пробілів зробив би це досить добре.


7
Ви можете помістити прогалини в showbreak витікання їх: :set showbreak=\ \ \ \ . Однак для вкладки все одно не працює.
Білл Одом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.