Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore 2013_vi_vim_ru

2013_vi_vim_ru

Published by faustkeller, 2017-09-07 00:23:54

Description: 2013_vi_vim_ru

Search

Read the Text Version

Настройка полос прокрутки, меню и панелей инструментов 257 час­то ис­поль­зу­ют та­кие ок­на, но они пол­ ез­ны да­же для опыт­ных поль­ зо­ва­те­лей Vim. Осо­бен­но хор­ о­ша их спос­ обн­ ость взаим­ о­дей­ств­ о­вать с бу­фе­ром об­мен­ а Windows предс­ ка­зуем­ ым обр­ а­зом.Настройка полос прокрутки, менюи панелей инструментов В  gvim прис­ утс­ т­ву­ют обыч­ные вид­же­ты GUI, так­ ие как пол­ ос­ ы про­ крут­ки, мен­ ю и па­нел­ и ин­ст­ру­мент­ ов. Как и в боль­шинс­ т­ве сов­ рем­ ен­ ных гра­фи­че­ских прил­ ож­ е­ний, эти вид­же­ты мож­но на­страив­ ать. По умол­ча­нию ок­но gvim со­дер­жит нес­ кольк­ о ме­ню и  па­нель ин­стр­ у­ мент­ ов нав­ ер­ху (рис. 13.5). Рис. 13.5. Верхн­ яя часть окн­ а gvimПолосы прокрутки По­лос­ ы про­крутк­ и, поз­ вол­ яющ­ ие быс­ тр­ о пер­ ем­ е­щать­ся по файл­ у вверх и  вниз либ­ о вле­во и  впра­во, не явл­ я­ют­ся обяз­ ат­ ель­ны­ми. Их мож­но отоб­ ра­жать или скрыв­ ать с  пом­ ощ­ ью оп­ции guioptions, как опис­ ан­ о в конц­ е этой глав­ ы в разд­ е­ле «Оп­ции GUI и об­зор ком­ анд» на стр. 269. По­сколь­ку стан­дарт­ным дей­ств­ и­ем в Vim яв­ляе­ тс­ я по­каз все­го тек­ста в  файл­ е (с  пер­ е­но­сом строк в  ок­не при не­обх­ о­дим­ ос­ ти), сле­дуе­ т зам­ е­ тить, что в нас­ трое­ нн­ ом обычн­ ым обр­ аз­ ом се­анс­ е gvim гор­ и­зон­тальн­ ая пол­ о­са про­крут­ки со­вер­шенн­ о бес­пол­ езн­ а. Ле­вая и  прав­ ая пол­ ос­ ы про­крут­ки вклю­чаю­ т­ся/вы­клю­ча­ют­ся пут­ ем вклю­чен­ ия/вык­ лю­че­ния флаг­ ов r или l в оп­ции guioptions. l гар­ ан­тир­ у­ ет, что ле­вая пол­ о­са всег­ да вид­ им­ а, а r – что все­гда вид­на пра­вая пол­ ос­ а прок­ рут­ки. Проп­ ис­ные ва­риа­ нт­ ы L и R указ­ ы­ваю­ т ред­ акт­ о­ру пок­ аз­ ы­вать лев­ ую или пра­вую пол­ ос­ ы, тольк­ о ког­ да окн­ о раз­дел­ е­но верт­ и­каль­но. Го­ри­зон­таль­ная по­лос­ а про­крут­ки управл­ я­етс­ я вклю­че­ние­ м/иск­ лю­че­ ние­ м b из опц­ ии guioptions. Ну и, ко­нечн­ о, можн­ о прок­ руч­ ив­ ать прав­ ую и ле­вую пол­ о­сы од­но­вре­ мен­но! Точн­ ее, про­крутк­ а лю­бой из них прив­ од­ ит к то­му, что и дру­гая пе­ре­ме­щае­ тс­ я в  том же нап­ равл­ е­нии. Дер­жать пол­ о­сы прок­ рут­ки на обе­их стор­ он­ ах окн­ а очень удобн­ о. В зав­ и­си­мос­ ти от то­го, где нах­ од­ итс­ я указ­ ат­ ель мы­ши, вы прос­ то щел­кае­те и  пе­рет­ ас­кив­ ае­те ближ­ айш­ ую по­ло­су про­крут­ки.

258 Глава 13. Графический Vim (gvim) Мно­гие оп­ции, включ­ ая guioptions, зад­ аю­ т мно­го пар­ ам­ етр­ ов, по­ это­му по умол­чан­ ию они мо­гут вклю­чать мно­же­ств­ о фла­гов. Буд­ у­ щие вер­сии gvim мо­гут до­бав­ ить свои, нов­ ые флаг­ и. След­ о­ва­тель­но, в ко­манд­ е :set guioptions важ­но ис­польз­ ов­ ать син­такс­ ис += и -=, да­ бы из­бе­жать уда­ле­ния нуж­ных ус­тан­ о­вок. На­при­мер, :set guio­pt­i­ ons+=l доб­ ав­ ит в gvim оп­цию «пол­ ос­ а прок­ рут­ки все­гда сле­ва» и ос­та­ вит ос­тальн­ ые ком­пон­ ен­ты строк­ и guioptions не­тро­ну­тым­ и.Меню Ме­ню gvim полн­ о­стью на­страи­ваем­ ое. В этом разд­ ел­ е мы рас­смотр­ им ха­ рак­те­ри­стик­ и мен­ ю по умолч­ а­нию, пок­ аз­ анн­ о­го на рис.  13.5, и  пок­ а­ жем спос­ об управл­ е­ния его форм­ ат­ ом. На рис.  13.6 по­ка­зан прим­ ер ис­польз­ ов­ ан­ ия мен­ ю. Здесь мы вы­бра­ли пункт Global Settings из мен­ ю Edit. Рис. 13.6. Расп­ о­лож­ ен­ ие ме­ню Edit кас­ка­дом

Настройка полос прокрутки, меню и панелей инструментов 259Инт­ ер­ есн­ о зам­ ет­ ить, что эти оп­ции мен­ ю слу­жат про­сто оберт­ка­ми дляком­ анд Vim. Фак­тич­ е­ски вы сам­ и мо­жет­ е соз­дав­ ать и  нас­ траив­ атьпунк­ты мен­ ю. Вско­ре мы расс­ ка­жем об этом. Зам­ ет­ им, что ес­ли об­ращ­ ать вним­ ан­ ие на мен­ ю, со­держ­ а­щее спра­ва со­че­та­ния клав­ иш и ком­ ан­ды, то можн­ о со вре­ме­нем вы­учить ко­ ман­ды Vim. На­прим­ ер, из рис. 13.6 видн­ о, что хоть для но­вичк­ а удоб­но най­ти зна­ком­ ую ком­ ан­ду от­мен­ ы Undo в мен­ ю Edit – там же, где она на­ход­ ит­ся и в дру­гих по­пул­ яр­ных программах, – но го­разд­ о быс­ т­рее бу­дет ис­поль­зов­ ать кла­ви­шу u, ука­зан­ную в мен­ ю.Как вид­но из рис.  13.6, вверх­ у кажд­ ог­ о ме­ню на­ход­ итс­ я пункт­ ир­наялин­ ии, сод­ ерж­ ащ­ ая пик­то­грам­му ножн­ иц. Щелч­ ок по этой ли­нии «от­рез­ а­ет» ме­ню, по­сле че­го поя­ в­ля­ет­ся своб­ одн­ о пла­вающ­ ее ок­но, в ко­то­ром дос­туп­ны все пункт­ ы под­мен­ ю без об­ра­ще­ния к строк­ е мен­ ю. Есл­ ищелк­нуть по пункт­ ирн­ ой ли­нии над пунк­том ме­ню Toggle Pattern High­light, пок­ а­зан­ном на рис. 13.6, то вы увид­ ит­ е что-то на­под­ о­бие рис. 13.7.Пла­вающ­ ее окн­ о можн­ о по­мес­тить в лю­бое мес­ то раб­ оч­ ег­ о сто­ла.Все ком­ ан­ды этог­ о под­ме­ню стан­ о­вят­ся мгно­вен­но дост­ упн­ ы­ми по од­ном­ у щелчк­ у мыш­ ью по окн­ у это­го под­мен­ ю. Кажд­ ом­ у пункт­ у мен­ юна­зна­че­на кла­виш­ а. Ес­ли пункт мен­ ю яв­ляе­ тс­ я подм­ ен­ ю, то он пред­ставл­ ен как кноп­ка со зна­ком «больш­ е» (кот­ о­рый вы­гляд­ ят как стрел­ка впра­во) в  пра­вой час­ти кнопк­ и. На­жат­ ие этой кноп­ки раск­ рыв­ а­етпод­мен­ ю.Рис. 13.7. Отр­ ыв­ ан­ ие ме­ню

260 Глава 13. Графический Vim (gvim) Основная настройка меню gvim сох­ ран­ яе­ т опр­ ед­ е­лен­ ия ме­ню в фай­ле с име­нем $VIMRUNTIME/menu.vim. Опр­ е­дел­ е­ние пункт­ ов мен­ ю очень пох­ ож­ е на отоб­ раж­ ен­ ие клав­ иш. Как был­ о вид­но в раз­де­ле «Ис­польз­ ов­ ан­ ие ком­ ан­ды ото­браж­ е­ния map» на стр. 126, кла­виш­ а мож­ ет отоб­ ра­жать­ся как: :map <F12> :set syntax=html<CR> Мен­ ю ор­ган­ из­ уе­ тс­ я сходн­ ым об­ра­зом. Предп­ ол­ о­жим, что вмес­ то на­зна­чен­ ия уст­ а­нов­ки синт­ ак­си­са html кла­ виш­ е F12 нам для этой зад­ ач­ и нуж­ ен спец­ иа­ ль­ный пункт «HTML» в ме­ ню File. Вос­поль­зу­ем­ся ко­ман­дой :amenu: :amenu File.HTML :set syntax=html<CR> Че­ты­ре симв­ ол­ а <CR> след­ у­ет вво­дить как пок­ аз­ а­но, так как это часть ко­ман­ды. Те­перь пос­ мот­рим на ме­ню File. Мы увид­ им нов­ ый пункт HTML, как пок­ аз­ а­но на рис. 13.8. Исп­ оль­зо­ва­ние amenu вмес­ то menu га­ран­ти­ру­ет, что этот пункт буд­ ет дост­ уп­ ен во всех ре­жим­ ах (ком­ анд­ном, реж­ и­ме встав­ ки и норм­ аль­ном реж­ им­ е). Рис. 13.8. Пункт ме­ню HTML в мен­ ю File Ко­манд­ а menu доб­ авл­ яе­ т пункт в мен­ ю тольк­ о для ко­мандн­ о­го ре­жи­ ма. В норм­ аль­ном реж­ и­ме и ре­жим­ е встав­ки он дос­ту­пен не буд­ ет.

Настройка полос прокрутки, меню и панелей инструментов 261Рас­пол­ о­жен­ ие пункт­ а ме­ню зад­ а­етс­ я ряд­ ом его мно­го­уровн­ ев­ ых эле­мент­ ов, раз­дел­ ен­ных точк­ ам­ и (.). В наш­ ем при­мер­ е File.HTML до­бавл­ яе­ тпункт «HTML» в мен­ ю File. Пос­ ледн­ ий эле­мент в этом ряду – тот, кот­ о­рый вы хот­ и­те до­ба­вить. Мы до­бавл­ я­ли элем­ ент­ ы к  су­щес­ тв­ ующ­ ем­ уме­ню, но вско­ре бу­дет вид­но, что соз­да­ние це­ло­го каск­ адн­ о­го ряд­ а но­вых мен­ ю нич­ уть не сложн­ ее.Про­вер­ им раб­ от­ о­спос­ обн­ ость нов­ ог­ о пункт­ а мен­ ю. Доп­ уст­ им, мы на­ча­ли ре­дакт­ и­ров­ ать файл, рас­по­знан­ный Vim как файл XML, как можн­ оуз­нать из строк­ и со­стоян­ ия на рис. 13.9. Мы нас­ троил­ и ее так, чтоб­ ыVim и gvim ото­бра­жа­ли те­ку­щий син­такс­ ис в ее са­мой пра­вой час­ти (см.под­разд­ ел «Инт­ ер­ ес­ный трюк» на стр. 232).По­сле выз­ о­ва нов­ о­го пунк­та мен­ ю HTML строк­ а со­стоян­ ия Vim под­тверж­ дае­ т, что этот пункт сраб­ от­ ал, так что теп­ ерь уст­ а­новл­ ен син­так­сис HTML (рис. 13.10).Рис. 13.9. Стро­ка со­стоя­ния, пок­ аз­ ыв­ ающ­ ая ус­тан­ овл­ ен­ныйсин­так­сис XML пер­ ед дей­ст­вие­ м но­во­го пункт­ а мен­ юРис. 13.10. Стро­ка сос­ тоя­ния, пок­ а­зы­вающ­ ая синт­ акс­ ис HTMLпо­сле дейс­ тв­ ия но­вог­ о пунк­та ме­нюОбр­ а­тит­ е вним­ ан­ ие, что до­бавл­ ен­ный пункт ме­ню HTML не име­ет со­кращ­ е­ния или ком­ анд­ ы справ­ а от не­го. Сейч­ ас мы пе­ред­ ел­ ае­ м это так,чтоб­ ы этот пункт сод­ ер­жал по­доб­ное до­пол­нен­ ие.Во-перв­ ых, удал­ ит­ е сущ­ е­ст­вую­щий пункт: :aunmenu File.HTML Ес­ли вы до­бав­ля­ли пункт для ко­мандн­ о­го реж­ им­ а, то есть поль­зо­ ва­лись ком­ анд­ ой menu, то его мож­но удал­ ить с по­мощ­ ью unmenu.По­сле этог­ о доб­ ав­ им но­вый пункт мен­ ю HTML, отоб­ ра­жаю­щий ком­ ан­ду, связ­ ан­ную с этим пунк­том: :amenu File.HTML<TAB>syntax=html<CR> :set syntax=html<CR>

262 Глава 13. Графический Vim (gvim) Теп­ ерь, по­сле спец­ иф­ и­ка­ции пунк­та ме­ню, след­ у­ет <TAB> (на­би­рать на­до бук­ ­вальн­ о это) и syntax=html<CR>. Во­об­ще го­во­ря, чтоб­ ы ото­браз­ ить текст спра­ва от пунк­та ме­ню, по­мес­ти­те его по­сле стро­ки <TAB> и  за­кон­чи­те ввод соч­ е­тан­ и­ем <CR>. По­луч­ ен­ное в  рез­ ульт­ ат­ е ме­ню File пок­ аз­ ан­ о на рис. 13.11. Рис. 13.11. Пункт ме­ню HTML, в кот­ ор­ ом отоб­ ра­же­на со­отв­ ет­ст­вующ­ ая ко­манд­ а Есл­ и вам нуж­ны проб­ е­лы в тек­сте опис­ а­ния пункт­ а ме­ню (или в на­ зван­ ии ме­ню), их нуж­но предв­ а­рять об­рат­ной кос­ ой черт­ ой (\), ина­ че Vim вос­прим­ ет все, что стои­ т пос­ ле пер­вог­ о проб­ е­ла, как опр­ ед­ е­ лен­ ие дейс­ тв­ ия мен­ ю. В пред­ ыд­ ущ­ ем прим­ ер­ е, ес­ли бы мы зах­ от­ е­ли в кач­ е­ст­ве тек­ста опис­ ан­ ия иметь :set syntax=html вме­сто про­стог­ о syntax=html, то ко­манд­ а :amenu имел­ а бы сле­дую­щий вид: :amenu File.HTML<TAB>set\ syntax=html<CR> :set syntax=html<CR> В боль­шин­ст­ве слу­ча­ев луч­ше не ме­нять оп­ре­дел­ ен­ ия имеющ­ ихс­ я пунк­ тов мен­ ю, а  вмес­ то этог­ о соз­да­вать от­дель­ные нез­ а­вис­ им­ ые эле­мент­ ы. Это тре­буе­ т оп­ре­де­лен­ ия но­вог­ о ме­ню в  кор­не­вом уров­не, но по­доб­ное дей­ст­вие не сложн­ ее, чем до­бавл­ е­ние пункт­ а к  су­щес­ тв­ ующ­ е­му мен­ ю. Прод­ ол­жая наш при­мер, соз­дад­ им нов­ ое ме­ню под наз­ ван­ ие­ м MyMenu и до­ ба­вим в не­го пункт HTML. Для нач­ а­ла удал­ им пункт HTML из мен­ ю File: :aunmenu File.HTML Зат­ ем введ­ ем ко­ман­ду: :amenu MyMenu.HTML<TAB>syntax=html :set syntax=html<CR>

Настройка полос прокрутки, меню и панелей инструментов 263Рисунок 13.12 пок­ а­зы­вае­ т, как буд­ ет вы­гля­деть стро­ка ме­ню по­сле вы­полн­ е­ния этой ком­ ан­ды.Рис. 13.12. Строк­ а ме­ню с до­бав­ленн­ ым пунк­том MyMenuКом­ ан­ды мен­ ю пред­ ос­тав­ля­ют ис­кус­ный кон­троль над рас­пол­ ож­ ен­ ие­ ммен­ ю и их пов­ ед­ е­ни­ем, на­прим­ ер они след­ ят за тем, ука­зы­ва­ют ли ко­ман­ды на дей­ств­ ие. Мож­но так­же управ­лять вид­ им­ о­стью ме­ню. В сле­дующ­ ем разд­ ел­ е мы расс­ мот­рим эти возм­ ож­нос­ ти.Дальнейшая настройка менюТе­перь, ко­гда мы зна­ем спос­ о­бы прос­ тог­ о изм­ ен­ е­ния и рас­ши­ре­ния ме­ню gvim, рас­смот­рим друг­ ие прим­ е­ры на­строй­ки и управл­ е­ния.В пред­ ы­ду­щем прим­ е­ре мы не указ­ ал­ и, где имен­но нужн­ о раз­мес­титьнов­ ый пункт MyMenu, по­этом­ у gvim сам пом­ ест­ ил его межд­ у пунк­там­ иWindow и Help. gvim поз­ во­ляе­ т зад­ а­вать по­зиц­ ию с пом­ ощ­ ью та­ко­го по­нят­ ия, как при­ори­тет, ко­то­рый яв­ляе­ тс­ я прос­ то чис­лом, при­свое­ н­ным кажд­ о­му пункт­ у мен­ ю и  опр­ ед­ ел­ яющ­ им зан­ им­ аем­ ое этим пунк­том мес­ то в стро­ке ме­ню. К со­жал­ ен­ ию, мно­гие поль­зов­ ат­ ел­ и рас­смат­ри­ваю­ т прио­ ри­тет сов­ ер­шен­но не так, как опр­ е­дел­ ен­ о в gvim. Что­бы по­нять его суть, взглян­ и­те снов­ а на пор­ я­док след­ о­ван­ ия пунк­тов мен­ ю нарис. 13.5 и срав­нит­ е с прио­ ри­те­том пунк­тов ме­ню gvim, уст­ а­новл­ ен­нымпо умолч­ ан­ ию и прив­ ед­ ен­ным в табл. 13.1.Табл­ иц­ а 13.1. При­ори­те­ты ме­ню, стоя­щие в gvim по умолч­ а­ниюМен­ ю Прио­ рит­ етFile 10Edit 20Tools 40Syntax 50Buffers 60Window 70Help 9999Мно­гие поль­зо­ват­ е­ли счи­та­ют, что File име­ет бол­ ее вы­со­кий при­орит­ ет,чем Help (из-за че­го File рас­по­лож­ ен лев­ ее Help), но на сам­ ом де­ле при­ори­тет Help выш­ е. Так что рас­смат­рив­ ай­те знач­ ен­ ие прио­ рит­ ет­ а какука­зан­ ие, на­сколь­ко прав­ ее буд­ ет расп­ о­ло­жен этот пункт мен­ ю.

264 Глава 13. Графический Vim (gvim) Прио­ рит­ ет мен­ ю можн­ о опр­ е­дел­ ить, ес­ли при­пис­ ать его чис­ ло­вое знач­ е­ ние к ко­манд­ е menu. Ес­ли знач­ е­ние не ус­тан­ ов­лен­ о, приоритету при­сва­и­ вае­ тс­ я значение, равн­ ое 500. Именн­ о поэ­ том­ у MyMenu в прош­ лом при­ мер­ е ока­зал­ ось меж­ду Window (при­орит­ ет 70) и Help (при­орит­ ет 9999). Пред­по­лож­ им, что нужн­ о по­мест­ ить но­вый пункт ме­ню межд­ у File и  Edit. MyMenu след­ уе­ т при­сво­ить при­ори­тет больш­ е 10, но мень­ше 20. Сле­дующ­ ая ко­манд­ а ус­тан­ о­вит зна­че­ние прио­ ри­те­та рав­ным 15, по­сле чег­ о бу­дет дос­тиг­нут нужн­ ый эфф­ ект: :15amenu MyMenu.HTML<TAB>syntax=html :set syntax=html<CR> Коль ско­ро мен­ ю по­яви­лось, его по­лож­ ен­ ие заф­ ик­си­ро­ва­но для все­ го сеа­ н­са ре­дакт­ и­ров­ а­ния и не мен­ яе­ т­ся в ре­зульт­ ат­ е дей­ств­ ия дру­ гих ко­манд, зат­ раг­ и­вающ­ их это ме­ню. Нап­ ри­мер, есл­ и вы доб­ ав­ ит­ е но­вый пункт, прип­ ис­ ав к ко­ман­де преф­ икс, уст­ а­нав­ли­вающ­ ий но­ вый прио­ рит­ ет, то пол­ о­жен­ ие мен­ ю от это­го не из­мен­ ит­ся. Чтоб­ ы внес­ ти еще боль­ше нер­ азб­ е­рих­ и в при­ори­тет­ ы и поз­ и­ции ме­ню, доб­ ав­ им, что по­лож­ ен­ ие пункт­ ов мен­ ю внут­ри мен­ ю то­же мож­но зад­ а­ вать с пом­ о­щью прио­ ри­те­та. Пунк­ты мен­ ю с бол­ ее выс­ ок­ им при­ори­те­ том расп­ о­лаг­ а­ют­ся ниж­ е, чем пунк­ты с меньш­ им прио­ ри­тет­ ом, но син­ такс­ ис для пунк­тов ме­ню отл­ и­чае­ т­ся от исп­ оль­зуе­мо­го при оп­ред­ е­ле­ нии мес­та мен­ ю. Рас­шир­ им один из наш­ их ста­рых при­мер­ ов, прис­ вои­ в очень боль­шой прио­ ри­тет (9999) для пунк­та ме­ню HTML, что­бы он по­явил­ся в сам­ ом низ­ у мен­ ю File: :amenu File.HTML .9999 <TAB>syntax=html<CR> :set syntax=html<CR> За­чем нуж­на точ­ка пе­ред 9999? Здесь нуж­но указ­ ать два прио­ рит­ ет­ а, от­дел­ енн­ ых друг от дру­га точ­ка­ми: один – для File, а  другой – для HTML. Прио­ рит­ ет для File мы ост­ ав­ им пус­тым, пос­ кольк­ у это ме­ню уже су­ще­ст­вуе­ т и его при­ори­тет нель­зя изм­ е­нить. Воо­ б­ще гов­ ор­ я, при­ори­те­ты для пункт­ ов мен­ ю расп­ ол­ ож­ ен­ ы меж­ду на­ зван­ ие­ м мен­ ю для это­го пунк­та и оп­ред­ ел­ ен­ и­ем пункт­ а. Для каж­дог­ о уровн­ я в ие­рарх­ ии мен­ ю сле­дуе­ т указ­ ать при­орит­ ет или пос­ та­вить точ­ ку, ука­зы­вая этим, что он ост­ а­етс­ я без из­мен­ е­ния. Так­ им обр­ аз­ ом, ес­ли вы доб­ ав­ляет­ е пункт, расп­ ол­ ож­ енн­ ый глуб­ о­ко в иер­ ар­хии мен­ ю, нап­ ри­ мер Edit→Global Settings→Context lines→Display, и  хот­ и­те прис­ вои­ ть пос­ лед­не­му пункт­ у (Display) прио­ рит­ ет 30, то его нуж­но ука­зать как ...30. Раз­мещ­ е­ние с при­орит­ ет­ ом выг­ ля­дит так: Edit.Global\ Settings.Context\ lines.Display ...30 Как и в случ­ ае с при­ори­те­та­ми мен­ ю, при­ори­те­ты пункт­ ов ме­ню ста­но­ вятс­ я фикс­ ир­ о­ванн­ ым­ и по­сле их за­да­ния. На­кон­ ец, вы мо­жет­ е управ­лять «пром­ е­жутк­ а­ми» в  ме­ню с  по­мо­щью раз­дел­ и­тел­ ей мен­ ю в  gvim. Ис­польз­ уй­те те же оп­ред­ ел­ е­ния, что и  для

Настройка полос прокрутки, меню и панелей инструментов 265добавления обыч­ног­ о пунк­та ме­ню, но вме­сто на­зва­ния ко­ман­ды «...»пос­ тавь­те ми­нус (-) до и по­сле нег­ о1.Соберем все вместеТеп­ ерь мы зна­ем, как соз­дав­ ать, пом­ ещ­ ать и на­страи­вать ме­ню. Сде­ла­ем наш при­мер пос­ тоя­ нн­ ой час­ тью ок­руж­ ен­ ия gvim, пом­ ес­тив расс­ мот­рен­ные ком­ ан­ды в файл .gvimrc. Пос­ ле­до­ват­ ель­ность строк должн­ а вы­гля­деть прим­ ер­но так: \" add HTML menu between File and Edit menus 15amenu MyMenu.XML<TAB>syntax=xml :set syntax=xml<CR> amenu .600 MyMenu.-Sep- : amenu .650 MyMenu.HTML<TAB>syntax=html :set syntax=html<CR> amenu .700 MyMenu.XHTML<TAB>syntax=xhtml :set syntax=xhtml<CR>Те­перь у нас есть вы­со­кок­ лассн­ ое собс­ тв­ ен­ное ме­ню, даю­щее быс­ тр­ ыйдос­туп к  трем част­ о исп­ ольз­ уем­ ым ко­манд­ ам. В  этом при­ме­ре нужн­ оот­ме­тить нес­ коль­ко важ­ных мо­мент­ ов:• Пер­вая ком­ ан­да () исп­ ольз­ уе­ т пре­фикс 15, пред­ла­гая gvim приме- нять при­ори­тет, рав­ный 15. Для нен­ ас­ трое­ н­но­го окр­ уж­ ен­ ия этот пре­фикс пом­ ес­тит ме­ню межд­ у ме­ню File и Edit.• По­след­ ующ­ ие ко­ман­ды (,  и  ) не опр­ ед­ ел­ я­ют прио­ ри­тет, по­ сколь­ку буд­ уч­ и един­ о­жды за­данн­ ым, он не мо­жет при­ним­ ать дру­ гие знач­ ен­ ия.• По­сле перв­ ой ком­ анд­ ы мы исп­ ольз­ ов­ ал­ и синт­ акс­ ис прио­ ри­те­та под­ мен­ ю (,  и ), что­бы удо­сто­ве­рить­ся в прав­ ильн­ ом по­рядк­ е кажд­ о­ го нов­ ог­ о пункт­ а. Обр­ ат­ ит­ е вним­ ан­ ие, что пер­вое опр­ е­дел­ ен­ ие нач­ и­ на­етс­ я с  .600. Это гар­ ант­ и­ру­ет, что пункт ме­ню по­мещ­ а­ет­ся пос­ ле пер­во­го оп­ре­де­лен­но­го нам­ и пунк­та, так как мы не зад­ ав­ ал­ и его прио­ ри­тет, а при­свои­ли зна­чен­ ие по умолч­ а­нию, равн­ ое 500.Для бо­лее удоб­но­го дос­туп­ а щелк­нит­ е по лин­ ии «с ножн­ иц­ а­ми», что­быпоя­ вил­ ось соб­ств­ ен­ное пла­вающ­ ее мен­ ю, как по­каз­ а­но на рис. 13.13.Рис. 13.13. Польз­ о­ват­ ельс­ кое пла­ваю­щее «отор­ ван­ное» мен­ ю1 Пример из встрое­ н­ной справ­ки Vim: :menu Example.-Sep- :. – Прим. на­уч. ред.

266 Глава 13. Графический Vim (gvim)Панели инструментов Пан­ е­ли инструментов – это длинн­ ые по­ло­сы знач­ков для бы­ст­ро­го дос­ ту­па к  функц­ ия­ м про­грамм­ ы. На­при­мер, в  Windows пан­ ель инс­ т­ру­ мен­тов gvim расп­ ол­ ож­ е­на ввер­ху ок­на. В табл. 13.2 по­каз­ ан­ ы знач­ки пан­ ел­ и ин­ст­рум­ ент­ ов и их зна­че­ния. Табл­ и­ца 13.2. Знач­ки па­нел­ и инс­ тр­ ум­ ен­тов gvim и их знач­ е­ния Зна­чок Опи­са­ние Зна­чок Опис­ ан­ ие Диал­ ог от­крыт­ ия файл­ а Най­ти след­ ую­щее вхо­ж­ден­ ие шабл­ о­на по­ис­ка Со­хран­ ить те­кущ­ ий файл Найт­ и пре­ды­ду­щее вхо­жд­ е­ ние шаб­лон­ а по­ис­ка Со­хра­нить все фай­лы За­гру­зить ра­нее сох­ ран­ ен­ ный сеа­ нс Расп­ еч­ ат­ ать бу­фер Сох­ ран­ ить те­кущ­ ий се­анс ред­ акт­ ир­ ов­ а­ния Отм­ ен­ ить пос­ лед­нюю Выб­ рать скрипт Vim для за­ ком­ ан­ду пус­ка За­нов­ о вып­ олн­ ить по­след­ Соб­ рать те­ку­щий про­ект ко­ нее дейс­ т­вие манд­ ой make Выр­ е­зать вы­дел­ ен­ную Сген­ ер­ и­ров­ ать тег­ и для тек­ у­ часть текс­ та в буф­ ер обм­ ен­ а ще­го дер­ е­ва кат­ ал­ о­гов Ско­пи­ро­вать выд­ е­лен­ ие Пер­ ей­ти на тег под кур­сор­ ом в бу­фер обм­ ен­ а Встав­ ить бу­фер об­мен­ а От­крыть справк­ у в буф­ ер Най­ти и зам­ е­нить По­иск в справк­ е Есл­ и эти знач­ки вам не знак­ о­мы или не по­нятн­ ы, мож­но ото­бра­зить в пан­ ел­ и инс­ тр­ ум­ ен­тов как знач­ки, так и текст. Выз­ о­ви­те ком­ ан­ду: :set toolbar=\"text,icons\" Как при­нят­ о во мног­ их прод­ ви­ну­тых функ­ция­ х, Vim тре­буе­ т нал­ и­ чия включ­ ен­ной пан­ ел­ и инс­ т­ру­мент­ ов на этап­ е ком­пил­ яц­ ии, чтоб­ ы в слу­чае от­сутс­ тв­ ия не­обх­ од­ и­мо­сти ее мож­но бы­ло вык­ люч­ ить, сэко­ но­мив па­мять. Па­нель инс­ т­рум­ ен­тов не по­явит­ся, по­ка в gvim не бу­ дет включ­ ен­ а одн­ а из сле­дую­щих опц­ ий: +GUI_GTK, +GUI_Athena, +GUI_ Motif или +GUI_Photon. В гла­ве 9 рас­сказ­ ан­ о, как пе­рек­ ом­пи­лир­ ов­ ать Vim и в ре­зуль­тат­ е созд­ ать ссылк­ у на ис­полн­ яем­ ый файл gvim. Из­ме­не­ние пан­ е­ли ин­стр­ у­мент­ ов очень по­хо­же на из­ме­нен­ ие ме­ню. В сущ­нос­ ти, для это­го исп­ оль­зу­ет­ся та же са­мая ком­ анд­ а :menu, но с рас­ ши­рен­ным синт­ ак­си­сом для оп­ред­ е­лен­ ия гра­фик­ и. Хот­ я есть ал­го­

Настройка полос прокрутки, меню и панелей инструментов 267ритм, по­мо­гаю­щий gvim нах­ од­ ить свя­занн­ ый с  каж­дой ком­ анд­ ой зна­чок, мы ре­ком­ енд­ уе­ м ука­зать его яв­но.gvim расс­ матр­ и­ва­ет пан­ ель ин­ст­ру­мент­ ов как одн­ о­мерн­ ое ме­ню. Кро­мето­го, анал­ ог­ ич­но управ­ле­нию пол­ ож­ е­ние­ м но­во­го ме­ню отн­ о­си­тель­ноимею­щихс­ я пунк­тов, мож­но управ­лять по­лож­ ен­ и­ем кно­пок на пан­ е­лиин­ст­рум­ ент­ ов, прип­ и­сыв­ ая к  ком­ анд­ е menu чис­ло, опр­ е­дел­ яющ­ ее при­орит­ ет поз­ и­ции. В  отл­ ич­ ие от мен­ ю, но­вую па­нель инс­ т­ру­мент­ ов соз­дать нельз­ я. Все опр­ е­дел­ ен­ ия нов­ ых пункт­ ов пан­ ел­ и инс­ тр­ ум­ ен­тов по­явл­ яю­ тс­ я на одн­ ой пан­ ел­ и. Син­так­сис доб­ авл­ е­ния но­вой кноп­ки на па­нель ин­стр­ у­мент­ ов сле­дую­щий: :amenu icon=/some/icon/image.bmp ToolBar.NewToolBarSelection Actionгде /some/icon/image.bmp – путь к файл­ у, со­дер­жа­ще­му кнопк­ у пан­ е­лиили рис­ ун­ ок (обыч­но это знач­ ок), кот­ ор­ ый буд­ ет отоб­ ра­жатьс­ я на па­не­ли, NewToolBarSelection – нов­ ый пункт для кноп­ки пан­ е­ли ин­ст­рум­ ен­тов, а Action зад­ а­ет дей­ст­вие, вып­ ол­няем­ ое при наж­ а­тии кнопк­ и.На­при­мер, опр­ е­де­лим но­вый эле­мент па­не­ли ин­ст­рум­ ент­ ов, кот­ ор­ ыйпри наж­ ат­ ии или вы­дел­ е­нии выв­ од­ ит ок­но DOS в  Windows. По­ла­гая,что пер­ е­мен­ная PATH в Windows зад­ ан­ а пра­виль­но (так и долж­но быть),опр­ ед­ ел­ им элем­ ент для за­пус­ка окн­ а DOS из gvim, вы­пол­няя сле­дую­щую ком­ анд­ у (т. е. то, что обо­зна­че­но как Action): :!cmdДля кнопк­ и нов­ ог­ о эле­мент­ а или изоб­ ра­же­ния мы ис­поль­зу­ем знач­ ок,сод­ ерж­ а­щийс­ я в  на­шей сис­те­ме в  $HOME/dos.bmp и  пок­ а­зы­вающ­ ий при­глаш­ ен­ ие ком­ андн­ ой стро­ки DOS, как вид­но на рис. 13.14.Рис. 13.14. Знач­ ок DOSВы­полн­ ит­ е ко­манд­ у: :amenu icon=\"c:$HOME/dos.bmp\" ToolBar.DOSWindow :!cmd<CR>Она соз­даст пункт па­не­ли инс­ т­рум­ ент­ ов и до­бав­ ит наш зна­чок в ее ко­нец. Пан­ ель инс­ т­ру­мент­ ов долж­на при­об­рес­ ти вид, как на рис.  13.15.Но­вый знач­ ок поя­ вит­ся крайним справа.Рис. 13.15. Пан­ ель с доб­ ав­лен­ной ком­ ан­дой DOS

268 Глава 13. Графический Vim (gvim)Всплывающие подсказки gvim поз­ вол­ я­ет опр­ е­де­лить всплы­вающ­ ие под­сказк­ и как для пунк­тов ме­ню, так и для значк­ ов пан­ ел­ и ин­ст­рум­ ен­тов. Под­сказ­ки для пункт­ ов мен­ ю поя­ вл­ яю­ тс­ я в об­ласт­ и ко­манд­ной строк­ и ре­дак­тор­ а при вы­дел­ е­ нии пункт­ а мен­ ю мыш­ ью. Всплы­вающ­ ие под­сказк­ и для па­не­ли ин­ст­ ру­мен­тов отоб­ ра­жа­ют­ся при нах­ ож­ ­ден­ ии ука­зат­ ел­ я мы­ши над значк­ ом па­нел­ и. Нап­ рим­ ер, на рис.  13.16 по­каз­ ано, как подс­ каз­ка всплы­вае­ т при на­вед­ ен­ ии мыш­ и на кнопк­ у Find Previous в пан­ ел­ и инс­ т­ру­мен­тов. Рис. 13.16. Всплы­вающ­ ая подс­ казк­ а для знач­ка Find Previous Ко­манд­ а :tmenu опр­ ед­ е­ля­ет всплыв­ аю­щие подс­ каз­ки как для ме­ню, так и для пан­ е­ли инс­ тр­ ум­ ен­тов. Она име­ет сле­дующ­ ий синт­ акс­ ис: :tmenu TopMenu.NextLevelMenu.MenuItem tool tip text где TopMenu.NextLevelMenu.MenuItem оп­ре­дел­ я­ет ме­ню кас­кад­ ом от верх­нег­ о уровн­ я до пунк­та ме­ню, для кот­ о­ро­го зад­ а­етс­ я всплыв­ аю­щая под­сказк­ а. На­прим­ ер, для пунк­та Open из мен­ ю File она буд­ ет опр­ ед­ е­ лятьс­ я ко­ман­дой: :tmenu File.Open Open a file При опр­ ед­ ел­ ен­ ии пункт­ а па­не­ли инс­ тр­ у­мен­тов ис­поль­зуй­те ToolBar в ка­ че­ств­ е «мен­ ю» сам­ о­го выс­ о­ког­ о уровн­ я (для па­не­ли ин­ст­ру­мен­тов ре­ аль­но­го мен­ ю верх­не­го уров­ня не су­щес­ т­вуе­ т). Оп­ред­ ел­ им всплыв­ аю­щую подс­ казк­ у для знач­ка пан­ ел­ и ин­ст­рум­ ен­тов DOS из пред­ ыд­ у­ще­го раз­дел­ а. Введ­ и­те ком­ анд­ у: :tmenu ToolBar.DOSWindow Open up a DOS window Те­перь вся­кий раз при удерж­ ан­ ии мыш­ и над не­дав­но созд­ анн­ ой кно­ почк­ ой вы увид­ ит­ е всплы­ваю­щую под­сказ­ку, как пок­ а­зан­ о на рис. 13.17. Рис. 13.17. Па­нель с нов­ ой ко­манд­ ой DOS и нов­ ая всплы­вающ­ ая под­сказ­ка

gvim в Microsoft Windows 269gvim в Microsoft Windows Ред­ ак­тор gvim ста­нов­ ит­ся все бол­ ее по­пул­ ярн­ ым сред­ и поль­зо­ват­ ел­ ей Windows. Ста­ро­жил­ ы vi и Vim увид­ ят, что верс­ ия для Windows прев­ ос­ ход­на. Кро­ме тог­ о, она, ско­рее все­го, явл­ я­етс­ я сам­ ой све­жей для всех опе­рац­ ио­ нн­ ых сис­тем. Про­грамм­ а-ус­тан­ овщ­ ик авт­ о­мат­ ич­ е­ски и ак­кур­ атн­ о инт­ ег­ри­ру­ет Vim в окр­ уж­ е­ние Windows. Есл­ и нет, об­рат­ и­тесь за справк­ ой к фай­ лу gui-w32.txt в ка­та­ло­ге с исп­ ол­няем­ ым файл­ ом Vim, где про­пис­ а­ ны ин­ст­рукц­ ии для прог­ рамм­ ы regedit. По­скольк­ у это тре­буе­ т ре­ дак­тир­ о­ва­ния реес­ тр­ а Windows, не сто­ит это­го дел­ ать, ес­ли при этом вы чув­ст­вуе­те ма­лей­ший дис­комф­ орт. Луч­ше об­рат­ ит­ есь за по­ мощ­ ью к бол­ ее ком­пет­ ентн­ ом­ у в данн­ ом воп­ ро­се польз­ о­ва­тел­ ю. Это обыч­ная, но не­трив­ и­аль­ная проц­ ед­ у­ра. Поль­зо­ва­те­ли Windows со стаж­ ем зна­ко­мы с буф­ е­ром обм­ е­на – обл­ а­стью пам­ я­ти, где сод­ ерж­ ит­ся текст и дру­гая ин­фор­мац­ ия, ко­то­рую мож­но ис­ поль­зов­ ать при опер­ а­ция­ х ко­пир­ о­ва­ния, вы­ре­за­ния и встав­ки. Vim под­ держ­ и­вае­ т взаим­ од­ ей­ств­ ие с буф­ е­ром Windows. Про­сто выд­ е­ли­те текст в виз­ уа­ ль­ном реж­ им­ е и выб­ ер­ и­те пункт ме­ню Copy или Cut, по­сле чег­ о текст из Vim буд­ ет пер­ е­нес­ ен в бу­фер об­мен­ а Windows. Пос­ ле это­го вы смож­ ет­ е встав­ ить его в дру­гие при­ло­же­ния Windows.gvim в X Window System Поль­зо­ват­ е­ли, зна­ком­ ые с окр­ уж­ е­ни­ем X, мог­ ут оп­ред­ е­лять и ис­поль­ зо­вать мно­гие лег­ко нас­ траив­ аем­ ые функц­ ии X. На­прим­ ер, мож­но за­ да­вать ре­сур­сы при пом­ о­щи станд­ артн­ ых оп­ред­ ел­ е­ний клас­са, обыч­но со­дер­жа­щих­ся в фай­ле .Xdefaults. Обр­ ат­ и­те вни­ма­ние, что эти станд­ арт­ные ре­сурс­ ы X бу­дут по­лезн­ ы­ ми тольк­ о для GUI-верс­ ий Motif или Athena. Оче­видн­ о, верс­ ия Win­ dows не пой­мет ре­сур­сы X. Ме­нее оче­вид­но, что они не вос­прин­ и­ма­ ютс­ я ни в KDE, ни в GNOME. Пол­ное опи­са­ние X, а такж­ е проц­ ес­са его кон­фиг­ ур­ ац­ ии и на­строй­ки скру­пул­ езн­ о зад­ ок­ у­мент­ и­ров­ а­но и  не рас­сматр­ ив­ ае­ тс­ я в  этой кни­ге. Для крат­ко­го (или не очень крат­ко­го) вве­ден­ ия в X мы ре­ком­ ен­дуе­ м со­ от­вет­ст­вую­щее ру­ко­вод­ ство (man).Опции GUI и обзор команд В  табл.  13.3 соб­ ­ран­ ы ко­ман­ды и  опц­ ии, спец­ иа­ льн­ о пред­наз­ на­чен­ные для gvim. Они доб­ авл­ яю­ т­ся в  Vim, скомп­ и­ли­ров­ анн­ ый с  под­держ­кой GUI, и ста­но­вят­ся дейс­ тв­ ен­ны­ми, ес­ли выз­ вать ре­дакт­ ор ком­ анд­ ой gvim или vim -g.

270 Глава 13. Графический Vim (gvim) Таб­ли­ца 13.3. Опц­ ии, спец­ и­фич­ ес­ кие для gvim Ко­ман­да или опц­ ия Тип Опис­ а­ние guicursor оп­ция guifont На­стройк­ и форм­ ы и мер­цан­ ия кур­ guifontset опц­ ия со­ра guifontwide guiheadroom оп­ция Имен­ а исп­ оль­зуе­мых од­но­бай­то­вых guioptions шриф­тов guipty оп­ция guitablabel Име­на ис­поль­зуем­ ых мно­го­бай­то­ guitabtooltip опц­ ия вых шриф­тов toolbar -g опц­ ия Спис­ ок имен шрифт­ ов для сим­вол­ ов -U gvimrc двойн­ ой ши­рин­ ы опц­ ия :gui Ко­лич­ ес­ тв­ о пикс­ ел­ ов, ос­тавл­ ен­ных :gui filename... оп­ция для оконн­ ых рам­ ок :menu :menu menupath опц­ ия Узн­ ать, как­ ие опц­ ии и комп­ о­нен­ты :menu menupath action исп­ оль­зу­ютс­ я :menu n menupath action оп­ция Ис­польз­ ов­ ать псевд­ о­терм­ и­нал для ключ ко­манд­ ко­ман­ды «:!» ной строк­ и ключ ком­ анд­ Польз­ о­ват­ ельс­ кая мет­ка для ко­реш­ ной стро­ки ков вкла­док ко­манд­ а Польз­ ов­ а­тель­ская всплы­вающ­ ая подс­ казк­ а для кор­ еш­ков вкла­док ко­манд­ а Пункт­ ы, ото­бра­жае­мые в  па­не­ли ко­ман­да ин­стр­ ум­ ен­тов ко­манд­ а За­пуск GUI (так­же до­пус­кае­ т и дру­ ком­ анд­ а гие опц­ ии) ко­манд­ а Исп­ оль­зо­вать при зап­ ус­ке GUI файл ини­циа­лиз­ а­ции gvimrc ли­бо файл с пох­ о­жим име­нем Зап­ уск GUI (толь­ко в UNIX-под­ об­ ных сис­тем­ ах) За­пуск GUI вме­сте с  ред­ акт­ и­ро­ва­ ние­ м ука­зан­ных фай­лов Пер­ е­числ­ ить все ме­ню Пер­ еч­ исл­ ить мен­ ю, ко­то­рые нач­ и­ на­ютс­ я с menupath До­ба­вить ме­ню menupath, что­бы про­из­вес­ ти дей­ст­вие action Доб­ а­вить мен­ ю menupath с прио­ ри­ тет­ ом по­зиц­ ии n

Опции GUI и обзор команд 271Ком­ анд­ а или опц­ ия Тип Опис­ а­ние Доб­ ав­ ить пункт пан­ ел­ и ин­ст­ру­мен­:menu ToolBar.toolbarname ком­ анд­ а тов tool­bar­name, чтоб­ ы про­изв­ ес­ тиaction дейс­ т­вие action Соз­дать всплы­ваю­щую под­сказк­ у:tmenu menupath text ко­манд­ а для пунк­та ме­ню menupath с тек­с­ том text:unmenu menupath ком­ анд­ а Удал­ ить мен­ ю menupath

14Улучшения Vim для программистовГлава 14.Ре­дак­тир­ о­ва­ние текстов – не един­ств­ ен­ная обл­ асть при­мен­ ен­ ия Vim.Хор­ ош­ им прог­ рамм­ и­стам треб­ ую­ т­ся мощн­ ые средс­ т­ва, гар­ ан­ти­рую­щие эфф­ ект­ ивн­ ую проф­ ес­сион­ аль­ную раб­ о­ту. Хо­рош­ ая про­грамм­ а-ре­дак­тор – тольк­ о на­ча­ло, и одн­ о­го его нед­ ос­тат­ оч­но. Мног­ ие со­врем­ ен­ныесред­ ы прог­ рамм­ и­ров­ ан­ ия пыт­ а­ютс­ я обес­печ­ ить все­стор­ он­ние реш­ ен­ ия,одн­ ак­ о в дейс­ тит­ ель­но­сти нео­ бх­ о­дим лишь мощн­ ый ре­дак­тор с грам­ от­ны­ми до­полн­ ен­ ия­ми.Инс­ тр­ у­мент­ ы прог­ рам­мир­ о­ва­ния пред­ ос­тав­ля­ют доп­ ол­ни­тель­ные функ­ции, на­чин­ ая от под­свет­ки син­такс­ ис­ а, авт­ о­мат­ ич­ е­ских отс­ ту­пов, фор­ма­тир­ ов­ а­ния, авт­ о­зав­ ер­шен­ ия ключ­ ев­ ых слов и т. д. до полн­ о­функц­ ио­нальн­ ой инт­ ег­ри­ров­ ан­ной сре­ды разр­ аб­ отк­ и (IDE) с  изощ­ ренн­ ой ин­­теграц­ ие­ й, сос­ тавл­ яю­щей полн­ ую экос­ ис­ те­му разр­ аб­ от­ки. Та­кие IDEмогут быть дор­ ог­ о­стоящ­ и­ми (нап­ ри­мер, Visual Studio) или сво­бодн­ о рас­п­ рос­ тра­няем­ ы­ми (Eclipse), но их треб­ о­ван­ ия к диск­ о­во­му про­странс­ тв­ уи па­мят­ и очень выс­ о­ки, они имею­ т крут­ ую кри­вую обу­чен­ ия и без­мер­ные зап­ ро­сы рес­ ур­сов.У прог­ рамм­ ис­ тов раз­ные це­ли и треб­ ов­ ан­ ия к техн­ ол­ ог­ ия­ м. Не­боль­шиезад­ а­чи лег­ко ре­шаю­ тс­ я про­сты­ми ред­ ак­тор­ ам­ и, воз­можн­ о­сти ко­то­рыхчуть боль­ше, чем про­стая правк­ а тек­ста. Тяж­ е­лые, мног­ о­комп­ о­нентн­ ые,мног­ оп­ лат­форм­ ен­ные и треб­ ую­щие це­лог­ о шта­та про­грам­мис­ тов зад­ ач­ ипоч­ти на­верн­ як­ а по­треб­ ую­ т «тяж­ ел­ ой ар­тил­ле­рии», обес­пе­чив­ аем­ ойIDE. Од­нак­ о, ос­но­выв­ а­ясь на свое­ м обш­ ир­ном опыт­ е, мног­ ие умуд­рен­ные поль­зов­ ат­ ел­ и зна­ют, что IDE да­ет едв­ а ли больш­ е, чем доп­ ол­нит­ ель­ную слож­ность, при этом не по­выш­ ая ве­роя­ тн­ ость реш­ е­ния за­дач­ и.Vim предл­ аг­ а­ет прек­ расн­ ый ком­про­мисс межд­ у прос­ тым­ и ре­дакт­ о­рам­ ии мон­ о­лит­ным­ и IDE. Не­ко­тор­ ые его воз­мож­но­сти до не­давн­ ег­ о вре­ме­нису­щес­ т­вов­ а­ли толь­ко в дор­ о­гих сред­ ах разр­ а­бот­ки. Он поз­ во­ляе­ т бы­стр­ ои про­сто ре­шать зад­ ач­ и прог­ рамм­ ир­ о­ван­ ия без пер­ е­грузк­ и и сложн­ ос­ тиобуч­ е­ния, при­су­щих IDE.

Свертка и контуры (режим контуров) 273 Мно­гие опц­ ии, функц­ ии и  ком­ ан­ды спец­ и­аль­но разр­ а­бот­ ан­ ы для об­ лег­чен­ ия раб­ о­ты программиста – от сво­ра­чив­ а­ния строк про­грамм­ ы в одн­ у строк­ у до рас­цвет­ки синт­ ак­сис­ а и авт­ о­мат­ и­чес­ ко­го фор­мат­ ир­ о­ ва­ния. Vim обесп­ е­чи­ва­ет спец­ иал­ и­стов мно­жес­ т­вом ути­лит, ценн­ ость кот­ ор­ ых по­сти­гае­ тс­ я тольк­ о при их ис­поль­зов­ а­нии. С  одн­ ой сто­ро­ны, он пре­дост­ авл­ я­ет в не­ко­то­ром ро­де «ми­ни-IDE» под на­зва­ние­ м Quick­fix, а с другой – сод­ ерж­ ит удобн­ ые функц­ ии для раз­ноо­ бр­ аз­ных зад­ ач про­ грамм­ и­ров­ а­ния. В этой глав­ е мы предс­ та­вим след­ ующ­ ие те­мы: • Сверт­ка • Ав­то­ма­тич­ ес­ кие и умн­ ые отс­ туп­ ы • Ав­то­за­вер­ше­ние ключ­ ев­ ых слов и слов из сло­вар­ я • Тег­ и и расш­ и­рен­ные те­ги • Под­светк­ а син­такс­ и­са • Ав­тор­ская (ваш­ а соб­ств­ ен­ная) под­светк­ а синт­ ак­сис­ а • Quickfix, «ми­ни-IDE» в VimСвертка и контуры (режим контуров) Свертк­ а (fold) по­зво­ляе­ т опр­ ед­ ел­ ять, как­ ие част­ и файл­ а ост­ ав­лять ви­ ди­мы­ми. Нап­ рим­ ер, в  бло­ке код­ а можн­ о спря­тать все, что нах­ од­ ит­ся внутр­ и фи­гурн­ ых ско­бок, или скрыть все комм­ ент­ а­рии. Свертка – двухэ­ тап­ный про­цесс. Сна­чал­ а нужн­ о опр­ ед­ е­лить со­держ­ им­ ое свор­ а­чи­ ваем­ о­го блок­ а с  ис­польз­ о­ва­ни­ем одн­ о­го из мет­ од­ ов сверт­ки (про них мы рас­скаж­ ем поз­же). Зат­ ем при вы­зо­ве ком­ анд­ ы сверт­ки Vim пряч­ ет обоз­ нач­ ен­ный текст и став­ ит на его ме­сто одн­ о­строчн­ ый зап­ олн­ и­тель. Рисунок  14.1 пок­ аз­ ы­ва­ет, как вы­гляд­ ит свертк­ а в  Vim. За­пол­нит­ ель сверт­ки поз­ во­ляе­ т управ­лять стро­ка­ми, кот­ о­рые он скры­ва­ет.Рис. 14.1. Прим­ ер свер­ток в Vim

274 Глава 14. Улучшения Vim для программистов В этом при­ме­ре строк­ а 11 скрыт­ а в двух­строч­ной сверт­ке, нач­ и­ная со стро­ки 10. Восьм­ ис­ трочн­ ая сверт­ка, нач­ ин­ ающ­ ая­ся со строк­ и 15, скры­ ва­ет стро­ки с  16 по 22. Че­ты­рех­строчн­ ая сверт­ка, нач­ ин­ аю­щаяс­ я на стро­ке 26, скры­вае­ т строк­ и с 27 по 29. Тео­рет­ и­чес­ ки не сущ­ е­ст­вуе­ т пред­ е­ла для ко­лич­ е­ств­ а соз­да­ваем­ ых свер­ ток. Вы такж­ е мож­ е­те соз­да­вать вло­женн­ ые свертк­ и (сверт­ки внутр­ и сверт­ ок). Соз­дан­ ие и  ото­бра­же­ние свер­ток в  Vim управл­ я­етс­ я нес­ кольк­ им­ и оп­ ция­ми. Такж­ е, ес­ли вы нас­ озд­ а­ва­ли мно­жес­ тв­ о свер­ток, Vim пред­ ос­та­ вит вам ком­ анд­ ы, обл­ ег­чающ­ ие ра­бот­ у с ним­ и: :mkview и :loadview. Они слу­жат для сох­ ра­не­ния свер­ток межд­ у се­анс­ а­ми ра­бо­ты1, чтоб­ ы не при­ шлось соз­да­вать их сно­ва. Изуч­ е­ние сверт­ ок треб­ у­ет не­ко­тор­ о­го вре­мен­ и, одн­ а­ко, осв­ о­ив их, вы по­ лу­чае­те мощ­ный инс­ тр­ у­мент управ­ле­ния ото­браж­ ен­ и­ем ко­да. Не стои­ т не­доо­ цен­ ив­ ать его пре­иму­щес­ т­ва. Пра­вильн­ ая и чи­тае­мая прог­ рамм­ а треб­ у­ет на­деж­но­го диз­ айн­ а на нес­ кольк­ их уров­нях, а  хо­ро­шее про­ грамм­ ир­ о­ва­ние част­ о треб­ уе­ т умен­ ия «уви­деть лес за де­ревь­я­ми», дру­ гим­ и сло­ва­ми, игн­ о­ри­ров­ ать нек­ о­тор­ ые де­тал­ и реа­ли­за­ции, чтоб­ ы ви­ деть пол­ную струк­ту­ру фай­ла. Для опытн­ ых поль­зов­ ат­ ел­ ей Vim пред­ ос­тав­ля­ет шесть раз­лич­ных спо­ со­бов оп­ре­де­лен­ ия, соз­да­ния и управл­ е­ния свертк­ а­ми. Эта гибк­ ость по­ зво­ляе­ т соз­дав­ ать сверт­ки и  управл­ ять ими в  разл­ ичн­ ых кон­текс­ тах. Важн­ о то, что по­сле соз­да­ния свертк­ и отк­ рыв­ аю­ т­ся, за­кры­ва­ют­ся и оди­ нак­ ов­ о реа­ги­рую­ т на все ко­манд­ ы, вхо­дящ­ ие в  комп­ лект раб­ о­ты со свертк­ ам­ и. Ниж­ е при­ве­ден­ ы шесть мет­ од­ ов созд­ ан­ ия свер­ток: manual Оп­ред­ е­ля­ет охв­ ат сверт­ки с  пом­ ощ­ ью стан­дартн­ ых конс­ тр­ ук­ций Vim, нап­ ри­мер ком­ анд пер­ ем­ е­щен­ ия. indent Сверт­ки и  уровн­ и свер­ток со­от­ветс­ тв­ у­ют уров­ням от­ступ­ а текс­ та и зна­чен­ ию па­ра­метр­ а shiftwidth. expr Сверт­ку опр­ е­де­ляю­ т ре­гу­лярн­ ые выр­ а­жен­ ия. syntax Свертк­ и соо­ тв­ ет­ств­ у­ют сем­ ант­ ик­ е язы­ка файл­ а (нап­ ри­мер, в  про­ грам­ме на C свор­ а­чив­ аю­ тс­ я блок­ и отд­ ель­ных функ­ций). diff Сверт­ки опр­ е­дел­ яю­ т­ся разл­ ич­ иям­ и меж­ду двум­ я фай­ла­ми. 1 Свертк­ и так­же мог­ ут со­хра­нять­ся нар­ я­ду с друг­ и­ми нас­ траи­вае­мым­ и объ­ ект­ ам­ и Vim при вы­зо­ве ко­ман­ды :mksession; см. гла­ву 15. – Прим. нау­ ч. ред.

Свертка и контуры (режим контуров) 275 marker Гра­ниц­ ы сверт­ ок опр­ е­дел­ яю­ тс­ я пред­ о­пред­ е­лен­ным­ и (но так­же и оп­ ред­ ел­ яе­мым­ и польз­ ов­ а­тел­ ем) марк­ е­рам­ и в файл­ е. Ра­бо­та со сверт­кам­ и (от­кры­тие, за­крыт­ ие, уда­ле­ние и про­чее) оди­нак­ о­ ва для всех ме­то­дов. Мы рас­смот­рим руч­ные сверт­ки и де­тальн­ о об­су­ дим ком­ ан­ды Vim для ра­бот­ ы со свертк­ а­ми, а так­же зат­ ро­нем от­дель­ ные подр­ обн­ ос­ ти, от­но­ся­щиес­ я к  друг­ им мет­ од­ ам, которые являются сложными, уз­ко­спе­циа­ льн­ ыми и ле­жат за пре­дел­ ам­ и наш­ е­го вве­ден­ ия. Над­ е­емс­ я, что наш об­зор подт­ олк­нет вас к ис­сле­до­ван­ ия­ м бог­ ат­ст­ва ос­ таль­ных мет­ о­дов. Рас­смот­рим кратк­ о осн­ овн­ ые ком­ ан­ды сверт­ки и при­вед­ ем не­боль­шой при­мер ис­польз­ ов­ ан­ ия свер­ток на прак­тик­ е.Команды свертки Все ко­манд­ ы свертк­ и нач­ и­на­ют­ся с z. В кач­ е­ст­ве мнем­ он­ ик­ и для зап­ о­ мин­ ан­ ия пред­ставьт­ е слож­ ен­ный (соо­ тв­ ет­ст­вующ­ им обр­ а­зом) лист бу­ маг­ и и его сход­ств­ о с бу­кв­ ой «z». Су­ще­ст­ву­ет при­мерн­ о 20 ком­ анд свертк­ и, на­чин­ аю­щих­ся с z. С их по­ мо­щью мож­но соз­да­вать и  уда­лять, отк­ ры­вать и  за­кры­вать (пря­тать и  пок­ аз­ ы­вать прин­ ад­ле­жа­щий сверт­ке текст) свертк­ и, а  так­же пе­ре­ ключ­ ать их со­стоян­ ие (скрыт­ ая/рас­крыт­ ая). Ниж­ е дан­ ы крат­кие опи­ сан­ ия этих ком­ анд: zA Пер­ ек­ люч­ а­ет со­стоя­ние сверт­ ок, ре­курс­ ив­но. zC За­крыв­ ае­ т свертк­ и, ре­курс­ ивн­ о. zD Уда­ляе­ т свертк­ и, рек­ урс­ ивн­ о. zE Удал­ яе­ т все сверт­ки.1 zf Соз­дае­ т свертк­ у с  те­кущ­ ей строк­ и до той, куд­ а пер­ е­мес­тит кур­сор по­след­ ую­щая ком­ анд­ а пе­рем­ ещ­ е­ния. countzF Соз­дае­ т сверт­ку, ох­ва­ты­ваю­щую count строк, на­чи­ная с те­кущ­ ей. zM Ус­тан­ ав­ли­ва­ет опц­ ию foldlevel рав­ной нул­ ю.1 В  отл­ и­чие от ком­ ан­ды zD, дей­ств­ ующ­ ей на те­ку­щую (и  вло­женн­ ые в  нее) сверт­ку, zE удал­ я­ет все сверт­ки в буф­ е­ре не­за­ви­сим­ о от пол­ ож­ е­ния кур­со­ ра. – Прим. на­уч. ред.

276 Глава 14. Улучшения Vim для программистов zN, zn Ус­та­навл­ ив­ а­ет (zN) или сбрас­ ыв­ ае­ т (zn) опц­ ию foldenable. zO Рас­кры­вае­ т свертк­ и, ре­кур­сивн­ о. za Пе­рек­ люч­ ае­ т сос­ тоян­ ие одн­ ой сверт­ки. zc Зак­ рыв­ а­ет од­ну свертк­ у. zd Удал­ я­ет одн­ у свертк­ у. zi Пе­рек­ люч­ ае­ т зна­чен­ ие опц­ ии foldenable. zj, zk Пе­рем­ е­щае­ т кур­сор на нач­ ал­ о сле­дую­щей (zj) или на ко­нец пре­ды­ ду­щей (zk) сверт­ки. (Обр­ ат­ и­те вним­ ан­ ие на мне­мон­ ик­ у ко­манд j («jump») и k, а такж­ е на их сход­ст­во с анал­ о­гичн­ ым­ и ком­ анд­ ам­ и пе­ рем­ ещ­ ен­ ия­в конт­ екс­ те сверт­ ок.) zm, zr Умень­ша­ет (zm) или увел­ ич­ ив­ ае­ т (zr) на един­ иц­ у знач­ ен­ ие опц­ ии fold­level. zo От­кры­ва­ет од­ну свертк­ у. Не сле­дуе­ т пут­ ать уда­ле­ние сверт­ки с ком­ ан­дой удал­ ен­ ия. Исп­ оль­ зуйт­ е ком­ ан­ду уда­ле­ния сверт­ки для удал­ е­ния оп­ре­де­лен­ ия сверт­ ки. Уда­лен­ ие сверт­ки не ока­зыв­ ае­ т ник­ ак­ о­го влия­ния на текст, со­ дер­жа­щийс­ я в этой сверт­ке. Ком­ анд­ ы zA, zC, zD и zO наз­ ы­ва­ют­ся рек­ ур­сив­ны­ми, по­сколь­ку они дей­ ст­ву­ют на все сверт­ки, вло­женн­ ые в ту, к кот­ о­рой вы при­мен­ я­ли эти ко­ манд­ ы.Ручное сворачивание Есл­ и вам зна­ком­ ы ко­манд­ ы пе­ре­ме­щен­ ия в Vim, то вы уже вла­дее­те по­ ло­вин­ ой ин­форм­ а­ции, нужн­ ой для эф­фект­ ивн­ ой раб­ от­ ы с созд­ анн­ ы­ми вручн­ ую сверт­кам­ и. Нап­ ри­мер, для сво­ра­чив­ ан­ ия трех строк введ­ и­те сле­дую­щее: 3zF 2zfj 3zF вып­ олн­ я­ет ком­ ан­ду свор­ ач­ и­ва­ния zF для трех строк, на­чин­ ая с те­ ку­щей; 2zfj – с тек­ ущ­ ей строк­ и до той, куд­ а j пер­ е­мест­ ит кур­сор (в на­ шем слу­чае – на две стро­ки вниз).

Свертка и контуры (режим контуров) 277Поп­ роб­ уе­ м бо­лее сложн­ ую ко­манд­ у для прог­ рамм­ и­стов на C. Что­бысвер­нуть блок код­ а на C, пом­ ест­ и­те курс­ ор на нач­ аль­ную или кон­ еч­нуюскоб­ки ({ или }) про­граммн­ ог­ о блок­ а и введ­ и­те zf% (пом­нит­ е, что % пер­ е­мещ­ а­ет на вто­рую соо­ т­ветс­ т­вую­щую скобк­ у).Созд­ айт­ е сверт­ку от кур­со­ра до нач­ а­ла файл­ а, вве­дя zfgg (gg пе­рем­ е­щае­ тна нач­ а­ло файл­ а).Свертк­ и про­ще пон­ ять на прим­ ер­ ах. Возь­мем прос­ той файл, созд­ а­димсверт­ки, по­уп­раж­няе­ м­ся с ним­ и и пос­ мот­рим на рез­ ульт­ ат­ ы. Мы такж­ еуви­дим не­ко­то­рые ви­зу­альн­ ые под­сказ­ки (cues) свер­ток, пред­ ос­тавл­ яе­мые Vim.Снач­ ал­ а расс­ мотр­ им при­мер фай­ла с  рис.  14.2, сод­ ерж­ ащ­ ег­ о нек­ о­то­рые (бесс­ мысл­ енн­ ые) стро­ки ко­да на C. Изн­ ач­ альн­ о ни­ка­ких свер­токне бы­ло.Рис. 14.2. Файл-об­ра­зец без сверт­ окНе­скольк­ о за­меч­ ан­ ий по это­му рис­ унк­ у. Во-пер­вых, на ле­вой сто­ро­неэк­ра­на Vim ото­браж­ а­ет ном­ ер­ а строк. Мы ре­ком­ енд­ уе­ м всег­ да ос­тав­лять их вид­ им­ ым­ и (с по­мощ­ ью опц­ ии number), что­бы иметь больш­ е зри­тель­ной ин­фор­мац­ ии о пол­ ож­ е­нии в файл­ е, а в данн­ ой сит­ уац­ ии, ко­гдачасть строк про­па­да­ет из ви­да, эта ин­форм­ а­ция имее­ т еще боль­шуюцен­ность. Vim по­ка­зы­вае­ т кол­ ич­ е­ств­ о не­ото­браж­ аем­ ых строк, а ном­ е­рапод­тверж­ да­ют и подк­ ре­пл­ яю­ т эти данн­ ые.

278 Глава 14. Улучшения Vim для программистов Так­же обр­ ат­ и­те вним­ а­ние на се­рые столб­цы слев­ а от ном­ е­ров строк. Они зар­ е­зер­вир­ о­ва­ны для до­полн­ и­тель­ных виз­ у­альн­ ых подс­ ка­зок сверт­ кам. По мер­ е изу­чен­ ия сверт­ ок мы уви­дим виз­ у­альн­ ые под­сказк­ и, ко­то­ рые Vim буд­ ет вставл­ ять в эти столб­цы. Обр­ а­ти­те вним­ а­ние, что на рис. 14.2 курс­ ор на­хо­дитс­ я на стро­ке 18. По­ мест­ им ее и две пос­ ле­дую­щие стро­ки в одн­ у сверт­ку, пос­ ле чег­ о вве­дем zf2j. На рис. 14.3 по­ка­зан ре­зульт­ ат. Рис. 14.3. Три стро­ки, сверн­ ут­ ые на строк­ е 18 Обр­ а­тит­ е вним­ ан­ ие, что Vim соз­да­ет легк­ о расп­ о­знав­ аем­ ый марк­ ер с со­ че­та­ние­ м +-- в  на­ча­ле, а  текст пер­вой стро­ки свертк­ и раз­ме­щен в  за­ пол­ни­те­ле. Кром­ е тог­ о, слев­ а про­грамм­ а вста­вил­ а знак +. Это еще од­на ви­зуа­ ль­ная под­сказк­ а. Теп­ ерь в том же файл­ е мы сверн­ ем сле­дующ­ ий прог­ раммн­ ый блок, на­ хо­дя­щийс­ я межд­ у ско­бок по­сле опер­ ат­ ор­ а if. Пом­ ес­тит­ е кур­сор на лю­ бую из этих скоб­ ок и вве­дит­ е zf%. По­сле это­го файл при­мет вид, пок­ а­ зан­ный на рис. 14.4. Рис. 14.4. Про­граммн­ ый код, свер­нут­ ый за опе­ра­то­ром if Сейч­ ас сверн­ ут­ о во­семь строк ко­да, три из ко­то­рых сод­ ерж­ ат­ся в ран­ ее созд­ анн­ ой свертк­ е. Это наз­ ы­ва­ет­ся влож­ енн­ ой сверт­кой. За­ме­тим, что ник­ ак­ их ука­зан­ ий на нал­ и­чие вло­женн­ ой свертк­ и нет. Наш сле­дую­щий эксперимент – пом­ е­щен­ ие курс­ о­ра на стро­ку 25 и сво­ рач­ ив­ ан­ ие всех пред­ ы­дущ­ их строк вплоть до объя­ в­ле­ния функц­ ии fcn

Свертка и контуры (режим контуров) 279включ­ и­тель­но. На этот раз при­мен­ им ком­ ан­ду пер­ ем­ ещ­ ен­ ия с по­ис­ком.Нач­нит­ е ком­ ан­ду сверт­ки с  zf, про­из­ве­ди­те обр­ ат­ный по­иск к  нач­ а­луfcn, исп­ оль­зуя ?int fcn (ко­манд­ а об­ратн­ ог­ о пои­ с­ка в  Vim), и  наж­ мит­ еENTER. Эк­ран при­об­рет­ ет вид, как на рис. 14.5.Рис. 14.5. Сверт­ка до на­ча­ла функц­ ии Есл­ и вы подс­ чи­ты­вает­ е строк­ и и созд­ ает­ е свертк­ у, ох­ват­ ы­ваю­щую друг­ ую сверт­ку (на­прим­ ер, 3zf), то все строк­ и в этой свертк­ е рас­ сматр­ ив­ аю­ т­ся как од­на стро­ка. На­при­мер, ес­ли курс­ ор нах­ о­дитс­ я на строк­ е 30, а строк­ и 31–35 скрыт­ ы в свертк­ е на сле­дую­щей стро­ке эк­ра­на (то есть сле­дую­щая строк­ а экр­ а­на име­ет но­мер 36), то 3zf соз­ даст но­вую сверт­ку, со­дер­жа­щую три стро­ки, как они по­ка­зан­ ы на эк­ран­ е: текс­ то­вая строк­ а 30, пять строк, сод­ ер­жа­щих­ся в сверт­ке со строк­ а­ми 31–35, и тек­сто­вая стро­ка 36, ото­браж­ ае­мая ниж­ е на эк­ ран­ е. Не­ожи­данн­ о? Не­мног­ о. Можн­ о счи­тать, что ко­манд­ а zf счи­та­ ет стро­ки по прав­ ил­ у «Что ви­дим, то и свор­ ач­ и­вае­ м».Поп­ ро­бу­ем дру­гие функц­ ии. Во-перв­ ых, от­крое­ м все сверт­ки с  по­мо­щью ком­ ан­ды zO (по­сле z стои­ т бук­ ­ва O, а не ноль). Мы уви­дим ви­зу­аль­ные подс­ казк­ и в  ле­вом пол­ е, как пок­ а­за­но на рис.  14.6. Кажд­ ый изстолбц­ ов в этом по­ле наз­ ы­ва­етс­ я foldcolumn.На ри­сун­ке перв­ ая стро­ка кажд­ ой свертк­ и отм­ еч­ е­на знак­ ом мин­ ус (-),а все остальные – верт­ ик­ альн­ ой черт­ ой (|). Са­мая боль­шая (сам­ ая внеш­няя) сверт­ка на­хо­дит­ся в  сам­ ом ле­вом столбц­ е, а  са­мая внутренняя –в сам­ ом пра­вом. Как видн­ о из рис­ унк­ а, стро­ки 5–25 пред­став­ля­ют уро­вень са­мой низк­ ой вло­жен­но­сти (в наш­ ем случае – перв­ ый), строк­ и 15–22 – след­ ующ­ ий уро­вень (2), а строк­ и 18–20 – сам­ ый вы­со­кий уров­ ень. По умол­чан­ ию эта по­лезн­ ая ви­зуа­ ль­ная ме­таф­ о­ра отк­ люч­ е­на (не зна­ем, по­че­му; мо­жет быть, по­том­ у что отн­ им­ ае­ т мног­ о мес­та на эк­ ран­ е). Вклю­чить и оп­ред­ е­лить ее ши­рин­ у можн­ о ко­ман­дой: :set foldcolumns=n где n – ко­лич­ ес­ т­во ис­польз­ уем­ ых столбц­ ов (мак­си­мум 12, мин­ и­ мум 0). На ри­сунк­ е мы исп­ ольз­ о­ва­ли foldcolumn=5 (вни­ма­тельн­ ый чит­ ат­ ель зам­ е­тит, что на бол­ ее ранн­ их рис­ унк­ ах foldcolumn был ра­ вен 3. Мы по­ме­ня­ли зна­чен­ ие для лучш­ е­го зри­тель­ног­ о восп­ ри­ятия).

280 Глава 14. Улучшения Vim для программистов Рис. 14.6. Все сверт­ки от­крыт­ ы Рис. 14.7. Пос­ ле пов­ тор­ной сверт­ки строк 18–20 Те­перь соз­дай­те друг­ ие свертк­ и и по­наб­ лю­дайт­ е за их дей­ств­ ия­ми. Для нач­ а­ла снов­ а сверн­ и­те са­мую глуб­ ок­ ую сверт­ку, со­держ­ а­щую стро­ ки 18–20, по­мес­тив кур­сор на одн­ у из строк из диап­ аз­ он­ а и вве­дя zc (за­ крыть сверт­ку). Рисунок 14.7 прив­ од­ ит рез­ уль­тат. Увид­ ел­ и из­мен­ е­ние в  сер­ ом пол­ е? Vim под­дер­жив­ а­ет виз­ уа­ льн­ ые под­ сказ­ки, упр­ ощ­ ая ви­зуал­ и­за­цию и управл­ е­ние сверт­кам­ и. Да­лее по­смот­рим, как ра­бот­ а­ет в свертк­ е ти­пичн­ ая «од­нос­ троч­ная» ко­ манд­ а. Пом­ ес­тит­ е кур­сор на свер­ну­тую строк­ у (18) и введ­ ит­ е ~~ (сме­на рег­ ис­ тр­ а у всех симв­ о­лов те­ку­щей строк­ и). Не за­бы­вай­те, что в Vim ко­

Свертка и контуры (режим контуров) 281ман­да ~ явл­ я­етс­ я объ­ект­ным опе­ра­тор­ ом (ес­ли тольк­ о не включ­ е­на оп­ция compatible), и, след­ о­ват­ ельн­ о, он долж­ ен смен­ ить ре­гистр у  всехсимв­ о­лов строк­ и в наш­ ем при­мер­ е. Пос­ ле этог­ о отк­ рой­те сверт­ку, введ­ яzo (ком­ ан­да отк­ ры­тия сверт­ки). Теп­ ерь прог­ рамм­ а вы­гля­дит, как нарис. 14.8. Рис. 14.8. Смен­ а ре­гис­ тр­ а, прим­ е­ненн­ ая к сверт­ке Люб­ ое дейс­ т­вие в  сверт­ке влия­ет на всю свертк­ у. Нап­ ри­мер, на рис. 14.7 при пом­ ещ­ ен­ ии кур­со­ра на стро­ку 18 – свертк­ у, скрыв­ аю­ щую строк­ и с 18 по 20, – и вво­да dd (удал­ е­ние стро­ки) буд­ ут уда­лен­ ы все три строк­ и вме­сте со свертк­ ой. Важн­ о от­мет­ ить, что Vim управ­ляе­ т всем­ и ко­ман­дам­ и ред­ ак­тир­ ов­ а­ ния так, будт­ о бы ни­ка­ких свер­ток не бы­ло, то есть люб­ ая отм­ е­на анн­ ул­ ир­ уе­ т всю опер­ а­цию ре­дак­ти­ро­ван­ ия. На­прим­ ер, ес­ли вы вве­ ли u (от­ме­на) пос­ ле пред­ ыд­ ущ­ ей правк­ и, то все три удал­ енн­ ые стро­ ки бу­дут вос­стан­ ов­лен­ ы. Функ­ция от­ме­ны от­лич­ а­ет­ся от «од­но­ строчн­ ых» ко­манд, расс­ мотр­ ен­ных в этом разд­ е­ле, хо­тя иног­ да их дей­ств­ ия ка­жут­ся анал­ о­гичн­ ы­ми. Теп­ ерь сам­ ое врем­ я поз­ нак­ о­митьс­ я с  виз­ у­аль­ным­ и под­сказ­кам­ и по­ля foldcolumn. Они об­лег­чаю­ т обз­ ор сверт­ки, на ко­то­рую вы соб­ ир­ ае­тесь по­ дейс­ т­во­вать. Нап­ рим­ ер, ко­ман­да zc (зак­ рыт­ ие сверт­ки) зак­ ры­вае­ т са­ мую внутр­ енн­ юю сверт­ку, со­держ­ ащ­ ую стро­ку с кур­сор­ ом. Ве­лич­ ин­ у этой сверт­ки мож­но уз­нать по верт­ ик­ альн­ ым черт­ оч­кам в  foldcolumn. Как тольк­ о вы ос­воит­ есь с этим, так­ ие дейс­ тв­ ия, как отк­ рыт­ ие, за­кры­ тие и уда­лен­ ие сверт­ ок, стан­ ут для вас ест­ ес­ тв­ ен­ны­ми.Схема Расс­ мот­рим след­ ую­щий прос­ той (и  не слиш­ком ес­тес­ тв­ ен­ный) файл, где в ка­че­ств­ е от­ступ­ ов исп­ оль­зуе­ т­ся таб­ ул­ яц­ ия: 1. This is Headline ONE with NO indentation and NO fold level. 1.1 This is sub-headline ONE under headline ONE This is a paragraph under the headline. Its fold level is 2. 1.2 This is sub-headline TWO under headline ONE.

282 Глава 14. Улучшения Vim для программистов 2. This is Headline TWO. No indentation, so no folds! 2.1 This is sub-headline ONE under headline TWO. Like the indented paragraph above, this has fold level 2. - Here is a bullet at fold level 3. A paragraph at fold level 4. - Here is the next bullet, again back at fold level 3. And, another set of bullets: - Bullet one. - Bullet two. 2.2 This is heading TWO under Headline TWO. 3. This is Headline THREE. Сверт­ки Vim мож­но ис­польз­ ов­ ать для про­смотр­ а фай­ла в  вид­ е схем­ ы (outline). Оп­ре­де­ли­те ме­тод свор­ ач­ ив­ ан­ ия как indent: :set foldmethod=indent В  наш­ ем файл­ е зад­ ад­ им shiftwidth (уро­вень отс­ туп­ ов для таб­ ул­ я­ций) равн­ ым 4. По­сле это­го мы смож­ ем от­крыв­ ать и за­крыв­ ать свертк­ и на ос­но­ва­нии от­сту­пов строк. Для кажд­ о­го shiftwidth (в  наш­ ем случае – крат­но­го че­ты­рем столб­цам) в строк­ е с отс­ туп­ ом уро­вень свертк­ и уве­ лич­ и­ва­етс­ я на 1. На­прим­ ер, в  на­шем файл­ е под­за­гол­ овк­ и име­ют от­ ступ, рав­ный одн­ о­му shiftwidth или че­ты­рем столб­цам. След­ о­ват­ ельн­ о, уров­ ень сво­рач­ ив­ а­ния ра­вен 1. Стро­ки с от­ступ­ ом во­семь столбц­ ов (два shiftwidth) имею­ т уров­ ень 2 и т. д. Уров­нем вид­ и­мых сверт­ ок можн­ о управ­лять с пом­ о­щью ко­манд­ ы fold­ level. В кач­ ес­ т­ве ар­гу­мен­та ей пер­ ед­ а­етс­ я це­лое числ­ о, пос­ ле че­го она отоб­ ра­жа­ет тольк­ о те стро­ки, где уро­вень свертк­ и меньш­ е или ра­вен это­му арг­ у­мен­ту. В рас­смат­рив­ аем­ ом фай­ле следующей командой мож­ но ука­зать ред­ акт­ о­ру пок­ а­зы­вать толь­ко за­гол­ овк­ и сам­ о­го вы­сок­ ог­ о уров­ня: :set foldlevel=0 Экр­ ан прио­ б­рет­ ет вид, как на рис. 14.9. Ото­бра­зить все вплоть до пункт­ ов не­ну­мер­ о­ванн­ ых спис­ ков, включ­ ая их са­мих, мож­но пу­тем ус­тан­ ов­ки foldlevel, равн­ ым 2. Все свертк­ и с уров­нем не мень­ше 2 бу­дут вид­ им­ ы, как на рис. 14.10. Ис­польз­ уя этот ме­тод для про­вер­ки файл­ а, вы смо­жет­ е быс­ тр­ о раз­вор­ а­ чи­вать и сво­рач­ и­вать ви­дим­ ые уров­ни де­тал­ из­ а­ции с по­мо­щью ко­манд инк­ ре­мен­та (zr) и дек­рем­ ен­та (zm). Рис. 14.9. fold level = 0

Свертка и контуры (режим контуров) 283 Рис. 14.10. fold level = 2Несколько слов о других методах сворачивания У нас нет врем­ е­ни на рас­смотр­ ен­ ие всех ос­тальн­ ых ме­тод­ ов свор­ ач­ ив­ а­ ния, но для возб­ у­жд­ е­ния ва­шег­ о ап­пет­ ит­ а сдел­ а­ем бег­лый об­зор син­ такс­ и­че­ског­ о (syntax) мет­ од­ а. Возь­мем уже зна­ко­мый файл C, но на этот раз по­зво­лим Vim ре­шать, что нужн­ о свер­нуть на осн­ о­ва­нии синт­ ак­си­са C. Этот язык име­ет слож­ ные прав­ ил­ а сво­ра­чив­ ан­ ия, одн­ а­ко про­стог­ о куск­ а ко­да в прим­ е­ре дос­ тат­ очн­ о для де­монс­ тр­ ац­ ии воз­мож­но­стей ред­ ак­тор­ а по авт­ о­мат­ и­за­ции. Во-перв­ ых, с помощью ко­манд­ ы zE (уда­ле­ние всех свер­ток) убе­димс­ я, что мы из­ба­ви­лись от всех сверт­ ок. Те­перь экр­ ан пок­ аз­ ы­вае­ т весь код без ви­зу­альн­ ых марк­ е­ров в столб­це сверт­ ок (сле­ва). Ком­ ан­дой :set foldenable убед­ ит­ есь, что свор­ а­чи­ва­ние вклю­чен­ о (в слу­чае ручн­ о­го свор­ ач­ ив­ а­ния можн­ о бы­ло этог­ о не де­лать, по­скольк­ у foldenable авт­ ом­ ат­ ич­ ес­ ки уст­ а­ нав­ли­ва­етс­ я при за­дан­ ии foldmethod, равн­ ым manual). Введ­ и­те ко­ман­ду: :set foldmethod=syntax Свертк­ и прио­ бр­ е­тут вид, как на рис. 14.11. Vim свер­нул все про­граммн­ ые блок­ и в скобк­ ах, пос­ коль­ку они яв­ля­ют­ ся ло­гич­ е­ски смы­сло­вы­ми блок­ а­ми в C. Ес­ли вы­пол­нить zo в стро­ке 6 этог­ о прим­ е­ра, то Vim раск­ рое­ т сверт­ку и ото­бра­зит внутр­ енн­ юю. Рис. 14.11. По­сле при­мен­ е­ния ко­манд­ ы set foldmethod=syntax

284 Глава 14. Улучшения Vim для программистов Кажд­ ый ме­тод сво­рач­ и­ван­ ия исп­ оль­зу­ет разл­ ичн­ ые пра­вил­ а для опр­ е­ дел­ е­ния свер­ток. Мы приз­ ыв­ а­ем за­суч­ ить (раз­вер­нуть?) рук­ а­ва и узн­ ать в до­ку­мент­ ац­ ии Vim больш­ е об этих мощн­ ей­ших средс­ тв­ ах. Реж­ им diff в  Vim (ко­тор­ ый мож­но вклю­чить ком­ анд­ ой vimdiff) – это мощн­ ое соч­ е­та­ние сво­ра­чив­ ан­ ия, окон и  под­свет­ки синт­ акс­ и­са, ко­то­ рый мы об­суд­ им поз­же. Как пок­ аз­ а­но на рис. 14.12, этот ре­жим ото­бра­ жа­ет раз­ли­чия в файл­ ах (обычн­ о межд­ у дву­мя верс­ ия­ми одн­ о­го фай­ла). Рис. 14.12. Функц­ ия diff Vim и ее исп­ оль­зо­ван­ ие в свертк­ ахАвтоматические и умные отступы Vim пред­лаг­ а­ет чрезв­ ыч­ айн­ о слож­ные и мощн­ ые ме­то­ды ав­то­ма­тич­ е­ ской рас­ста­нов­ки отс­ ту­пов в текс­ те. В общ­ ем случ­ ае он ве­дет се­бя почт­ и ана­ло­гич­но vi с включ­ ен­ной опц­ и­ей autoindent, и для опис­ ан­ ия та­ког­ о по­вед­ е­ния ис­поль­зуе­ т­ся то же имя. Ме­тод рас­стан­ овк­ и отс­ туп­ ов мож­но вы­би­рать, про­сто ука­зав его наз­ ва­ ние в ком­ анд­ е :set: :set cindent В Vim есть след­ ующ­ ие мет­ од­ ы, пер­ е­числ­ ен­ные в по­ряд­ке возр­ аст­ ан­ ия слож­нос­ ти: autoindent Авт­ о­ма­тич­ ес­ кие от­сту­пы, по­хож­ ие на autoindent в vi. Не­больш­ ие отл­ и­ чия зак­ лю­ча­ют­ся в мес­те пом­ ещ­ е­ния курс­ ор­ а при удал­ е­нии от­ступ­ а. smartindent Чуть мощ­нее, чем autoindent, но расп­ о­знае­ т не­кот­ о­рые при­ми­тив­ ы синт­ акс­ и­са C для оп­ред­ е­лен­ ия уровн­ ей от­ступ­ ов. cindent Как след­ у­ет из на­зван­ ия, cindent включ­ а­ет го­раз­до боль­ше знан­ ий о син­такс­ и­се C и ввод­ ит ус­ложн­ ен­ную нас­ тройк­ у, вых­ о­дящ­ ую за рам­ ки про­стых уров­ней от­сту­па. Нап­ ри­мер, cindent мож­но на­стро­ить так, что­бы он со­от­вет­ст­во­вал ва­шим (или ва­ше­го босс­ а) люб­ им­ ым

Автоматические и умные отступы 285 сти­лям прог­ рам­ми­ров­ ан­ ия, включ­ ая (но не ог­ран­ и­чив­ ая­ сь) отс­ ту­пы фиг­ ур­ных скоб­ ок ({}), разм­ е­ще­ние ско­бок, на­ли­чие отс­ туп­ ов у обе­их скоб­ ок и даж­ е спо­соб соо­ тв­ ет­ств­ ия от­сту­па включ­ ен­но­му тек­сту. indentexpr Поз­ вол­ яе­ т оп­ре­де­лять поль­зо­ва­тельс­ кие вы­ра­жен­ ия, кот­ о­рые Vim выч­ ис­ляе­ т в  кон­тек­сте кажд­ ой нач­ а­той но­вой строк­ и. Имея так­ ую функц­ ию, вы сам­ и пиш­ ет­ е собс­ тв­ ен­ные прав­ и­ла. За подр­ обн­ о­стя­ми об­ра­щай­тесь к опи­сан­ ию скрипт­ ов и функ­ций в этой кни­ге, а так­же к до­кум­ ент­ ац­ ии Vim. Ес­ли перв­ ые три опц­ ии не да­вал­ и дост­ а­точн­ ой гиб­кос­ ти для авт­ о­ма­тич­ ес­ ких от­сту­пов, то indentexpr, нес­ ом­ ненн­ о, обеспечит ее.Расширения autoindent Vim по сравнению с vi В Vim autoindent ве­дет се­бя почт­ и как в vi, к то­му же его можн­ о сде­лать сов­ ер­шен­но ана­лог­ ич­ным, вклю­чив опц­ ию compatible. Одн­ о из пол­ ез­ных расширений Vim за­клю­ча­ет­ся в  его спо­собн­ ос­ ти расп­ о­зна­вать «тип» фай­ла и вставл­ ять под­хо­дя­щие симв­ ол­ ы ком­мент­ а­рия, ко­гда за­ком­мен­ тир­ о­ван­ный текст пе­рех­ о­дит на но­вую стро­ку. Эта функц­ ия пре­крас­но ра­бот­ ае­ т как с опц­ ие­ й wrapmargin (текст пе­ре­нос­ итс­ я, ос­тавл­ яя по пра­во­ му краю кол­ ич­ ес­ тв­ о столб­цов, указ­ ан­ное в wrapmargin), так и с опц­ ие­ й textw­idth (текст пе­рен­ о­ситс­ я, ког­ да чис­ло симв­ о­лов в строк­ е пре­выс­ ит пок­ а­зат­ ель textwidth). На рис. 14.3 по­каз­ ан ре­зульт­ ат в Vim и vi на од­ ном и том же файл­ е.Рис. 14.13. Раз­ли­чия межд­ у autoindent в Vim и в viОб­ра­ти­те вним­ ан­ ие, что во втор­ ом текс­ тов­ ом бло­ке (стро­ка 16 и ниж­ е)отс­ ут­ств­ у­ет пер­вый симв­ ол комм­ ент­ а­рия. Кроме того, ес­ли уст­ а­нов­ле­наопц­ ия compatible (подр­ а­жа­ние дейс­ т­ви­ям vi), то оп­ция textwidth не бу­

286 Глава 14. Улучшения Vim для программистов дет рас­поз­ нав­ ать­ся, по­этом­ у текст пер­ е­но­сит­ся на но­вые стро­ки тольк­ о по зна­чен­ ию опц­ ии wrapmargin.smartindent smartindent – это слег­ка рас­шир­ енн­ ый autoindent. Ме­тод мож­ ет ока­зать­ ся по­лезн­ ым, но ес­ли вы про­грам­ми­руе­те на C и ис­польз­ ует­ е слож­ные кон­стр­ ук­ции, то лучш­ е польз­ о­вать­ся cindent. smartindent авт­ о­ма­тич­ е­ски расс­ тавл­ я­ет отс­ туп, есл­ и: • Но­вая строк­ а сле­ду­ет за строк­ ой, сод­ ер­жащ­ ей лев­ ую фи­гурн­ ую скоб­ку. • Но­вая строк­ а на­чин­ ае­ т­ся с  клю­че­вог­ о сло­ва, кот­ о­рое пер­ еч­ исл­ ен­ о в опц­ ии cinwords. • Созд­ анн­ ая но­вая строк­ а пред­ше­ст­ву­ет строк­ е, нач­ ин­ аю­щейс­ я с пра­ вой фи­гурн­ ой скобк­ и (}), ес­ли кур­сор был пом­ ещ­ ен на строк­ у, сод­ ер­ жащ­ ую скобк­ у, и польз­ о­ва­тель соз­дал нов­ ую стро­ку с по­мощ­ ью ко­ ман­ды O (соз­дан­ ие но­вой стро­ки выш­ е те­кущ­ ей). • Нов­ ая строка – это зак­ рыв­ ающ­ ая (или пра­вая) фи­гур­ная скобк­ а (}).cindent Скор­ ее все­го, поль­зо­ва­те­ли Vim, прог­ рам­мир­ ующ­ ие на по­добн­ ых С язы­ ках, зах­ от­ ят ис­поль­зо­вать cindent или indentexpr. Хо­тя indentexpr бол­ ее мощ­ ный и  ги­бкий, а  такж­ е лучш­ е нас­ траив­ ае­ т­ся, для мног­ их зад­ ач про­грамм­ и­ро­ва­ния бо­лее прак­тич­ ен cindent. В нем есть мно­же­ств­ о оп­ ций для сам­ ых разн­ ых нужд про­грамм­ и­стов (и под разл­ ич­ные кор­по­ра­ тивн­ ые станд­ ар­ты). Снач­ ал­ а поп­ ро­буй­те cindent с нас­ трой­ка­ми по умол­ чан­ ию, а зат­ ем пом­ ен­ яйт­ е их, есл­ и они не соо­ т­вет­ст­вую­ т ваш­ им стан­ дар­там. Ес­ли опц­ ия indentexpr зад­ а­на, она отм­ ен­ яе­ т дейс­ тв­ ие cindent. Пов­ е­ден­ ие cindent опр­ е­де­ля­етс­ я тре­мя оп­ция­ми: cinkeys Зад­ а­ет кла­виш­ и клав­ иат­ ур­ ы, зас­ тавл­ яю­щие Vim за­нов­ о рас­счи­тать отс­ ту­пы. cinoptions Опр­ е­дел­ я­ет стиль от­ступ­ ов. cinwords Опр­ ед­ е­ляе­ т клю­че­вые сло­ва, предп­ ис­ ы­ваю­щие Vim доб­ ав­ ить до­пол­ нит­ ельн­ ый от­ступ к пос­ ле­дую­щим стро­кам. cindent ис­поль­зуе­ т строк­ у, зад­ анн­ ую cinkeys, как наб­ ор пра­вил, опр­ е­де­ ляю­щих отс­ ту­пы. Мы рас­смотр­ им зна­чен­ ие cinkeys по умолч­ а­нию, а за­ тем изуч­ им друг­ ие дос­туп­ные зна­че­ния и принц­ и­пы их раб­ о­ты.

Автоматические и умные отступы 287Опция cinkeyscinkeys – это спи­сок из сле­дую­щих эле­мен­тов, раз­де­лен­ных за­пя­ты­ми: 0{,0},0),:,0#,!^X^F,o,O,eНиж­ е пер­ е­чис­ле­ны их знач­ е­ния, раз­не­сен­ные по конт­ екс­ там, с  крат­ким опи­са­ни­ем дейс­ тв­ ия каж­дог­ о из них:0{ 0 (ноль) уст­ а­нав­ли­вае­ т кон­текст нач­ ал­ а стро­ки для сле­дующ­ е­го симв­ ол­ а, {. То есть ес­ли вы ввел­ и симв­ ол { пер­вым в стро­ке, Vim пе­ рес­ чит­ а­ет отс­ туп для данн­ ой стро­ки. Не пу­тай­те ноль, стоящ­ ий в этой оп­ции, с дей­ст­ви­ем «ис­польз­ ов­ ать здесь ну­лев­ ой отс­ туп», пред­став­ляю­щим со­бой обычн­ ое дел­ о при от­ ступ­ ах в C. В на­шем слу­чае ноль озна­чает, что «ес­ли симв­ ол введ­ ен в на­ча­ле строк­ и, не вын­ уж­ д­ ать его ото­браж­ атьс­ я в нач­ ал­ е строк­ и». Зна­че­ние от­ступ­ а для { по умол­чан­ ию рав­но ну­лю: по­верх тек­ у­ще­го от­сту­па но­вый доб­ ав­лятьс­ я не бу­дет. След­ ующ­ ий прим­ ер пок­ аз­ ы­ва­ ет ти­пичн­ ый ре­зульт­ ат: main () { if ( argv[0] == (char *)NULL ) { ...0}, 0) Как и  в  пре­ды­ду­щем прим­ е­ре, эти две уст­ а­нов­ки опр­ ед­ е­ля­ют кон­ текст на­чал­ а стро­ки. То есть ес­ли в нач­ ал­ е строк­ и вве­сти } или ), то Vim пе­рес­ чит­ а­ет от­ступ. Зад­ анн­ ый по умол­ча­нию от­ступ для } соо­ т­ветс­ т­вуе­ т отс­ ту­пу, уст­ а­ новл­ ен­но­му для соо­ т­вет­ств­ ую­щей отк­ рыв­ ающ­ ей скоб­ки {. Отс­ туп для ) по умолч­ а­нию равн­ я­ет­ся одн­ о­му shiftwidth.: Это конт­ екст для метк­ и C или для case statement. Есл­ и : (двоет­ оч­ ие) по­став­лен­ о в конц­ е метк­ и или опер­ а­то­ра case statement, то Vim пер­ е­ счи­тае­ т отс­ туп. По умолч­ ан­ ию для : отс­ туп­ ом явл­ яе­ тс­ я столб­ ец 1 – пер­вый столб­ ец в файл­ е. Не пут­ айт­ е его с ну­ле­вым от­ступ­ ом, ког­ да сле­дующ­ ая стро­ ка имее­ т тот же уро­вень от­сту­па, что и пре­ды­ду­щая. Ког­ да от­ступ ра­вен 1, пер­вый симв­ ол нов­ ой стро­ки сдвиг­ ае­ тс­ я влев­ о к сам­ ом­ у пер­ вом­ у столб­цу.0# Это так­же конт­ екст на­ча­ла строк­ и. Ко­гда пер­вым симв­ о­лом стро­ки явл­ яе­ тс­ я #, Vim пе­рес­ чит­ ыв­ ае­ т отс­ туп. Как и  в  пред­ ы­ду­щем опр­ ед­ е­ле­нии, по умолч­ ан­ ию от­ступ сдвиг­ а­ет всю строк­ у к пер­во­му столбц­ у. Это со­отв­ ет­ств­ уе­ т практ­ ик­ е на­чи­нать мак­рос­ ы (#define...) с перв­ о­го столб­ца.

288 Глава 14. Улучшения Vim для программистов !^F Спец­ иа­ ль­ный симв­ ол оп­ред­ ел­ я­ет лю­бой пос­ лед­ ующ­ ий симв­ ол как пер­ е­ключ­ ат­ ель для пе­ре­с­че­та отс­ туп­ а те­ку­щей стро­ки. В прив­ е­ден­ ном прим­ е­ре симв­ ол-переключатель – ^F (или CTRL-F), то есть при кажд­ ом на­жат­ ии CTRL-F по умол­чан­ ию Vim буд­ ет зан­ о­во вы­чис­ лять от­ступ для данн­ ой стро­ки. o Этот конт­ екст оп­ре­дел­ яе­ т лю­бую соз­да­вае­мую вам­ и но­вую стро­ку ли­бо по на­жат­ ию клав­ иш­ и ENTER в  ре­жим­ е вставк­ и, ли­бо с  ис­ польз­ о­ва­ние­ м ко­манд­ ы o (но­вая стро­ка). O От­ве­ча­ет за соз­дан­ ие но­вой стро­ки выш­ е те­кущ­ ей при пом­ ощ­ и ко­ манд­ ы O (но­вая строк­ а выш­ е те­ку­щей). e Кон­текст для else. Есл­ и вы нач­ ин­ ае­те стро­ку со сло­ва else, Vim пер­ е­ счи­ты­ва­ет отс­ туп. Ре­дакт­ ор не бу­дет рас­по­знав­ ать этот кон­текст, по­ ка не бу­дет на­бра­на по­след­няя «e» в сло­ве else. Пра­вил­ а син­такс­ и­са cinkeys. Каж­дое опр­ е­де­лен­ ие cinkeys сос­ то­ит из нео­ бя­за­тельн­ ог­ о пре­фик­са (!, * или 0) и клав­ иш­ и, для ко­тор­ ой пер­ ес­ чи­ тыв­ ае­ тс­ я от­ступ. Преф­ ик­сы имею­ т сле­дующ­ ие знач­ ен­ ия: ! Ука­зыв­ а­ет на клав­ и­шу (по умол­ча­нию CTRL-F), зас­ тав­ляющ­ ую Vim пер­ е­счи­тыв­ ать отс­ туп те­ку­щей строк­ и. Мож­но до­бав­лять доп­ ол­ни­ тельн­ ое оп­ред­ ел­ ен­ ие кла­виш­ и как ко­манд­ ы (исп­ оль­зуя +=), не от­ме­ няя пре­доп­ ред­ ел­ ен­ных ко­манд. Дру­гим­ и сло­вам­ и, можн­ о за­дав­ ать нес­ кольк­ о кла­виш, пе­ре­счит­ ы­ваю­щих отс­ туп строк­ и. Люб­ ая клав­ и­ ша, до­бав­ленн­ ая в опр­ е­де­лен­ ие !, бу­дет вып­ ол­нять и ста­рую функц­ ию. * Пред­пи­сыв­ ае­ т Vim пе­рес­ чит­ ать отс­ туп тек­ ущ­ ей строк­ и пер­ ед тем, как вста­ить симв­ ол. 0 Ус­тан­ ав­лив­ ае­ т конт­ екст на­ча­ла стро­ки. Клав­ иш­ а, кот­ ор­ ую вы про­ пиш­ ит­ е по­сле 0, бу­дет вы­зы­вать пер­ ес­ чет отс­ туп­ а, толь­ко ес­ли она буд­ ет пер­вым симв­ о­лом в стро­ке. Нуж­но пон­ и­мать отл­ ич­ ие в Vim и vi меж­ду «перв­ ым симв­ ол­ ом стро­ ки» и «перв­ ым столб­цом стро­ки». Мы уже зна­ем, что ввод ^ пе­ре­ме­ ща­ет кур­сор на пер­вый симв­ ол в строк­ е, но не обя­за­тель­но на пер­ вый стол­бец (по лев­ ом­ у краю); то же от­но­сит­ся к встав­ке с I. Точн­ о так же пре­фикс 0 при­ме­няе­ т­ся к ввод­ у симв­ ол­ а как пер­вог­ о в стро­ ке нез­ ав­ и­сим­ о от то­го, вы­ров­нен он по лев­ ом­ у краю или нет.

Автоматические и умные отступы 289cinkeys исп­ ольз­ у­ет спец­ иа­ льн­ ые наз­ ва­ния клав­ иш и дае­ т возм­ ожн­ остьзад­ ей­ств­ ов­ ать лю­бой из за­рез­ ер­ви­ро­ванн­ ых симв­ о­лов, нап­ рим­ ер, ис­поль­зуе­мых в  ка­чес­ т­ве пре­фик­сов. У  спец­ иа­ льн­ ых кла­виш есть сле­дую­щие опц­ ии:<> Эта форм­ а исп­ ольз­ уе­ тс­ я для опр­ ед­ е­ле­ния симв­ о­лов бу­к­вальн­ о. Для нек­ о­тор­ ых неп­ еч­ а­тае­мых симв­ ол­ ов ис­польз­ уйт­ е их «по­бу­кв­ ен­ные» пред­ставл­ е­ния. На­прим­ ер, с по­мощ­ ью <:> можн­ о опр­ ед­ ел­ ить симв­ ол «:». Дру­гой пример – неп­ еч­ а­тае­мый симв­ ол «стрелк­ а вверх», оп­ре­де­ ляем­ ый как <Up>.^ Ка­рет­ка (^) ис­польз­ уе­ тс­ я для обо­знач­ е­ния управ­ляю­щег­ о симв­ о­ла. Нап­ ри­мер, ^F оп­ред­ ел­ я­ет клав­ иш­ у CTRL-F.o, O, e, : Мы уже го­вор­ ил­ и об этих клав­ иш­ ах в ка­чес­ т­ве зна­че­ний cinkeys по умол­чан­ ию.=word, =~word Исп­ ольз­ уе­ тс­ я для опр­ ед­ е­лен­ ия сло­ва, вы­зы­ваю­ще­го спе­ци­аль­ное по­ве­де­ние. Есл­ и симв­ ол­ ы, явл­ яющ­ ие­ся нач­ альн­ ым тек­стом в стро­ ке, со­от­ветс­ т­ву­ют word, Vim пер­ е­счит­ ы­ва­ет отс­ туп. Форм­ а =~word анал­ ог­ ичн­ а =word, тольк­ о она иг­нор­ и­ру­ет ре­гистр. К со­жа­ле­нию, терм­ ин «слов­ о» (word) исп­ ольз­ у­етс­ я здесь не­вер­но. Пра­виль­нее го­во­рить, что word предс­ тавл­ я­ет на­ча­ло сло­ва, так как пер­ е­клю­че­ние прои­ сх­ од­ ит при совп­ а­де­нии строк­ и со «слов­ ом», при­ чем ко­нец обр­ аз­ца для сравн­ е­ния мож­ ет не совп­ а­дать с конц­ ом сло­ ва. Во встро­енн­ ой до­кум­ ен­тац­ ии Vim при­вод­ ит­ся прим­ ер слов­ а end, со­отв­ ет­ст­вую­щег­ о как end, так и endif.Опция cinwordscinwords оп­ре­де­ля­ет ключ­ ев­ ые сло­ва, кот­ ор­ ые, буд­ у­чи на­бран­ным­ и,включ­ а­ют доп­ ол­нит­ ель­ный отс­ туп у след­ ую­щей стро­ки. По умолч­ ан­ июэта оп­ция сод­ ерж­ ит: if,else,while,do,for,switchЭти слов­ а ох­ват­ ы­ва­ют стан­дартн­ ые клю­че­вые сло­ва в язы­ке програм-мирования C. Эти клю­чев­ ые слов­ а зав­ и­сят от рег­ и­стр­ а. При так­ ой пров­ ерк­ е Vim да­же игн­ о­рир­ у­ет оп­цию ignorecase. Есл­ и вам нуж­ны вар­ иа­ н­ты с раз­ лич­ны­ми ре­ги­стр­ ам­ и в  ключ­ ев­ ых слов­ ах, при­дет­ся проп­ ис­ ать в строк­ е cinwords все возм­ ожн­ ые комб­ ин­ ац­ ии.

290 Глава 14. Улучшения Vim для программистов Опция cinoptions cinoptions управл­ яе­ т расс­ та­нов­кой Vim отс­ ту­пов строк с учет­ ом конт­ ек­ ста C. Дан­ная оп­ция вклю­чае­ т ус­тан­ ов­ки для управ­ле­ния нес­ коль­ким­ и станд­ ар­там­ и фор­ма­тир­ о­ва­ния ко­да, на­прим­ ер: • Вел­ ич­ ин­ ой отс­ ту­па про­граммн­ ог­ о блок­ а, зак­ лю­чен­но­го в фиг­ ур­ные скобк­ и. • Не­об­хо­дим­ о­стью встав­ки но­вой стро­ки пе­ред фиг­ урн­ ой скобк­ ой, стоя­щей по­сле ус­ловн­ о­го опе­рат­ о­ра. • Спо­со­бом выр­ ав­нив­ ан­ ия прог­ раммн­ ых блок­ ов от­нос­ ит­ ель­но обр­ ам­ ляю­щих их ско­бок. В ва­ри­ант­ е по умол­чан­ ию cinoptions оп­ре­де­ля­ет 28 ус­тан­ о­вок: s,e0,n0,f0,{0,}0,^0,:s,=s,l0,b0,gs,hs,ps,ts,is,+s,c3,C0,/0,(2s,us,U0,w0,W0, m0,j0,)20,*30 Уже сам пер­ е­чень этих ва­риа­ нт­ ов да­ет пред­ставл­ е­ние о ко­лич­ е­ств­ е спо­ соб­ ов зад­ ан­ ия прав­ ил отс­ ту­пов в Vim. Больш­ ая часть на­строе­ к cin­op­ti­ ons опр­ е­де­ля­ет разл­ и­чия в конт­ екс­ т­ных бло­ках. В не­кот­ о­рых на­строй­ ках зад­ ае­ тс­ я, нас­ коль­ко да­ле­ко не­обх­ о­ди­мо скан­ ир­ ов­ ать (сколь­ко строк файл­ а вверх и вниз нуж­но пройт­ и) для уст­ ан­ ов­ки пра­виль­но­го кон­тек­ ста и выч­ ис­ле­ния отс­ ту­пов без ошиб­ ок. Ус­тан­ ов­ки, ме­няю­щие кол­ и­че­ст­во от­ступ­ ов для раз­личн­ ых кон­текс­ тов, мог­ ут увел­ ич­ и­вать или уменьш­ ать уров­ни отс­ ту­пов. Кром­ е то­го, мож­но пер­ ео­ п­ред­ е­лять кол­ ич­ ес­ тв­ о столб­цов, ис­польз­ уем­ ых в  отс­ ту­пах. На­ прим­ ер, уст­ ан­ овк­ а cinoptions=f5 прив­ од­ ит к  том­ у, что от­кры­ваю­щая фиг­ урн­ ая скобк­ а ({) бу­дет отс­ туп­ ать на пять столбц­ ов, ес­ли тольк­ о она не расп­ ол­ аг­ а­ет­ся внутр­ и друг­ их скоб­ ок. Дру­гой спос­ об опр­ е­дел­ ить увел­ ич­ ен­ ие отступов за­клю­чае­ т­ся в ис­поль­ зо­ван­ ии не­кот­ ор­ о­го мно­жи­тел­ я (он необяз­ ат­ ель­но дол­жен быть цел­ ым числ­ ом) для shiftwidth. Ес­ли в пред­ ы­дущ­ ем при­ме­ре прип­ и­сать в опр­ е­ дел­ е­ние w (то есть cinoptions=f5w), то от­крыв­ ающ­ ая фи­гур­ная скобк­ а сме­ститс­ я на пять shiftwidth. Для изм­ е­не­ния уров­ня от­сту­пов в  меньш­ ую сто­ро­ну (отр­ и­ца­тельн­ ый от­ступ) вставь­те знак мин­ ус (-) пер­ ед чи­сло­вым знач­ е­ни­ем. Опц­ ию cinoptions и ее стро­ков­ ое знач­ ен­ ие нужн­ о ме­нять с особ­ ой ос­ тор­ ож­но­стью. Не за­быв­ айт­ е, что при исп­ оль­зо­ван­ ии = вы пер­ ео­ п­ре­ дел­ ит­ е всю оп­цию. Так как cinoptions со­держ­ ит множ­ ес­ тв­ о всев­ оз­ можн­ ых ус­тан­ ов­ ок, для ее из­мен­ ен­ ия ис­польз­ уйт­ е ко­манд­ ы: += для до­бавл­ е­ния па­ра­метр­ а, -= для уда­ле­ния су­ще­ст­вую­щег­ о пар­ а­мет­ра, а для из­ме­нен­ ия сущ­ ес­ тв­ ую­ще­го – -=, за которым следует +=. Дал­ ее след­ у­ет кратк­ ий спи­сок опц­ ий, кот­ ор­ ые вам, возм­ ожн­ о, зах­ о­чет­ ся пом­ е­нять. Это мал­ ое подм­ но­жес­ тв­ о ус­та­но­вок в  cinoptions. Мног­ ие чит­ ат­ ел­ и мог­ ут за­хот­ еть исп­ ольз­ ов­ ать друг­ ие (или даж­ е все) оп­ции для свои­ х на­строе­ к.

Автоматические и умные отступы 291>n (по умол­ча­нию s) Люб­ ая строк­ а с отс­ ту­пом долж­на быть сдви­ну­та на n столб­цов. По умол­чан­ ию стои­ т s, то есть по умол­ча­нию от­ступ стро­ки ра­вен од­но­ му shiftwidth.fn, {n f опр­ е­дел­ я­ет, нас­ коль­ко дал­ е­ко нужн­ о став­ ить отс­ туп у отк­ ры­ваю­ щей нев­ ло­жен­ной фи­гур­ной скобк­ и ({). По умол­чан­ ию стои­ т ноль, то есть скоб­ка выр­ авн­ ив­ ае­ т­ся по свое­ му лог­ и­че­ском­ у «со­брат­ у». На­ при­мер, фи­гурн­ ая скобк­ а, стоящ­ ая по­сле строк­ и с опе­ра­тор­ ом while, пом­ е­ща­ет­ся под бу­к­вой «w» в слов­ е while. { ве­дет себ­ я ана­лог­ ичн­ о f, но при­мен­ яе­ т­ся и к вло­жен­ным фиг­ ур­ным скоб­кам. Здесь знач­ ен­ ие по умол­ча­нию соо­ т­вет­ств­ у­ет ну­лев­ ом­ у от­ ступ­ у. На рис. 14.14 и 14.15 пок­ аз­ ан один и тот же текст в Vim, но в пер­вом слу­чае cinoptions=s,f0,{0, а во втором cinoptions=s,fs,{s. В обо­их при­ ме­рах опц­ ия shiftwidth име­ет зна­чен­ ие 4 (чет­ ы­ре столбц­ а). Рис. 14.14. cinoptions=s,f0,{0 Рис. 14.15. cinoptions=s,fs,{s}n Эта ус­тан­ овк­ а ис­поль­зуе­ т­ся, что­бы оп­ред­ ел­ ить смещ­ е­ние за­кры­ваю­ щей фи­гур­ной скоб­ки (}) по от­но­шен­ ию к  соо­ т­вет­ст­вую­щей отк­ ры­ вающ­ ей. По умол­чан­ ию стои­ т ноль (то есть скоб­ки выр­ овн­ е­ны отн­ о­ си­тельн­ о друг друг­ а).^n Доб­ авл­ я­ет n к тек­ у­щем­ у от­ступ­ у внут­ри на­бо­ра скоб­ ок ({…}), ес­ли от­ кры­ваю­щая скобк­ а нах­ од­ ит­ся в пер­вом столб­це.

292 Глава 14. Улучшения Vim для программистов :n, =n, bn Эти три уст­ ан­ ов­ки кон­трол­ ир­ ую­ т отс­ туп­ ы в опер­ ат­ о­рах case. С по­мо­ щью : Vim ста­вит отс­ туп у ме­ток рав­ным n сим­во­лов по отн­ ош­ е­нию к  со­от­ветс­ т­вующ­ ем­ у опер­ ат­ ор­ у switch. Знач­ е­ние по умолчанию – один shiftwidth. Уст­ ан­ овк­ а = оп­ре­дел­ яе­ т сме­щен­ ие для строк код­ а от со­отв­ етс­ тв­ ующ­ ей им мет­ки. По умол­чан­ ию опер­ ат­ ор­ ы от­сту­паю­ т на один shiftw­idth. b за­да­ет ме­сто ус­тан­ овк­ и опе­ра­то­ров break. Знач­ ен­ ие по умол­ча­нию (ноль) выр­ ав­нив­ а­ет break с ост­ аль­ны­ми опер­ ат­ ор­ ам­ и в со­от­вет­ств­ ую­ щем блок­ е case. Люб­ ое не­нул­ е­вое зна­чен­ ие выр­ авн­ ив­ ае­ т break с со­от­ вет­ств­ ующ­ ей мет­кой. )n, *n Эти две ус­та­новк­ и пе­ред­ аю­ т Vim кол­ ич­ е­ств­ о строк, кот­ о­рые нуж­но скан­ ир­ ов­ ать при по­ис­ке нез­ а­крыт­ ой круг­лой скоб­ки (20 строк по умол­ча­нию) и нез­ ак­ ры­тых комм­ ент­ а­рие­ в (по умол­ча­нию 30 строк), со­от­ветс­ т­вен­но. Эти два пар­ ам­ ет­ра, предп­ ол­ аг­ а­етс­ я, долж­ны ог­ран­ и­чить объе­ м ра­ бо­ты Vim при пои­ с­ке совп­ а­де­ний. При ра­бо­те на сов­ ре­менн­ ых мощ­ ных комп­ ью­ ­тер­ ах мож­но по­дум­ ать об увел­ ич­ е­нии этих зна­че­ний, обес­печ­ и­вая больш­ ий объе­ м по­иск­ а со­от­ветс­ т­вий комм­ ент­ а­ри­ям и скобк­ ам. Для нач­ ал­ а по­проб­ уй­те удв­ ои­ ть каж­дое знач­ е­ние до 40 и 60 соо­ т­ветс­ тв­ ен­но.indentexpr Бу­ду­чи оп­ре­де­лен­ной, оп­ция indentexpr от­мен­ я­ет дейс­ тв­ ие cindent, так что мо­же­те оп­ред­ е­лять пра­вил­ а прос­ тав­лен­ ия от­сту­пов и под­страив­ ать их под ваш язык про­грамм­ ир­ ов­ ан­ ия. indentexpr опр­ ед­ ел­ я­ет вы­ра­жен­ ие, вы­чис­ляе­мое кажд­ ый раз при созд­ а­ нии но­вой строк­ и в файл­ е. Это выр­ а­же­ние опр­ е­дел­ яе­ т це­лое числ­ о, ко­ то­рое Vim ис­поль­зуе­ т для за­дан­ ия отс­ ту­па нов­ ой строк­ и. Кро­ме то­го, опц­ ия indentkeys поз­ во­ля­ет оп­ред­ е­лять по­лез­ные ключ­ е­вые слов­ а анал­ о­гич­но клю­че­вым слов­ ам в cinkeys, за­дающ­ им стро­ки, пос­ ле ко­тор­ ых от­ступ пе­ре­счи­ты­вае­ тс­ я. Пло­хая нов­ ость зак­ лю­чае­ т­ся в том, что зап­ ис­ ать поль­зов­ ат­ ель­ские пра­ вил­ а про­став­ле­ния отс­ туп­ ов с нуля – нет­ рив­ иа­ ль­ная за­дач­ а для лю­бог­ о язы­ка. Хо­ро­шая же со­стои­ т в том, что, ско­рее все­го, эта раб­ о­та уже про­ де­ла­на. Пос­ мот­рит­ е в  кат­ ал­ ог $VIMRUNTIME/indent и  пров­ ерь­те, есть ли там ваш лю­би­мый язык. На се­го­дняш­ний день там со­дер­жит­ся око­ло 70 фай­лов с пра­вил­ ам­ и от­ступ­ ов. В них предс­ тав­ле­ны сам­ ые поп­ ул­ яр­ные язы­ки про­грамм­ ир­ о­ва­ния, та­ кие как ada, awk, docbook (файл на­зы­ва­етс­ я docbk), eiffel, fortran, html, java, lisp, pascal, perl, php, python, ruby, scheme, sh, sql и zsh. Есть даж­ е файл, опр­ е­дел­ ен­ный для xinetd!
















Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook