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

Многооконное редактирование 151 Под­свет­ка синт­ акс­ и­са В elvis, Vim и vile мож­но сдел­ ать так, чтоб­ ы отд­ ель­ные част­ и файл­ а ото­бра­жал­ ись в разн­ ых цве­тах и шрифт­ ах. Это особ­ ен­но удоб­но при ред­ ак­ти­ро­ван­ ии про­граммн­ о­го ко­да.Многооконное редактирование Возм­ ожн­ о, сам­ ое важ­ное улуч­шен­ ие станд­ арт­но­го vi, пред­ ост­ авл­ яе­мое его модификациями, – это спо­соб­ность ред­ акт­ ир­ о­вать фай­лы в  не­ скольк­ их ок­нах. Оно по­звол­ я­ет лег­ко пра­вить сра­зу нес­ кольк­ о фай­лов и «вы­рез­ ать и вставл­ ять» текст из одн­ о­го файл­ а в дру­гой по­сред­ств­ ом ко­пи­ров­ ан­ ия и вставк­ и. В  кло­нах не обя­за­тель­но разд­ ел­ ять экр­ ан, чтоб­ ы коп­ ир­ ов­ ать и встав­лять текст меж­ду файл­ а­ми. Толь­ко ориг­ ин­ аль­ный vi очи­ща­ ет бу­фе­ры для хра­не­ния фрагм­ ент­ ов текс­ та при пер­ е­ключ­ е­нии меж­ ду фай­ла­ми. В  кажд­ ом ре­дакт­ о­ре сущ­ е­ст­вую­ т две осн­ овн­ ые кон­цеп­ции, ле­жа­щие в осн­ ов­ е реа­лиз­ а­ции мног­ о­окон­но­сти: бу­фе­ры и ок­на. В бу­фер­ е сод­ ерж­ итс­ я ред­ акт­ ир­ уе­мый текст. Он мо­жет быть взят из фай­ ла или быть со­верш­ енн­ о нов­ ым, ко­тор­ ый нуж­но буд­ ет зап­ и­сать в файл. Кажд­ о­му файл­ у со­отв­ ет­ст­ву­ет тольк­ о один свя­зан­ный с ним буф­ ер. Окн­ о обесп­ еч­ ив­ а­ет про­смотр бу­фер­ а, по­звол­ яя ви­деть и из­мен­ ять сод­ ер­ жа­щий­ся в нем текст. С одн­ им бу­фе­ром мо­жет быть свя­зан­ о не­скольк­ о окон. Изм­ е­не­ния, сде­ланн­ ые в  бу­фер­ е в  од­ном из окон, от­ра­жаю­ тс­ я и  в  друг­ их окн­ ах, в  ко­то­рых от­крыт этот бу­фер. С  буф­ е­ром мо­жет не быть свя­за­но ни одн­ о­го ок­на. В этом случ­ ае с ним ни­че­го нельз­ я де­лать, раз­ве что от­крыть его в ок­не позж­ е. Ес­ли зак­ рыть пос­ лед­нее из окон, связ­ ан­ных с  не­кот­ ор­ ым буф­ ер­ ом, то «за­крое­ т­ся» и  файл. Ес­ли буф­ ер был из­мен­ ен, но не сох­ ра­нен на диск, то ред­ акт­ ор мож­ ет за­пре­тить (или не зап­ ре­тить) зак­ рыть пос­ ледн­ ее связ­ анн­ ое с ним ок­но. При соз­да­нии нов­ ог­ о окн­ а ре­дакт­ ор разд­ ел­ я­ет тек­ ущ­ ий эк­ран. В боль­ шинс­ тв­ е про­грамм в но­вом окн­ е вы уви­дит­ е ре­дакт­ и­руем­ ый файл. По­ сле это­го мож­но пер­ е­ключ­ итьс­ я в  ок­но, где вы хот­ и­те ре­дакт­ и­ро­вать друг­ ой файл, и дать ред­ акт­ ор­ у ко­ман­ду о пер­ ех­ о­де к ре­дак­ти­ров­ ан­ ию файл­ а в этом ок­не. Кажд­ ый ре­дакт­ ор пре­дос­тавл­ яе­ т дост­ уп к ком­ анд­ ам vi и  ex для пер­ ем­ ещ­ ен­ ия по ок­нам впер­ ед и  наз­ ад, а  так­же поз­ во­ляе­ т ме­нять раз­мер окон, скрыв­ ать и пок­ аз­ ы­вать их. О  мног­ оо­ конн­ ом ре­дак­тир­ ов­ а­нии в  Vim рас­ска­зывается в  глав­ е  11. В каж­дой из глав част­ и III, по­свя­щенн­ ой оче­редн­ ом­ у ре­дак­тор­ у, мы по­ каж­ ем при­мер­ ы раз­дел­ ен­ ия экр­ ан­ а (на прим­ е­ре одн­ их и  тех же двух фай­лов) и рас­ска­жем, как разб­ ить эк­ран и пер­ ем­ ещ­ атьс­ я меж­ду ок­на­ ми.

152 Глава 8. Представляем клоны viГрафические интерфейсы У elvis, Vim и vile есть верс­ ии с граф­ ич­ ес­ ким­ и поль­зо­ва­тель­ским­ и ин­ терф­ ей­са­ми (GUI), даю­щие все преи­ му­щес­ тв­ а раст­ ров­ ых эк­ра­нов и мы­ ши. Кром­ е подд­ ерж­ки X Window в UNIX подд­ ер­жив­ аю­ тс­ я так­же Mic­ ro­soft Windows и  друг­ ие оконн­ ые сист­ ем­ ы. В  табл.  8.1 пе­ре­числ­ ен­ ы GUI, дос­туп­ные для разн­ ых мо­диф­ ик­ ац­ ий vi. Таб­лиц­ а 8.1. Дост­ упн­ ые GUI Ред­ ак­ Тер­ми­ X11 Microsoft OS/2 BeOS Macin­ Amiga QNX OpenVMS тор нал Windows tosh Vim • •• •• • • nvi • elvis • •• • vile • •• •• ••Расширенные регулярные выражения Мет­ ас­ имв­ ол­ ы, дост­ упн­ ые в  vi при пои­ с­ке и  за­мен­ е пос­ редс­ т­вом ре­гу­ ляр­ных вы­ра­жен­ ий, опи­са­ны ра­нее в глав­ е 6 в разд­ е­ле «Ме­та­симв­ о­лы, исп­ ольз­ уем­ ые при по­иск­ е по шабл­ о­ну» на стр. 95. Во всех мо­диф­ и­кац­ и­ ях vi есть разновидности рас­шир­ ен­ных ре­гул­ яр­ных вы­ра­же­ний, кот­ о­ рые ли­бо опц­ ио­наль­ны, ли­бо дос­туп­ны все­гда. Как пра­ви­ло, они иден­ тичн­ ы (или поч­ти идент­ ич­ны) ана­ло­гам из про­грамм­ ы egrep. К сож­ а­ле­ нию, разн­ ов­ идн­ ос­ ти рас­шир­ енн­ ых вы­раж­ е­ний в раз­ных мод­ иф­ ик­ а­ци­ ях vi нес­ кольк­ о от­лич­ а­ют­ся. Что­бы по­ка­зать возм­ ожн­ о­сти рас­шир­ енн­ ых рег­ ул­ яр­ных вы­ра­жен­ ий, пред­став­ им их на прим­ е­ре nvi. Разд­ ел «Расш­ ир­ енн­ ые рег­ ул­ яр­ные вы­ ра­жен­ ия» на стр. 198 опи­сы­ва­ет рас­ши­ренн­ ые ре­гул­ ярн­ ые вы­раж­ ен­ ия Vim, а глав­ ы част­ и III, пос­ вя­щен­ные мо­диф­ ик­ а­ци­ям vi, так­же опи­сы­ ва­ют синт­ акс­ ис­ ы расш­ и­ренн­ ых ре­гул­ яр­ных вы­ра­же­ний со­от­ветс­ тв­ ую­ щих ре­дакт­ о­ров, прич­ ем при­мер­ ы не по­втор­ я­ют­ся. Сог­ лас­но станд­ арт­ у POSIX, расш­ и­рен­ные рег­ ул­ яр­ные вы­ра­же­ния nvi на­зы­ваю­ тс­ я Extended Regular Expressions (ERE). Что­бы включ­ ить их, восп­ ольз­ уйт­ есь ком­ анд­ ой set extended либ­ о в фай­ле .nexrc, либ­ о из при­ гла­ше­ния ex. Кром­ е стан­дартн­ ых ме­та­симв­ о­лов, опи­сан­ных в  гла­ве  6, и  скоб­ко­вых выр­ а­жен­ ий POSIX, про ко­то­рые мы упом­ ин­ ал­ и в разд­ е­ле «Вы­ра­жен­ ия в скобк­ ах в стан­дар­те POSIX» на стр. 97 той же глав­ ы, здесь дост­ уп­ны сле­дующ­ ие ме­та­симв­ ол­ ы: | Раз­дел­ я­ет нес­ коль­ко воз­мож­ных ва­риа­ нт­ ов. Нап­ ри­мер, a|b со­отв­ етс­ т­ вуе­ т или a, или b. Одн­ ак­ о этот ме­тас­ им­вол не огр­ ан­ ич­ и­ва­етс­ я один­ оч­ ным­ и зна­кам­ и: house|home соо­ т­вет­ст­ву­ет ли­бо слов­ у house, либ­ о home.

Расширенные регулярные выражения 153 (...) Ис­поль­зуе­ тс­ я для созд­ а­ния групп­ ы, к ко­тор­ ой пот­ ом мож­но при­ме­ нять друг­ ие опе­рат­ ор­ ы рег­ ул­ ярн­ ых вы­раж­ ен­ ий. На­при­мер, house|home мож­но сок­ ра­тить (ес­ли не упр­ о­стить) до ho(use|me). Опер­ ат­ ор * мож­но прим­ ен­ ять к  тек­сту в  скобк­ ах: (house|home)* соо­ тв­ етс­ т­ву­ет home, home­house, househomehousehouse и т. д. При включ­ ен­ной опц­ ии extended текст, сгруп­пи­ро­ванн­ ый скобк­ ам­ и, вед­ ет себ­ я ана­ло­гич­но текс­ ту, за­клю­чен­но­му меж­ду \(...\) в  обыч­ ном vi: стро­ка, со­отв­ ет­ст­вующ­ ая совп­ а­ден­ ию, мо­жет быть вос­про­из­ вед­ е­на в час­ти зам­ ен­ ы в ко­манд­ е под­ста­нов­ки с пом­ ощ­ ью /1, /2 и т. д. В  этом случ­ ае для ввод­ а обычн­ ой от­кры­ваю­щей скобк­ и без спе­ци­ аль­ног­ о зна­че­ния исп­ ольз­ ую­ тс­ я симв­ ол­ ы \(.+ Соо­ т­ветс­ тв­ у­ет од­но­му или не­скольк­ им пред­ше­ств­ ующ­ им ре­гул­ яр­ ным выр­ а­же­ни­ям. Это мож­ ет быть либ­ о один­ очн­ ый симв­ ол, ли­бо групп­ а симв­ ол­ ов, за­ключ­ енн­ ых в скоб­ки. Обр­ ат­ ит­ е вним­ а­ние на раз­ лич­ ия меж­ду + и *. Сим­вол * мо­жет оз­на­чать пуст­ ое мес­ то, а у + долж­ но быть хо­тя бы од­но совп­ ад­ ен­ ие. На­при­мер, ho(use|me)* со­от­ветс­ тв­ у­ ет ho, равн­ о как и home, и house, но ho(use|me)+ не со­отв­ етс­ т­ву­ет ho.? Обо­зна­ча­ет ноль или одн­ о вхо­ж­де­ние пред­шес­ т­вую­ще­го ре­гул­ яр­но­ го вы­раж­ ен­ ия. Так можн­ о указ­ ать на «не­обяз­ а­тельн­ ый» текст, ко­то­ рый мож­ ет при­сутс­ тв­ ов­ ать, а мо­жет и нет. Нап­ рим­ ер, free?d соо­ т­вет­ ств­ у­ет и fred, и freed.{...} Опр­ ед­ е­ляе­ т инт­ ерв­ альн­ ое выр­ аж­ е­ние. Инт­ ер­вальн­ ое вы­раж­ е­ние опи­сыв­ а­ет счетн­ ое чис­ло по­вто­рен­ ий. В сле­дующ­ их опис­ а­ни­ях n и m обо­знач­ аю­ т це­лые числ­ а: {n} Обо­знач­ ае­ т ров­но n по­втор­ ен­ ий пре­ды­дущ­ ег­ о ре­гул­ ярн­ ог­ о выр­ а­ жен­ ия. На­прим­ ер, (home|house){2} со­от­ветс­ т­ву­ет homehome, home­ house, househome, househouse и боль­ше ни­чем­ у. {n,} Соо­ тв­ ет­ст­вуе­ т n или бо­лее пов­ то­рен­ ия­ м пред­ ы­дущ­ е­го рег­ ул­ ярн­ о­ го вы­раж­ ен­ ия. Мож­но счи­тать, что эта ком­ анд­ а зад­ а­ет «как ми­ ним­ ум n» по­вто­ре­ний. {n,m} Со­отв­ ет­ст­вуе­ т числ­ у по­втор­ ен­ ий от n до m. Огр­ а­нич­ ен­ ие важн­ о, так как оно оп­ред­ ел­ яе­ т, сколь­ко имен­но текс­ та за­ме­нит­ся ком­ ан­ дой под­стан­ овк­ и1.1 Опе­рат­ ор­ ы *, + и ? мож­но свес­ ти к {0,}, {1,} и {0,1} со­отв­ ет­ств­ ен­но, но ис­поль­ зов­ ать перв­ ые гор­ азд­ о удобн­ ее. Кро­ме тог­ о, с точк­ и зрен­ ия ис­то­рии UNIX ин­тер­вальн­ ые выр­ аж­ е­ния был­ и вве­ден­ ы в обр­ а­щен­ ие поз­же.

154 Глава 8. Представляем клоны vi Ес­ли опц­ ия extended не ус­та­нов­лен­ а, то эта же функц­ ия реа­ли­зуе­ тс­ я в nvi при пом­ о­щи \{ и \}.Улучшенные теги Про­грам­ма «Exuberant ctags» – это разн­ о­видн­ ость ctags, спо­соб­ная сде­ лать на­мног­ о больш­ е, чем ctags в UNIX. Она соз­дае­ т файл tags рас­ши­ ренн­ ог­ о форм­ а­та, кот­ ор­ ый дел­ ае­ т проц­ есс пои­ ск­ а по тег­ ам бо­лее гиб­ким и мощ­ным. Мы опиш­ ем вер­сию Exuberant пер­вой, так как она под­дер­ жи­ва­ет­ся больш­ ин­ст­вом мод­ иф­ и­ка­ций vi. В этом раз­де­ле так­же опис­ а­ны стек­ и тег­ ов, поз­ вол­ яю­щие со­хран­ ять не­ сколь­ко по­сещ­ енн­ ых с пом­ о­щью ко­манд :tag или ^] поз­ иц­ ий в фай­лах. Сте­ки те­гов подд­ ерж­ ив­ а­ют­ся во всех раз­нов­ ид­нос­ тях vi.Exuberant ctags Про­грам­ма Exuberant ctags бы­ла созд­ ан­ а Дар­ре­ном Хи­берт­ ом (Darren Hiebert) и на мом­ ент нап­ и­сан­ ия этой кни­ги выш­ ла в верс­ ии 5.71. Ее до­ машн­ яя страница – http://ctags.sourceforge.net/. Сле­дую­щий спис­ ок воз­ можн­ о­стей прог­ рамм­ ы взят из файл­ а README ди­ст­риб­ у­тив­ а ctags: • Ге­нер­ ац­ ия тег­ ов для всех тип­ ов син­такс­ и­че­ских элем­ ент­ ов язы­ков C и C++, вклю­чая на­зван­ ия класс­ ов, опр­ ед­ ел­ е­ния макр­ ос­ ов, на­зван­ ия пер­ е­числ­ ен­ ий (enum), пе­ре­числ­ яе­мые зна­чен­ ия (то, что нах­ од­ ит­ся внутр­ и enum), опр­ е­дел­ ен­ ия функ­ций (ме­тод­ ов), объя­ вл­ ен­ ия/прот­ о­ тип­ ы функц­ ий (ме­то­дов), чле­ны структ­ ур и пол­ я клас­сов, наз­ ван­ ия струк­тур (struct), оп­ре­дел­ е­ния тип­ ов (typedef), имен­ а объе­ дин­ е­ний (union) и пер­ е­менн­ ых. Уфф! • Под­держ­ка ко­да C и C++. • Так­же под­дер­жи­ва­ют­ся 29 дру­гих язы­ков, включ­ ая C# и Java. • Прог­ рам­ма очень уст­ ой­чив­ а при ана­ли­зе код­ а, и ее го­раз­до слож­нее одур­ а­чить ко­дом, со­дер­жащ­ им дир­ ект­ ив­ ы преп­ роц­ есс­ о­ра #if. • Воз­можн­ ость ее ис­польз­ ов­ ан­ ия для расп­ еч­ а­ты­ва­ния чит­ аб­ ельн­ ог­ о спис­ ка вы­бран­ных объ­ект­ ов, обн­ ар­ уж­ енн­ ых в исх­ од­ном ко­де. • Под­держ­ка ген­ ер­ а­ции файл­ ов тег­ ов в сти­ле GNU Emacs (etags). • Раб­ о­та под Amiga, Cray, MS-DOS, Macintosh, OS/2, QDOS, QNX, RISC OS, UNIX, VMS и Windows вер­сий от 95 до XP. На веб-­сай­те дос­туп­ ны нек­ от­ ор­ ые скомп­ ил­ ир­ ов­ анн­ ые би­нар­ные файл­ ы. Exuberant ctags ге­нер­ и­ру­ет фай­лы tags в форм­ а­те, кот­ ор­ ый мы опиш­ ем ниж­ е. 1 На мо­мент под­гот­ овк­ и русс­ кояз­ ыч­ног­ о из­дан­ ия – 5.8. – Прим. на­уч. ред.

Улучшенные теги 155Новый формат тегов Как прав­ ил­ о, файл tags имее­ т три пол­ я, отд­ е­лен­ные друг от дру­га та­бу­ ляц­ и­ей: имя тег­ а (обычн­ о это идент­ иф­ ик­ ат­ ор), ис­ход­ный файл, сод­ ер­ жащ­ ий тег, и указ­ а­ние, где иск­ ать идент­ иф­ ик­ а­тор. Это ука­за­ние мо­жет быть ли­бо про­стым ном­ ер­ ом стро­ки, либ­ о пои­ с­ков­ ым шабл­ о­ном, со­от­ ветс­ тв­ ующ­ им уст­ а­новл­ ен­ной опц­ ии vi nomagic и  зак­ лю­чен­ным межд­ у об­рат­ным­ и ко­сым­ и чер­там­ и или зна­кам­ и во­про­са. Кром­ е то­го, файл tags всег­ да отс­ орт­ и­ров­ ан. Этот форм­ ат ге­не­ри­руе­ тс­ я про­грамм­ ой UNIX ctags. Фак­тич­ е­ски мног­ ие вер­сии vi прин­ им­ а­ли в пол­ е пои­ с­ко­во­го шабл­ он­ а лю­бую ко­манд­ у (зияю­ щая дыр­ а в  без­опасн­ о­сти). Бол­ ее тог­ о, име­лась не­до­кум­ ент­ и­ро­ванн­ ая осо­бенн­ ость: есл­ и строк­ а за­кан­чив­ а­лась точк­ ой с за­пят­ ой, пос­ ле кот­ о­ рой стоял­ и двойн­ ые кав­ ычк­ и (;\"), то весь текст по­сле этих сим­вол­ ов иг­ но­рир­ о­валс­ я (двой­ны­ми кав­ ычк­ ам­ и отк­ ры­ва­етс­ я комм­ ент­ а­рий, как в файл­ ах .exrc). Но­вый фор­мат име­ет обр­ атн­ ую со­вмест­ им­ ость с  трад­ и­цио­ нн­ ым. Пер­ вые три по­ля те же сам­ ые: тег, имя фай­ла и шаб­лон по­иск­ а. Exuberant ctags ген­ е­ри­руе­ т тольк­ о шабл­ о­ны по­иск­ а, а не про­изв­ ольн­ ые ком­ ан­ды. По­сле разд­ е­ли­тел­ я ;\" став­ ят­ся расш­ и­ренн­ ые атр­ и­бут­ ы. Кажд­ ый ат­ри­ бут отд­ ел­ ен от след­ ую­ще­го симв­ о­лом та­бу­ля­ции и со­держ­ ит два подп­ о­ ля, раз­дел­ ен­ных двоет­ о­чие­ м. Пер­вое подполе со­дер­жит ключ­ е­вое сло­ во, опи­сы­ваю­щее ат­риб­ ут, второе – его знач­ ен­ ие. В табл. 8.2 пер­ е­чис­ле­ ны подд­ ерж­ ив­ аем­ ые клю­че­вые сло­ва. Табл­ иц­ а 8.2. Ключ­ ев­ ые слов­ а в расш­ ир­ ен­ном ctagsКлю­че­вое сло­во Зна­че­ниеkind Значение – од­на бук­ ­ва, ука­зы­вающ­ ая на лекс­ ич­ ес­ кий тип тег­ а. Это мо­жет быть f для функ­ции, v для пер­ ем­ ен­ной и т. д. Пос­ коль­ку имен­ ем ат­риб­ ут­ а по умол­ча­нию яв­ляе­ т­ся kind, люб­ ая отд­ ель­ная бук­ ­ва мож­ ет обоз­ на­чать тип тег­ а (на­при­ мер, f для функц­ ии).file Для «ста­тич­ ес­ ких» (то есть ло­кальн­ ых для файл­ а) те­гов. Зна­че­ни­ем долж­но быть имя файл­ а. Ес­ли зна­чен­ ию прис­ вое­на пуст­ ая стро­ка (прос­ то file:), то счи­та­ет­ся, что оно совп­ а­да­ет со втор­ ым по­лем (имя фай­ла). Эта осо­бен­ность бы­ла до­бавл­ е­на от­час­ти для ком­пакт­нос­ ти и для обесп­ е­че­ния про­стог­ о спос­ о­ба под­держк­ и фай­лов tags, рас­пол­ о­женн­ ых не в тек­ у­щем ка­та­лог­ е. Знач­ е­ние по­ля, со­ дер­жа­ще­го имя фай­ла, всег­ да зад­ ае­ т­ся от­нос­ ит­ ель­но тог­ о кат­ а­лог­ а, где рас­по­лож­ ен сам файл tags.function Для лок­ аль­ных син­такс­ ич­ е­ских конс­ тр­ ук­ций. Значение – имя функ­ции, где они опр­ е­де­лен­ ы.struct Для пол­ ей в struct. Знач­ ен­ ие­ м слу­жит имя струк­тур­ ы.

156 Глава 8. Представляем клоны vi Таб­ли­ца 8.2 (продолжение) Ключ­ ев­ ое слов­ о Знач­ е­ние enum Для элем­ ент­ ов пер­ е­числ­ е­ний enum, где значение – имя пе­ре­ числ­ е­ния. class Для чле­нов-функц­ ий и член­ ов-пер­ е­мен­ных в C++. Значе- ние – имя класс­ а. scope Пред­на­знач­ ен­ о в осн­ ов­ном для член­ ов-функ­ций класс­ а C++. Обыч­но оно имее­ т зна­чен­ ие private для час­ т­ных за­кры­тых чле­нов или опус­ка­етс­ я для публ­ ич­ных член­ ов, чтоб­ ы поль­ зов­ ат­ ель мог огр­ а­нич­ ить по­иск те­гов толь­ко публ­ ич­ным­ и чле­на­ми. arity Для функц­ ий. Оп­ред­ е­ляе­ т чис­ло ее арг­ ум­ ент­ ов. Ес­ли пол­ е не со­держ­ ит двое­то­чия, то счи­тае­ т­ся, что оно отн­ о­сит­ся к ти­ пу kind. Прив­ ед­ ем при­ме­ры: ARRAYMAXED awk.h 427;\" d file: AVG_CHAIN_MAX array.c 38;\" d array.c array.c 1;\" F ARRAYMAXED – это макр­ ос C #define, опр­ е­де­лен­ный в awk.h. AVG_CHAIN_MAX – тож­ е макр­ ос C, но он ис­польз­ у­етс­ я тольк­ о в array.c. Тре­тья стро­ка не­ мног­ о друг­ ая: это тег для са­мо­го файл­ а исх­ одн­ о­го код­ а! Он ге­не­рир­ у­ет­ ся с  пом­ ощ­ ью опц­ ии -i F Exuberant ctags и  по­зво­ля­ет зад­ ать ком­ анд­ у :tag array.c. Кро­ме тог­ о, удоб­но по­мес­тить курс­ ор над имен­ ем фай­ла и пе­рей­ти к это­му фай­лу с по­мо­щью ком­ ан­ды ^] (на­прим­ ер, есл­ и вы ре­ дак­тир­ ует­ е Makefile и хо­тит­ е пер­ ей­ти к оп­ре­дел­ ен­но­му файл­ у). В той час­ти ат­ри­бу­та, где зад­ ае­ т­ся знач­ е­ние, об­ратн­ ая кос­ ая черт­ а, та­ бу­ляц­ ия, возв­ рат кар­ етк­ и и  симв­ ол­ ы пер­ е­вод­ а строк­ и долж­ны быть предс­ тавл­ ен­ ы как \\, \t, \r и \n со­от­ветс­ т­вен­но. Рас­шир­ ен­ные фай­лы tags мо­гут со­дер­жать не­ко­то­рое кол­ и­чес­ тв­ о ини­ циал­ и­зир­ ующ­ их тег­ ов, нач­ ин­ ающ­ ихс­ я с !_TAG_. Эти тег­ и обычн­ о от­сор­ тир­ ов­ ан­ ы в на­ча­ле фай­ла и по­лез­ны при опр­ ед­ е­ле­нии про­грамм­ ы, соз­ давш­ ей файл. Exuberant ctags ген­ е­ри­руе­ т сле­дую­щее: !_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;\" to lines/ !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ !_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/ !_TAG_PROGRAM_NAME Exuberant Ctags // !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ !_TAG_PROGRAM_VERSION 5.7 // Не­кот­ о­рые ре­дак­тор­ ы мог­ ут ис­поль­зов­ ать эти спец­ и­альн­ ые тег­ и для реа­ ли­за­ции раз­лич­ных функ­ций. Нап­ рим­ ер, Vim уде­ля­ет вним­ ан­ ие те­гу !_TAG_FILE_SORTED и при пои­ с­ке в фай­ле tags бу­дет исп­ ольз­ ов­ ать бин­ арн­ ый пои­ ск вме­сто ли­нейн­ ог­ о, ис­польз­ уе­мо­го для не­отс­ орт­ и­ро­ван­ных файл­ ов. Есл­ и вы поль­зует­ есь фай­лам­ и tags, рек­ о­менд­ у­ем уст­ ан­ ов­ ить Exuberant ctags.

Улучшенные теги 157Стеки тегов Ком­ анд­ ы ex :tag и ^] в ре­жи­ме vi пре­дос­тавл­ яю­ т огр­ ан­ ич­ ен­ные воз­мож­ но­сти для пои­ с­ка идент­ и­фик­ ат­ ор­ ов на осн­ о­ве ин­фор­мац­ ии, со­дер­жа­ щей­ся в файл­ е tags. Одн­ ак­ о во всех мод­ и­фик­ ац­ ия­ х ред­ акт­ ор­ а есть рас­ ши­рен­ ие этих воз­мож­но­стей, а  именно – спос­ об­ность под­дер­жив­ ать стек пол­ ож­ е­ний тег­ ов. Всяк­ ий раз при вы­зо­ве ком­ анд ex :tag или ^] в ре­ жим­ е vi пе­ред по­ис­ком указ­ ан­но­го тег­ а ред­ ак­тор сох­ ран­ я­ет те­кущ­ ее по­ ло­жен­ ие в файл­ е. По­сле этог­ о мож­но верн­ утьс­ я к сох­ ран­ ен­ном­ у по­ло­ же­нию, исп­ ольз­ уя (как пра­ви­ло) ком­ анд­ у vi ^T или ком­ ан­ду ex. Ниж­ е мы рас­скаж­ ем о стек­ е те­гов Solaris vi и при­вед­ ем нек­ о­то­рые при­ ме­ры. Стек­ и те­гов Vim опис­ ыв­ а­ют­ся в разд­ ел­ е «Стек­ и тег­ ов» на стр. 302. О ме­то­дах раб­ о­ты со сте­ка­ми те­гов, прим­ е­няе­мых в дру­гих ред­ ак­то­рах, расс­ каз­ ы­вае­ т­ся в со­отв­ етс­ т­вующ­ их гла­вах час­ти III.Solaris vi Как ни уди­ви­тельн­ о, вер­сия vi для Solaris подд­ ер­жив­ ае­ т стек­ и те­гов. Возм­ ож­но, не столь удив­ и­тельн­ о то, что эта функц­ ия сов­ ер­шенн­ о не до­ кум­ ент­ и­ро­ва­на на стра­ниц­ ах ex(1) и  vi(1) рук­ о­во­дства по Solaris. Мы све­ли свед­ ен­ ия о раб­ от­ е со сте­ком тег­ ов в Solaris vi в табл. 8.3, 8.4 и 8.5. Стек тег­ ов в Solaris vi весь­ма прост1. Таб­ли­ца 8.3. Ком­ анд­ ы тег­ ов в vi для SolarisКо­ман­да Дей­ств­ иеta[g][!] tagstring Ре­дакт­ ир­ уе­ т файл, сод­ ер­жа­щий tagstring, со­глас­но файл­ у tags. Воск­ лиц­ а­тельн­ ый знак за­ставл­ яе­ т vi пер­ ек­ лю­чить­ся в нов­ ый файл, даж­ е есл­ и те­кущ­ ий бу­фер из­мен­ ен, но не со­ хран­ ен.po[p][!] Выт­ ас­кив­ ае­ т один элем­ ент из стек­ а те­гов.Таб­лиц­ а 8.4. Ко­ман­ды тег­ ов для ком­ андн­ о­го реж­ и­ма vi для SolarisКо­манд­ а Дей­ст­вие^] Оты­ски­ва­ет в файл­ е tags ме­стоп­ о­ло­же­ние иден­ти­фи­ка­то­ра, на^T ко­то­ром сто­ит курс­ ор, и пер­ ех­ од­ ит на это мес­ то. Ес­ли вклю­чен стек те­гов, то те­ку­щее пол­ о­жен­ ие ав­то­мат­ и­че­ски по­ме­щае­ тс­ я в стек. Воз­вра­ща­ет к пред­ ы­дущ­ ем­ у мес­ту в сте­ке тег­ ов, то есть выт­ ас­ кив­ ае­ т отт­ уд­ а один элем­ ент.1 Эта инф­ орм­ а­ция бы­ла пол­ уч­ ен­ а экс­пе­ри­мент­ аль­но. Ваш­ и ре­зульт­ а­ты мо­ гут от­лич­ атьс­ я.

158 Глава 8. Представляем клоны vi Табл­ и­ца 8.5. Опц­ ии для управл­ ен­ ия тег­ ам­ и в vi для Solaris Оп­ция Дей­ст­вие taglength, tl Управ­ля­ет кол­ и­че­ст­вом знач­ им­ ых сим­во­лов в те­ге при его по­ tags, tagpath иск­ е. Зна­че­ние по умолч­ а­нию, равн­ ое ну­лю, указ­ ы­ва­ет, что зна­ tagstack чим­ ы все сим­во­лы. Зна­чен­ и­ем явл­ я­етс­ я спис­ ок файл­ ов, где нуж­но ис­кать те­ги. По умол­ча­нию это \"tags/ usr/lib/tags\". Ког­ да эта оп­ция уст­ ан­ ов­лен­ а равн­ ой true (ис­ти­на), vi пос­ ы­лае­ т в стек каж­дое ме­стоп­ о­ло­же­ние. Чтоб­ ы ее вык­ лю­чить, вве­ди­те :set notagstack.Exuberant ctags и Vim Чтоб­ ы бы­ло пон­ ят­но, как исп­ оль­зов­ ать стек­ и те­гов, пред­став­ им неб­ оль­ шой при­мер с ис­поль­зов­ ан­ ие­ м Exuberant ctags и Vim. Пред­пол­ о­жим, вы ра­бот­ ае­те с  про­грамм­ ой, исп­ ольз­ ую­щей функц­ ию GNU getopt_long, про ко­то­рую вам не­об­ход­ им­ о уз­нать больш­ е. GNU getopt со­стои­ т из трех фай­лов: getopt.h, getopt.c и getopt1.c. Снач­ ал­ а соз­дад­ им файл tags, а зат­ ем нач­нем ре­дакт­ и­ро­вать ос­нов­ную про­грамм­ у, расп­ ол­ о­жен­ную в main.c: $ ctags *.[ch] getopt.h getopt1.c main.c tags $ ls Makefile getopt.c $ vim main.c Клав­ иш­ и Ре­зуль­тат /getopt_ /* option processing. ready, set, go! */ for (optopt = 0, old_optind = 1; (c = getopt_long(argc, argv, optlist, optab, NULL)) != EOF; optopt = 0, old_optind = optind) { if (do_posix) opterr = TRUE; Ред­ акт­ и­ру­ем main.c и пе­рех­ од­ им к выз­ ов­ у getopt_long. ^] int getopt_long (int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } \"getopt1.c\" 192L, 4781C Вып­ олн­ яе­ м по­иск тег­ ов по getopt_long. Vim пер­ е­мест­ ит вас в get­ opt1.c и пос­ та­вит кур­сор на опр­ ед­ ел­ е­ние getopt_long.

Улучшенные теги 159Оказ­ ы­вае­ т­ся, getopt_long явл­ я­етс­ я функц­ ие­ й-«обертк­ ой» для _getopt_int­ernal. Вы по­ме­щае­те курс­ ор на _getopt_internal и снов­ а вып­ ол­няе­тепои­ ск те­гов.Клав­ и­ши Ре­зульт­ ат3jf_ ^] int _getopt_internal (int argc, char *const *argv, const char *optstring, const struct option *longopts, int *longind, int long_only) { int result; getopt_data.optind = optind; getopt_data.opterr = opterr; result = _getopt_internal_r (argc, argv, optstring, longopts, longind, long_only, &getopt_data); optind = getopt_data.optind; \"getopt.c\" 1225L, 33298Cjfo; ^] Вы пе­ре­шли к  getopt.c. Чтоб­ ы оты­скать боль­ше ин­фор­мац­ ии о struct option, по­мес­ти­те курс­ ор на option и опять вып­ олн­ ит­ е по­ иск по тег­ ам. one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ \"getopt.h\" 177L, 6130C Ре­дакт­ ор пе­реш­ ел на опр­ е­де­ле­ние struct option в getopt.h. Те­перь мож­но поч­ ит­ ать ком­мент­ ар­ ии, где объ­ясн­ я­ет­ся ис­польз­ о­ван­ ие дан­ной структ­ ур­ ы.:tags # TO tag FROM line in file/text main.c 1 1 getopt_long 310 getopt1.c getopt.c 2 1 _getopt_internal 67 3 1 option 1129 Команда :tags в Vim показывает стек тегов.

160 Глава 8. Представляем клоны vi Наж­ ат­ ие ^T три раза пе­рем­ ес­тит вас обр­ атн­ о в main.c, от­ку­да вы нач­ а­ли. С пом­ ощ­ ью те­гов очень удобн­ о пе­ре­ме­щатьс­ я во врем­ я ред­ ак­тир­ ов­ а­ния исх­ од­но­го код­ а.Улучшенные возможности Во всех раз­но­вид­нос­ тях vi есть до­пол­ни­тель­ные возм­ ожн­ о­сти, по­зво­ ляю­щие ре­дакт­ и­ров­ ать текст прощ­ е и бы­стр­ ее: Ред­ ак­тир­ о­ван­ ие ко­мандн­ ой строк­ и ex Спо­соб­ность ред­ ак­ти­ро­вать ком­ анд­ ы в реж­ им­ е ex во вре­мя их вво­да, включ­ ая сох­ ран­ ен­ ие ис­то­рии ком­ анд ex. Такж­ е сю­да вхо­дят функ­ ции за­верш­ е­ния имен фай­лов и  проч­ ие, нап­ ри­мер зав­ ерш­ ен­ ие ко­ манд или опц­ ий. Отс­ утс­ т­вие ог­ра­нич­ е­ний на дли­ну стро­ки Ре­дакт­ и­ров­ ан­ ие строк­ и прои­ зв­ ольн­ ой дли­ны. Такж­ е сю­да вхо­дит возм­ ожн­ ость ред­ акт­ и­ро­вать фай­лы, сод­ ер­жащ­ ие люб­ ые 8-раз­ряд­ ные симв­ о­лы. Беск­ о­неч­ные от­мен­ ы По­сле­дов­ а­тель­ная от­мен­ а всех сдел­ анн­ ых в файл­ е изм­ е­нен­ ий. Ин­кре­мент­ный пои­ ск По­иск текс­ та пря­мо во врем­ я ввод­ а шаб­ло­на по­иск­ а. Пра­вая/лев­ ая прок­ рут­ка Воз­можн­ ость не пер­ ен­ о­сить длинн­ ые строк­ и, по­зво­ляя им вы­лез­ ать за пред­ ел­ ы эк­ран­ а. Ви­зуа­ ль­ный реж­ им Спос­ обн­ ость выб­ ир­ ать про­изв­ оль­ные смежн­ ые фраг­мен­ты тек­ста, над кот­ о­ры­ми буд­ ет сов­ ерш­ ен­ а как­ ая-либ­ о опер­ а­ция. Инд­ ик­ ат­ о­ры ре­жим­ а Ви­ди­мый указ­ а­тель акт­ ив­но­го реж­ им­ а (ко­мандн­ ог­ о или реж­ им­ а вставк­ и), а такж­ е указ­ ат­ ел­ и тек­ у­щих стро­ки и столбц­ а.История командной строки, автозавершение Польз­ ов­ ат­ ел­ и обо­лоч­ ек csh, tcsh, ksh, zsh и bash зна­ют, что ес­ли есть воз­ можн­ ость выз­ ы­вать пре­дыд­ у­щие ко­манд­ ы и  лег­ко ре­дак­тир­ о­вать их и вып­ ол­нять зан­ ов­ о, то раб­ о­та стан­ ов­ ит­ся нам­ но­го бо­лее эф­фек­тив­ной. Для польз­ о­ва­тел­ ей ред­ ак­тор­ ов это так же верн­ о, как и для польз­ о­ват­ е­ лей ко­мандн­ ой строк­ и. К сож­ ал­ ен­ ию, в vi для UNIX нев­ озм­ ожн­ о со­хра­ нять и вос­стан­ ав­ли­вать ко­манд­ ы ex. Этот не­дос­та­ток ис­правл­ ен во всех мо­диф­ и­кац­ и­ях vi. Сох­ ран­ е­ние ис­то­ рии ко­манд и их по­втор­ный выз­ ов реал­ из­ ов­ ан­ ы в них разн­ ы­ми спос­ об­ а­ ми, но все эти ме­ха­низм­ ы ра­бо­та­ют и до­бавл­ я­ют удоб­ст­ва в раб­ от­ е.

Улучшенные возможности 161 Вдоб­ а­вок к ист­ о­рии ком­ анд во всех этих ред­ акт­ ор­ ах есть нек­ от­ о­рое по­ доб­ ие авт­ оз­ ав­ ер­шен­ ия ком­ анд­ ы. Нап­ ри­мер, пос­ ле ввод­ а нач­ ал­ а име­ни файл­ а и наж­ ат­ ия оп­ред­ ел­ ен­ной клав­ иш­ и (на­прим­ ер, та­бу­ля­ции) ре­дак­ тор зав­ ер­ша­ет имя файл­ а за вас. Кром­ е ав­то­зав­ ерш­ ен­ ия имен­ и фай­ла в  нек­ о­тор­ ых ре­дакт­ ор­ ах есть авт­ оз­ ав­ ерш­ е­ние и  для друг­ их объе­ к­тов. Подр­ обн­ о­сти, ка­сающ­ ие­ся Vim, мож­но найт­ и в разд­ е­ле «Ключ­ ев­ ые сло­ ва и  зав­ ерш­ ен­ ие слов по сло­ва­рю» на стр.  293. Про дру­гие ред­ ак­тор­ ы подроб­но расс­ ка­зы­ва­етс­ я в со­отв­ ет­ст­вующ­ их гла­вах час­ти III.Строки произвольной длины и двоичные данные Во всех мо­диф­ ик­ а­ция­ х vi есть под­держ­ка строк про­из­вольн­ ой дли­ны1. Ста­рые вер­сии част­ о име­ли пре­дел, равн­ ый при­мер­но 1 000  симв­ о­лам в стро­ке, а бо­лее длинн­ ые стро­ки об­рез­ а­лись. Кроме того, все они проз­ рачн­ ы для 8-раз­ряд­ных симв­ ол­ ов, то есть в них мож­но ред­ акт­ и­ров­ ать файл­ ы, со­дер­жащ­ ие люб­ ые 8-разр­ ядн­ ые сим­во­ лы. При не­обх­ о­дим­ о­сти мож­но ре­дакт­ ир­ о­вать даж­ е дво­ич­ные и исп­ ол­ няе­мые файл­ ы. Иног­ да это мож­ ет приг­ од­ ить­ся. Ре­дак­тор­ у можн­ о со­об­ щить о том, что файл двои­ чн­ ый, а мож­но и не со­об­щать. nvi Авт­ о­мат­ ич­ е­ски подд­ ер­жив­ а­ет двои­ чн­ ые данн­ ые. Не треб­ у­ет­ся ни спе­циа­ ль­ных опц­ ий ком­ андн­ ой стро­ки, ни ex. elvis Под UNIX не дел­ а­ет от­ли­чий межд­ у дво­ич­ным­ и и про­чим­ и фай­ла­ ми. В дру­гих сис­те­мах ис­поль­зуе­ т файл elvis.brf для зад­ ан­ ия опц­ ии binary, что­бы изб­ еж­ ать проб­ лем с вос­при­ятие­ м пе­ре­но­са строк­ и (файл elvis.brf и реж­ им ото­бра­жен­ ия hex опис­ ан­ ы в раз­де­ле «Инт­ ер­ ес­ные особ­ ен­нос­ ти» на стр. 374). Vim Не ог­ра­ни­чив­ ае­ т дли­ну стро­ки. Ес­ли не уст­ ан­ овл­ ен ре­жим binary, Vim ве­дет се­бя как nvi и авт­ о­мат­ ич­ е­ски подд­ ерж­ и­вае­ т двои­ чн­ ые дан­ ные. Одн­ а­ко при ре­дак­тир­ ов­ а­нии двои­ ч­но­го файл­ а луч­ше восп­ оль­зо­ ватьс­ я оп­ци­ей -b ком­ анд­ной стро­ки или :set binary. При этом уст­ а­ навл­ ив­ а­ют­ся нек­ от­ ор­ ые дру­гие опц­ ии Vim, об­лег­чаю­щие ред­ ак­ти­ ро­ван­ ие дво­ичн­ ых файл­ ов. vile Ав­том­ ат­ и­чес­ ки подд­ ер­жи­ва­ет двои­ чн­ ые дан­ные и не треб­ у­ет ни спе­ ци­альн­ ых опц­ ий ком­ анд­ной стро­ки, ни ex. На­ко­нец, одн­ а важ­ная дет­ аль. Тра­диц­ и­онн­ ый vi всег­ да сох­ ран­ я­ет файл с до­бав­лен­ным в кон­ ец симв­ ол­ ом пе­ре­нос­ а стро­ки. Та­ким об­раз­ ом, при ре­дак­ти­ров­ а­нии двои­ ч­но­го фай­ла к  не­му мо­жет до­бав­ ить­ся лиш­ний1 Верн­ ее, до мак­сим­ аль­но­го знач­ ен­ ия тип­ а long в C – 2 147 483 647 (на 32-раз­ ряд­ном комп­ ь­ют­ ер­ е).

162 Глава 8. Представляем клоны vi симв­ ол, что прив­ ед­ ет к  не­прия­ тн­ ос­ тям. По умол­ча­нию nvi и  Vim со­ вмест­ им­ ы с  vi и  до­бавл­ яю­ т пер­ ен­ ос строк­ и. В  Vim это­го мож­но изб­ е­ жать, есл­ и уст­ а­нов­ ить оп­цию binary. elvis и vile ник­ ог­ да не до­бав­ля­ют пер­ ен­ ос строк­ и.Бесконечная отмена vi для UNIX поз­ во­ля­ет отм­ е­нить тольк­ о по­следн­ ее из­мен­ е­ние или вос­ ста­но­вить строк­ у в сос­ тоян­ ии до вне­сен­ ия в нее как­ их-либ­ о изм­ ен­ ен­ ий. Во всех раз­нов­ ид­нос­ тях ред­ акт­ ор­ а есть «беск­ о­нечн­ ая отм­ е­на» – спо­соб­ ность отк­ ат­ ы­вать дей­ст­вия поль­зов­ ат­ ел­ я од­но за дру­гим вплоть до со­ стоя­ния, ко­гда файл не подв­ ер­гал­ся ник­ ак­ им правк­ ам.Инкрементный поиск При ис­поль­зов­ ан­ ии ин­кре­ментн­ о­го по­иск­ а ред­ ак­тор пе­рем­ ещ­ а­ет кур­ сор по всем­ у файл­ у, оты­скив­ ая со­отв­ ет­ств­ ия в тек­сте по мер­ е вво­да шаб­ лон­ а по­ис­ка. Пос­ ле наж­ ат­ ия на ENTER по­иск за­вер­шае­ т­ся1. Ес­ли рань­ ше вы по­добн­ о­го не встре­чал­ и, то по­нач­ а­лу это мож­ ет при­вест­ и в за­ме­ ша­тель­ст­во. Од­нак­ о ког­ да вы прив­ ыкн­ ит­ е к  этом­ у, то удив­ и­тесь, как раньш­ е обх­ од­ ил­ ись без так­ о­го по­иск­ а. В nvi, Vim и elvis инк­ рем­ ентн­ ый по­иск при­сутс­ т­вуе­ т в ка­че­ств­ е опц­ ии, а vile ис­поль­зуе­ т даж­ е две спец­ и­аль­ные ко­манд­ ы реж­ и­ма vi. vile мож­ но скомп­ ил­ ир­ ов­ ать с от­клю­ченн­ ым ин­крем­ ентн­ ым пои­ с­ком, но по умол­ ча­нию он включ­ ен. В табл. 8.6 по­каз­ ан­ ы опц­ ии, пре­дос­тавл­ яе­мые каж­ дым из ре­дак­тор­ ов. Табл­ и­ца 8.6. Ин­кре­мент­ный пои­ ск Ред­ ак­тор Опц­ ия Ко­манд­ а Дей­ств­ ие nvi searchincr Во врем­ я ввод­ а курс­ ор пер­ ем­ е­ща­ет­ся по фай­ лу, все­гда по­пад­ ая на перв­ ый сим­вол тек­ста, где об­нар­ уж­ ил­ ось со­отв­ етс­ т­вие. Vim incsearch Во врем­ я ввод­ а кур­сор пе­рем­ ещ­ а­етс­ я по фай­ лу. Vim подс­ ве­чи­ва­ет текст, со­отв­ етс­ т­вую­ щий уже вве­денн­ ом­ у. elvis incsearch При вво­де кур­сор пер­ е­мещ­ ае­ т­ся по файл­ у. elvis под­све­чи­вае­ т текст, кот­ ор­ ый со­отв­ ет­ ств­ уе­ т вве­ден­но­му. vile ^X S, ^X R При ввод­ е курс­ ор пе­ре­мещ­ а­ет­ся по файл­ у, все­гда поп­ а­дая на пер­вый сим­вол текс­ та, где об­на­руж­ ил­ ось со­от­вет­ств­ ие. Ко­манд­ а ^X S вып­ ол­няе­ т ин­крем­ ент­ный по­иск впер­ ед по файл­ у, а ^X R – в обр­ атн­ ом нап­ равл­ е­нии. 1 В Emacs ин­кре­мент­ный пои­ ск был всег­ да.

Улучшенные возможности 163Прокрутка влево-вправо По умол­ча­нию vi и  больш­ ая часть его мо­ди­фи­ка­ций пер­ е­но­сят длин­ ные стро­ки. Та­ким об­ра­зом, одн­ а лог­ ич­ е­ская стро­ка фай­ла мо­жет за­ни­ мать не­сколь­ко вид­ им­ ых строк на экр­ ан­ е. Ино­гда предп­ очт­ ит­ ельн­ ее сдел­ ать так, чтоб­ ы длинн­ ая строк­ а не пер­ е­ нос­ и­лась, а вы­хо­ди­ла за пра­вый край эк­ран­ а. Есл­ и по­ста­вить кур­сор на так­ ую стро­ку и пе­рем­ ест­ ить его на­прав­ о, то весь эк­ран «про­кру­титс­ я» в стор­ он­ у. Эта функ­ция дос­тупн­ а во всех раз­нов­ идн­ ос­ тях vi. Как пра­ви­ ло, чи­слов­ ая опц­ ия за­да­ет, на сколь­ко нужн­ о прок­ ру­чив­ ать эк­ран, а бу- левская опр­ ед­ е­ля­ет, пе­рен­ о­сятс­ я строк­ и или исч­ ез­ аю­ т за гра­ниц­ а­ми экр­ а­на. В vile так­же есть ко­манд­ные клав­ иш­ и, по­зво­ляю­щие смещ­ ать в сто­рон­ у весь экр­ ан. В табл. 8.7 прив­ е­де­ны при­мер­ ы исп­ оль­зо­ван­ ия го­ ри­зон­тальн­ ой про­крутк­ и в раз­ных ред­ акт­ ор­ ах.Табл­ иц­ а 8.7. Прок­ рут­ка в стор­ он­ ыРе­дак­ Ве­лич­ ин­ а Оп­ция Дейс­ тв­ иетор прок­ рутк­ иnvi sidescroll = 16 leftright По умолч­ ан­ ию вык­ люч­ е­на. Ес­ли вклю­читьelvis эту оп­цию, то длинн­ ые стро­ки вых­ о­дят заVim гран­ и­цы эк­ра­на. За один раз эк­ран про­кру­ чив­ а­ет­ся на 16 сим­во­лов влев­ о или впра­во.vile sidescroll = 8 wrap По умолч­ а­нию вык­ люч­ е­на. Ес­ли включ­ ить оп­цию, то длинн­ ые стро­ки вых­ од­ ят за гра­ ни­цы эк­ран­ а. За один раз эк­ран про­кру­чи­ва­ етс­ я на 8 сим­вол­ ов вле­во или вправ­ о. sidescroll = 0 wrap По умолч­ ан­ ию вы­ключ­ ен­ а. Ес­ли вклю­чить эту опц­ ию, то длинн­ ые строк­ и вых­ од­ ят за гра­ни­цы экр­ а­на. Есл­ и side­scroll рав­ ен ну­ лю, то кажд­ ая про­крут­ка по­мещ­ ае­ т курс­ ор в  се­ред­ ин­ у эк­ран­ а. В  ост­ аль­ных слу­чая­ х экр­ ан прок­ руч­ и­ва­етс­ я на уст­ ан­ овл­ енн­ ое ко­ ли­чес­ тв­ о симв­ ол­ ов. sideways = 0 linewrap По умол­ча­нию вык­ люч­ ен­ а. Есл­ и включ­ ить оп­цию, то длинн­ ые стро­ки бу­дут пер­ е­но­ сить­ся. По умол­ча­нию они уход­ ят за гра­ни­ цы эк­ра­на. Длин­ные строк­ и от­меч­ а­ют­ся сле­ва и справ­ а сим­во­лам­ и < и >. Есл­ и side­ ways рав­ ен ну­лю, то кажд­ ая прок­ рут­ка пе­ ре­мещ­ ае­ т экр­ ан на 1/3. В ос­таль­ных случ­ ая­ х экр­ ан про­кру­чи­ва­етс­ я на ус­та­нов­ленн­ ое ко­ лич­ ес­ т­во сим­вол­ ов. horizscroll По умолч­ ан­ ию включ­ ен­ а. Есл­ и опц­ ия вклю­ чен­ а, то кур­сор, пер­ ем­ ест­ ивш­ ись за пред­ ел­ ы эк­ра­на, смес­ тит весь экр­ ан. Есл­ и опц­ ия не ус­та­новл­ ен­ а, то сме­ща­етс­ я толь­ко тек­ у­щая стро­ка. Это удоб­но на мед­лен­ных дисп­ ле­ях.



























































Варианты запуска и инициализации 193 Поль­зов­ ат­ ел­ и Windows мо­гут по­луч­ ить дос­туп к  этим вер­сия­ м про­ грамм­ ы Vim в спи­ске про­грамм (в стар­то­вом ме­ню).Системные и пользовательскиеконфигурационные файлы Vim ищет ин­ст­рук­ции по иниц­ иал­ из­ а­ции осо­бым об­раз­ ом. Он вып­ ол­ няе­ т перв­ ый най­денн­ ый на­бор инс­ тр­ укц­ ий (ли­бо в пе­рем­ енн­ ой окр­ уж­ е­ ния, либ­ о из фай­ла) и нач­ и­на­ет ре­дак­тир­ о­ва­ние. Иным­ и слов­ ам­ и, пер­ вый встре­тив­ший­ся элем­ ент из сле­дующ­ ег­ о спис­ ка буд­ ет един­ст­вен­ ным элем­ ент­ ом из спи­ска, кот­ о­рый бу­дет вы­полн­ ен. Спис­ ок та­ков: 1. VIMINIT. Это пер­ е­менн­ ая окр­ уж­ ен­ ия. Ес­ли она не пус­тая, Vim ис­пол­ няе­ т ее сод­ ер­жи­мое как ко­ман­ду ex. 2. Польз­ ов­ ат­ ельс­ кие фай­лы vimrc. Файл иниц­ иа­ли­за­ции vimrc (Vim re­ so­urce) кросс­плат­форм­ енн­ ый, од­на­ко из-за нек­ о­то­рых отл­ ич­ ий меж­ ду опе­рац­ и­онн­ ым­ и сис­те­ма­ми и  платф­ орм­ ам­ и Vim ищет его в  раз­ ных мес­тах в след­ ующ­ ем пор­ яд­ке: $HOME/.vimrc (Unix, OS/2 и Mac OS X) s:.vimrc (Amiga) home:.vimrc (Amiga) $VIM/.vimrc (OS/2 и Amiga) $HOME/_vimrc (DOS и Windows) $VIM/_vimrc (DOS и Windows) 3. Опц­ ия exrc. Ес­ли ус­тан­ ов­лен­ а опц­ ия Vim exrc, то ред­ ак­тор бу­дет ис­ кать три доп­ ол­нит­ ельн­ ых файл­ а на­строе­ к: [._]vimrc; [._]vimrc и [._] exrc. Файл vimrc – хо­рош­ ее ме­сто для уст­ ан­ ов­ки хар­ акт­ е­ри­стик ред­ ак­тор­ а Vim. Тео­рет­ и­чес­ ки в этом файл­ е мож­но включ­ ать или вык­ люч­ ать лю­ бую опц­ ию Vim, и он особ­ ен­но хо­ро­шо подх­ од­ ит при уст­ а­нов­ке гло­баль­ ных пе­рем­ енн­ ых и  оп­ред­ ел­ е­нии функ­ций, аб­бре­виа­тур, отоб­ ра­жен­ ий клав­ иш и т. д. Вот что след­ уе­ т знать о фай­ле vimrc: • Комм­ ен­та­рии нач­ ин­ а­ют­ся с двойн­ ой кав­ ыч­ки (\"). Она мож­ ет сто­ять в люб­ ом мест­ е строк­ и. Люб­ ой текст пос­ ле двой­ной ка­вычк­ и, вклю­ чая ее сам­ у, буд­ ет игн­ о­рир­ ов­ ать­ся. • Ком­ анд­ ы ex мож­но ука­зы­вать с двоет­ оч­ и­ем или без не­го. Нап­ ри­мер, set autoindent рав­нос­ иль­но :set autoindent. • Файл бу­дет го­раз­до удобн­ ее в управ­ле­нии, ес­ли вы ра­зоб­ ьет­ е боль­ шие наб­ о­ры оп­ре­дел­ е­ний опц­ ий по разн­ ым стро­кам. Нап­ рим­ ер: set terse sw=1 ai ic wm=15 sm nows ruler wc=<Tab> more эк­вив­ а­лентн­ о след­ ующ­ е­му: set terse \" short error and info messages set shiftwidth=1 set autoindent set ignorecase

194 Глава 10. Главные улучшения Vim по сравнению с vi set wrapmargin=15 set nowrapscan \" don't scan past end or top of file in searches set ruler set wildchar=<TAB> set more Обр­ ат­ и­те вним­ ан­ ие, на­сколь­ко бол­ ее удоб­ оч­ и­та­ем вто­рой на­бор ко­ манд. Так­же его лег­че об­раб­ ат­ ы­вать пос­ ред­ств­ ом уда­лен­ ий, встав­ ок и вре­менн­ о­го комм­ ент­ и­ров­ ан­ ия строк при по­иск­ е оши­бок в кон­фи­ гу­рац­ ио­ н­ном фай­ле. На­прим­ ер, есл­ и вам зах­ оч­ етс­ я врем­ ен­но уб­рать ну­ме­ра­цию строк из стар­тов­ ой на­строй­ки, прос­ то пос­ тавьт­ е двой­ную кав­ ыч­ку (\") в на­ча­ло строк­ и set number конф­ иг­ у­рац­ ио­ н­но­го фай­ла.Переменные окружения Мно­жес­ т­во пер­ е­мен­ных окр­ уж­ ен­ ия влия­ет на стар­тов­ ое по­ве­ден­ ие Vim, а некоторые – да­же на пов­ ед­ е­ние во врем­ я ред­ акт­ ир­ ов­ а­ния. В осн­ ов­ном они пон­ ятн­ ы и за­ме­ня­ютс­ я ус­тан­ ов­кам­ и по умолч­ а­нию, есл­ и не зад­ ать их спе­ци­альн­ о. Как установить переменные окружения Ко­манд­ное окр­ уж­ е­ние (в UNIX на­зы­ваем­ ое обо­лочк­ ой), сущ­ ес­ тв­ ующ­ ее при рег­ и­стр­ ац­ ии, уст­ а­навл­ ив­ ае­ т пе­рем­ енн­ ые, от­ра­жающ­ ие его пов­ е­де­ ние либ­ о влияющ­ ие на нег­ о. Пер­ ем­ енн­ ые окр­ уж­ е­ния осо­бен­но пол­ ез­ны, по­сколь­ку они влия­ют на про­грамм­ ы, вы­званн­ ые из ком­ андн­ ог­ о окр­ у­ же­ния. След­ ую­щие инс­ т­рук­ции кас­ а­ютс­ я не толь­ко Vim; их мож­но при­мен­ ять для уст­ ан­ ов­ки пе­ре­менн­ ых ок­руж­ е­ния, ко­то­рые вы хо­тит­ е вид­ еть в сво­ем ко­манд­ном ок­руж­ ен­ ии. Windows Что­бы уст­ а­но­вить пер­ ем­ енн­ ую ок­руж­ ен­ ия: 1. Выз­ о­ви­те па­нель управ­лен­ ия. 2. Дваж­ д­ ы щелкн­ и­те по System. 3. Пер­ ейд­ и­те на вклад­ку Advanced. 4. На­жмит­ е кнопк­ у Environment Variables. В рез­ уль­та­те вы увид­ и­те ок­но, раз­дел­ ен­ное на две об­лас­ти пер­ е­мен­ ных ок­руж­ ен­ ия, User и System. Нов­ ичк­ ам не сле­ду­ет мен­ ять сист­ ем­ ные пе­ре­менн­ ые окр­ уж­ е­ния. В об­ласт­ и User можн­ о за­дать пе­рем­ ен­ ные ок­руж­ ен­ ия, связ­ ан­ные с  Vim, и  сде­лать их по­сто­янн­ ы­ми для всех се­анс­ ов раб­ о­ты. Unix/Linux Bash и дру­гие обо­лочк­ и Bourne От­ред­ ак­ти­руй­те под­ход­ ящ­ ий файл нас­ трой­ки обо­лочк­ и (на­прим­ ер, для поль­зов­ а­те­лей Bash это .bashrc) и  вставь­те строк­ и след­ ую­ще­го вид­ а: VARABC=somevalue VARXYZ=someothervalue

Варианты запуска и инициализации 195 MYVIMRC=myfavoritevimrcfile export VARABC VARXYZ MYVIMRC Пор­ яд­ ок строк рол­ и не иг­рае­ т. Опе­рат­ ор export прос­ то дел­ ае­ т эти пе­ рем­ ен­ные вид­ им­ ы­ми для про­грамм, раб­ о­тающ­ их в обо­лочк­ е, так­ им обр­ а­зом прев­ ра­щая их в пе­рем­ ен­ные ок­руж­ е­ния. Их знач­ е­ния мож­ но уст­ ан­ ав­лив­ ать как до экс­порт­ а, так и пос­ ле не­го.Unix/Linux обо­лоч­ки C От­ред­ акт­ ир­ уй­те подх­ од­ я­щий файл нас­ тройк­ и обо­лоч­ки (так­ ой как .cshrc) и вставь­те стро­ки сле­дующ­ ег­ о вид­ а: setenv VARABC somevalue setenv VARXYZ someothervalue setenv MYVIMRC myfavoritevimrcfileПеременные окружения, связанные с VimДа­лее мы прив­ о­дим спис­ ок пе­рем­ енн­ ых окр­ уж­ е­ния, чащ­ е всег­ о ис­поль­зуем­ ых в Vim, а так­же их дей­ств­ ие.Опц­ ия ко­ман­ды Vim -u от­ме­ня­ет дей­ст­вие пер­ е­мен­ных окр­ уж­ ен­ ия Vimи  пер­ е­хо­дит неп­ ос­ редс­ тв­ ен­но к  ука­занн­ ом­ у кон­фиг­ у­рац­ и­онн­ ом­ у фай­лу. -u не отм­ ен­ я­ет пер­ е­менн­ ые окр­ уж­ е­ния, не от­но­ся­щиес­ я к Vim:SHELL Указ­ ы­ва­ет, как­ ую обо­лоч­ку или внешн­ ий ин­тер­прет­ ат­ ор ком­ анд ис­ польз­ у­ет Vim в  ко­ман­дах обол­ очк­ и (!!, :! и  т. д.). В  MS-DOS, ес­ли SHELL не уст­ ан­ ов­ле­на, вме­сто нее исп­ оль­зуе­ т­ся пе­рем­ ен­ная окр­ уж­ е­ ния COMSPEC.TERM Ус­тан­ ав­лив­ а­ет в  Vim внут­рен­нюю опц­ ию term. Это нео­ бя­за­тельн­ о, по­скольк­ у ре­дак­тор на­страи­ва­ет свой терм­ ин­ ал так, как счит­ ае­ т нуж­ным. Дру­ги­ми сло­вам­ и, Vim луч­ше знае­ т, что так­ ое терм­ ин­ ал, неж­ ел­ и пре­до­пре­дел­ ен­ная пер­ ем­ енн­ ая.MYVIMRC От­мен­ я­ет по­иск файл­ ов иниц­ иал­ и­за­ции в  Vim. Ес­ли MYVIMRC при стар­те име­ет знач­ е­ние, то ред­ ак­тор пол­ аг­ ае­ т, что оно и яв­ляе­ тс­ я име­ нем фай­ла иниц­ иа­ли­зац­ ии и, ес­ли та­кой файл сущ­ е­ст­ву­ет, бер­ ет от­ туд­ а все ус­тан­ ов­ки. Друг­ ие файл­ ы при этом не про­ве­ряю­ т­ся (см. по­ сле­дов­ ат­ ель­ность по­иск­ а в пре­дыд­ ущ­ ем раз­дел­ е).VIMINIT Ука­зы­ва­ет, ка­кие ко­манд­ ы ex нужн­ о вы­полн­ ить при стар­те Vim. Мож­но зад­ ать не­сколь­ко ком­ анд, отд­ е­ляя их вер­тик­ альн­ ой чер­той (|).EXINIT То же, что и VIMINIT.

196 Глава 10. Главные улучшения Vim по сравнению с vi VIM Со­дер­жит путь к сист­ емн­ ом­ у кат­ а­ло­гу, где нах­ од­ итс­ я инф­ орм­ а­ция о стан­дартн­ ой ус­та­новк­ е Vim (толь­ко для све­де­ния, в Vim не исп­ оль­ зуе­ т­ся). Ес­ли на комп­ ью­ т­ е­ре ус­тан­ ов­ле­но не­сколь­ко вер­сий Vim, то ком­ ан­да VIM, ско­рее все­го, бу­дет от­ра­жать разн­ ые зна­чен­ ия в за­вис­ и­мо­сти от зап­ ущ­ ен­ной польз­ о­ват­ е­лем верс­ ии. Нап­ рим­ ер, на ма­ши­не од­ног­ о из ав­тор­ ов вер­сия Cygwin ус­тан­ о­ви­ла пе­рем­ ен­ной VIM знач­ е­ние /usr/ sha­re/vim, то­гда как па­кет с vim.org ус­та­нов­ ил ее равн­ ой C:\Program Fil­es\Vim. Это важн­ о иметь в вид­ у во вре­мя пра­вок в фай­лах Vim, пос­ коль­ку при ред­ ак­тир­ ов­ ан­ ии не тех фай­лов ваш­ и из­мен­ е­ния не да­дут эф­ фек­та! VIMRUNTIME Ука­зы­вае­ т на фай­лы под­держ­ки Vim, так­ ие как он­лайн-док­ у­мент­ а­ ция, оп­ред­ ел­ ен­ ие синт­ ак­си­са и  ка­та­лог­ и с  пла­ги­нам­ и. Обычн­ о ре­ дак­тор сам об этом зна­ет. Есл­ и польз­ о­ват­ ель за­да­ет эту пер­ ем­ ен­ную, на­при­мер в файл­ е vimrc, то это мож­ ет выз­ вать ошибк­ и при ус­тан­ овк­ е бол­ ее нов­ ой вер­сии Vim, так как поль­зов­ ат­ ельс­ кая VIMRUNTIME мож­ ет ука­зы­вать на ста­рое, нес­ у­щес­ т­вую­щее или неп­ ра­вильн­ ое мес­ то.Новые команды перемещения В  Vim при­сутс­ тв­ ую­ т все ком­ анд­ ы пе­ре­ме­щен­ ия и  дви­же­ния vi, боль­ шая часть кот­ ор­ ых пер­ еч­ ис­ле­на в глав­ е 3, а так­же есть нов­ ые, при­ве­ денн­ ые в табл. 10.1. Таб­лиц­ а 10.1. Ко­манд­ ы пе­рем­ ещ­ е­ния Vim Ком­ ан­да Опис­ ан­ ие <C-End> Пе­ре­ход в кон­ ец файл­ а, то есть на пос­ лед­ний сим­вол по­след­ней <C-Home> стро­ки фай­ла. Ес­ли за­дать count, то прои­ зой­дет пе­рех­ од на по­ следн­ ий симв­ ол стро­ки count. count% Пер­ ех­ од на пер­вый не­про­бельн­ ый симв­ ол перв­ ой стро­ки фай­ла. Это отл­ и­чае­ т его от <C-End>, по­скольк­ у <C-Home> не пер­ е­мес­тит кур­ сор на проб­ ель­ный симв­ ол. Пер­ е­ход на count-й проц­ ент фай­ла; по­мещ­ ае­ т кур­сор на пер­вый пе­ ча­таем­ ый сим­вол стро­ки. Важн­ о отм­ ет­ ить, что Vim под­счит­ ыв­ а­ет про­цент, ос­нов­ ыв­ ая­ сь на ко­ли­че­ст­ве строк, а не сим­вол­ ов в фай­ле. Это мо­жет по­ка­зать­ся нев­ аж­ным, одн­ ак­ о рас­смотр­ им файл, сод­ ер­ жа­щий 200 строк, перв­ ые 195 из кот­ ор­ ых сос­ то­ят из пят­ и симв­ ол­ ов (на­при­мер, $4.98), а по­след­ние четыре – из 1 000 сим­во­лов. В UNIX, с учет­ ом симв­ ол­ а пер­ е­нос­ а строк­ и, файл со­держ­ ит при­мер­но (195 * (5 + 1)) (Чис­ло симв­ ол­ ов в перв­ ых 5-сим­воль­ных стро­ках)

Новые команды перемещения 197Ком­ анд­ а Опис­ ан­ ие:go n + 2 + (4 * (1000 + 1)) (Чис­ло симв­ ол­ ов в 1000-сим­воль­ных строк­ ах)n go или 5 200 сим­вол­ ов. Ре­аль­но 50% соо­ т­ветс­ тв­ у­ет поз­ и­ции на стро­ ке 96, тог­ да как 50%-е пе­ре­мещ­ ен­ ие в Vim пом­ ес­тит кур­сор на со­ тую строк­ у. Пер­ е­ход на n-й байт в бу­фе­ре. В расч­ ет бер­ утс­ я все сим­вол­ ы, вклю­ чая знак кон­ца стро­ки.Движение в визуальном режиме Vim по­зво­ля­ет поль­зов­ а­те­лям виз­ уа­ льн­ о опр­ е­дел­ ять выд­ е­ле­ние и про­ изв­ о­дить над ним ред­ ак­ти­ро­ва­ние. Это пох­ ож­ е на то, что можн­ о увид­ еть в гра­фич­ ес­ ких ре­дакт­ ор­ ах, ког­ да поль­зо­ват­ ель выд­ ел­ яе­ т обл­ ас­ти, щелк­ нув мышк­ ой в од­ном мест­ е и пе­ре­тащ­ ив ее в друг­ ое. Виз­ у­аль­ный ре­жим Vim доб­ ав­ля­ет удоб­ст­ва в ра­бо­те, ото­бра­жая выд­ е­ленн­ ый ку­сок тек­ста, над кот­ ор­ ым прои­ з­вод­ ятс­ я ка­кие-ли­бо дей­ст­вия, а такж­ е дей­ст­вие всех тех мощ­ных ком­ анд Vim, ко­то­рые прои­ з­во­дят из­мен­ ен­ ия в  ви­зу­альн­ о вы­де­лен­ном тек­сте. Это по­звол­ ит прод­ е­лы­вать нам­ но­го бо­лее изощ­ рен­ ную ра­бо­ту над вы­де­ленн­ ым тек­стом, неж­ ел­ и трад­ иц­ и­он­ные ком­ ан­ды «вы­ре­зать» и «встав­ ить» в мен­ ее прод­ вин­ у­тых ред­ акт­ о­рах. Вы­дел­ ять текст в Vim можн­ о те­ми же спо­со­бам­ и, что и в друг­ их ред­ ак­ тор­ ах, то есть указ­ ыв­ ая обл­ асть мыш­ ью. Од­нак­ о кро­ме это­го сущ­ е­ст­ву­ ют пол­ ез­ные ком­ ан­ды пе­рем­ е­ще­ния и нек­ от­ ор­ ые спец­ и­аль­ные ко­ман­ды для ви­зу­аль­ног­ о реж­ им­ а, поз­ во­ляю­щие за­дать ви­зу­аль­ное вы­де­ле­ние. Нап­ ри­мер, мож­но в  обыч­ном реж­ и­ме вве­сти v, по­сле че­го за­пуст­ ит­ся виз­ уа­ льн­ ый реж­ им. При нах­ о­жд­ е­нии в нем лю­бая ком­ анд­ а пе­рем­ е­ще­ ния пер­ ед­ виг­ ае­ т кур­сор и подс­ веч­ ив­ а­ет текст по ме­ре то­го, как курс­ ор пе­ре­хо­дит на но­вую по­зиц­ ию. Так, ко­ман­да «на сле­дующ­ ее сло­во» (w) в ви­зуа­ ль­ном реж­ и­ме пер­ ем­ ест­ ит кур­сор на сле­дую­щее слов­ о и подс­ ве­ тит вы­де­лен­ный текст. Друг­ ие пер­ ем­ е­щен­ ия такж­ е рас­шир­ ят выд­ ел­ ен­ ный фрагм­ ент. В  виз­ уа­ льн­ ом реж­ и­ме Vim исп­ ольз­ уе­ т спе­ци­альн­ ые ком­ ан­ды, с  пом­ о­ щью ко­то­рых удоб­но расш­ и­рять вы­де­лен­ный текст, выб­ и­рая тек­стов­ ый объе­ кт, ок­ру­жающ­ ий курс­ ор. На­при­мер, кур­сор мож­ ет нах­ о­дитьс­ я внут­ ри «слов­ а», одн­ о­врем­ енн­ о внутр­ и «пред­лож­ е­ния» и, на­ко­нец, в «абзаце». С  по­мо­щью ком­ анд, расш­ и­ряющ­ их подс­ веч­ ен­ный текст до тек­сто­во­го объ­ек­та, Vim по­зво­лит уве­лич­ ить виз­ уа­ ль­ное выд­ ел­ ен­ ие. Для виз­ у­аль­ но­го выд­ е­ле­ния сло­ва можн­ о ис­поль­зов­ ать aw (в ви­зу­альн­ ом реж­ им­ е). Vim пред­ла­га­ет раз­лич­ные ко­манд­ ы пер­ ем­ ещ­ е­ния, исп­ оль­зующ­ ие пре­ имущ­ е­ст­ва «виз­ у­альн­ ог­ о ре­жим­ а», ко­тор­ ый под­све­чи­вае­ т строк­ и и сим­ во­лы в буф­ е­ре, на­глядн­ о по­каз­ ы­вая, как­ ой имен­но текст бу­дет под­вер­ гать­ся дальн­ ей­шим дей­ств­ ия­ м Vim. Виз­ у­альн­ ые об­ласт­ и в бу­фе­ре мож­ но подс­ ве­чив­ ать не­сколь­ким­ и спо­соб­ ам­ и. В  тек­стов­ ом ре­жим­ е про­сто введ­ и­те v для пер­ е­хо­да в  виз­ у­аль­ный ре­жим и  вы­хо­да из не­го. При

198 Глава 10. Главные улучшения Vim по сравнению с vi вклю­ченн­ ом виз­ у­аль­ном ре­жи­ме при пе­рем­ ещ­ е­нии курс­ ор­ а в  буф­ е­ре поя­ вл­ я­ет­ся и под­свеч­ и­вае­ тс­ я выд­ ел­ ен­ ие. В gvim мож­но прос­ то вы­дел­ ять текст мыш­ ью. Это уст­ ан­ о­вит виз­ у­альн­ ый флаг Vim. В табл. 10.2 пок­ аз­ а­ны нек­ от­ о­рые ко­манд­ ы Vim для пе­рем­ ещ­ ен­ ия в ви­ зуа­ ль­ном реж­ им­ е. Табл­ иц­ а 10.2. Ко­манд­ ы для пе­ре­ме­ще­ния в виз­ у­аль­ном ре­жи­ме Vim Ком­ анд­ а Опис­ а­ние countaw, countaW Вы­дел­ я­ет count слов, включ­ ая, есл­ и при­сутс­ т­ву­ет, проб­ ель­ countiw, countiW ный симв­ ол. Это не­мног­ о отл­ ич­ ае­ т­ся от iw (см. сле­дующ­ ий пункт). Строч­ная w ищет слов­ а, разд­ е­лен­ные зна­ка­ми пре­ as, is пин­ ан­ ия, а про­пис­ная W ищет слов­ а, раз­дел­ енн­ ые про­бель­ ap, ip ны­ми сим­вол­ ам­ и. Выб­ и­рае­ т count слов. До­бав­ляе­ т сло­ва без проб­ ель­ных сим­ вол­ ов. Строчн­ ая w ищет сло­ва, ог­ран­ и­чен­ные знак­ ам­ и пре­ пин­ ан­ ия, а проп­ ис­ная W – проб­ ельн­ ы­ми сим­вол­ ам­ и. До­бавл­ я­ет предл­ ож­ е­ние или внутр­ енн­ ееa пред­лож­ ен­ ие. Доб­ ав­ляе­ т абзац или внут­рен­ний абзац. a «Внутр­ ен­ним» явл­ яе­ тс­ я сам текс­ тов­ ый объ­ект без ок­руж­ ающ­ их его неп­ е­ чат­ ае­мых и т. п. симв­ о­лов. – Прим. нау­ ч. ред. Для по­лу­че­ния подр­ обн­ ой инф­ ор­ма­ции о текс­ то­вых объе­ к­тах и их ис­ поль­зов­ а­нии в виз­ у­аль­ном реж­ и­ме восп­ оль­зуй­тесь ко­манд­ ой справк­ и: :help text-objectsРасширенные регулярные выражения Из всех мод­ и­фик­ а­ций vi Vim пре­дос­тав­ляе­ т са­мый бог­ ат­ ый наб­ ор функ­ ций для раб­ от­ ы с  ре­гу­лярн­ ым­ и вы­ра­же­ния­ми. Больш­ ая часть текс­ та опис­ ан­ ия в ни­же­прив­ ед­ ен­ном спи­ске взят­ а из док­ у­мент­ а­ции Vim: \| Указ­ ы­вае­ т на вар­ и­ан­ты (house\|home). \+ Со­отв­ ет­ств­ ие од­ном­ у или бол­ ее предш­ е­ст­вующ­ им ре­гул­ яр­ным вы­ ра­жен­ ия­ м. \= Со­от­вет­ств­ ие одн­ ом­ у или ни одн­ ом­ у из пред­шес­ т­вующ­ их рег­ ул­ яр­ ных выр­ аж­ ен­ ий. \{n,m} Соо­ тв­ етс­ тв­ ие мак­сим­ аль­ном­ у ко­лич­ е­ств­ у предш­ ес­ тв­ ую­щих ре­гу­ляр­ ных выр­ а­же­ний в диа­па­зо­не от n до m. n и m – это числ­ а от 0 до 32 000.

Расширенные регулярные выражения 199 Vim тре­бу­ет, что­бы обр­ ат­ная кос­ ая чер­та стоя­ла толь­ко пе­ред лев­ ой фи­гурн­ ой скоб­кой, а не пе­ред прав­ ой.\{n} Соо­ тв­ етс­ т­вие n предш­ е­ств­ ую­щим ре­гу­лярн­ ым выр­ а­же­ни­ям.\{n,} Соо­ тв­ етс­ т­вие как можн­ о боль­ше­му кол­ ич­ е­ств­ у пред­шес­ т­вую­щих ре­гул­ ярн­ ых вы­раж­ ен­ ий, но не мень­ше n.\{,m} Соо­ т­ветс­ тв­ ие как можн­ о больш­ ем­ у кол­ ич­ е­ств­ у предш­ ес­ т­вую­щих ре­гу­лярн­ ых выр­ аж­ е­ний в диап­ а­зон­ е от 0 до m.\{} Со­отв­ етс­ тв­ ие как можн­ о больш­ е­му ко­лич­ е­ст­ву предш­ ес­ тв­ ую­щих рег­ ул­ яр­ных вы­ра­жен­ ий, нач­ ин­ ая от ну­ля (ана­ло­гич­но *).\{-n,m} Соо­ тв­ етс­ тв­ ие мин­ им­ аль­но­му ко­ли­че­ст­ву пред­ше­ст­вую­щих ре­гу­ляр­ ных выр­ аж­ е­ний в диап­ аз­ о­не от n до m.\{-n} Со­отв­ етс­ т­вие n предш­ е­ств­ ующ­ им ре­гул­ ярн­ ым вы­ра­жен­ ия­ м.\{-n,} Со­от­ветс­ тв­ ие наим­ ень­ше­му ко­ли­чес­ т­ву пред­ше­ст­вую­щих рег­ у­ляр­ ных выр­ аж­ ен­ ий, но не мень­ше n.\{-,m} Соо­ тв­ ет­ств­ ие наим­ ень­ше­му ко­лич­ е­ств­ у предш­ ес­ т­вую­щих рег­ у­ляр­ ных выр­ а­же­ний в диап­ а­зон­ е от 0 до m.\i Соо­ т­ветс­ т­вие люб­ о­му симв­ ол­ у идент­ иф­ и­кат­ о­ра сог­ лас­но опц­ ии isi­ dent.\I Под­ обн­ а \i, но иск­ лю­чае­ т циф­ры.\k Соо­ т­вет­ст­вие лю­бо­му ключ­ е­вом­ у сло­ву со­глас­но опц­ ии iskeyword.\K По­добн­ а \k, но ис­ключ­ ае­ т циф­ры.\f Со­отв­ ет­ст­вие люб­ о­му симв­ ол­ у имен­ и фай­ла сог­ лас­но оп­ции isfname.\F Под­ обн­ а \f, но иск­ лю­чае­ т цифр­ ы.

200 Глава 10. Главные улучшения Vim по сравнению с vi \p Со­от­вет­ств­ ие лю­бом­ у пе­чат­ ае­мом­ у симв­ о­лу со­глас­но оп­ции isprint. \P Под­ обн­ а \p, но ис­клю­ча­ет цифр­ ы. \s Соо­ т­ветс­ тв­ ие лю­бо­му проб­ ельн­ о­му симв­ о­лу (то есть проб­ ел­ у или та­ бул­ я­ции). \S Со­от­ветс­ тв­ у­ет все­му, что не явл­ яе­ тс­ я про­бе­лом или та­бу­ля­цие­ й. \b Симв­ ол заб­ оя (Backspace). \e Escape. \r Воз­врат кар­ етк­ и. \t Та­бу­ля­ция. \n Зар­ ез­ ер­вир­ о­ван­ а для буд­ у­щег­ о исп­ оль­зо­ва­ния1. В конц­ е конц­ ов бу­ дет исп­ оль­зов­ атьс­ я для мно­го­строчн­ ых шаб­ло­нов. За подр­ об­нос­ тя­ ми об­ращ­ ай­тесь к док­ у­мент­ ац­ ии по Vim. ~ Со­отв­ етс­ т­вие по­след­ней ис­поль­зо­вавш­ ейс­ я строк­ е за­ме­ны. \(…\) Обес­печ­ ив­ а­ет групп­ и­ров­ку для *, \+ и \=, а так­же де­ла­ет дост­ уп­ным под­текст в ко­манд­ е зам­ е­ны (\1, \2 и т. д.). \1 Соо­ тв­ етс­ тв­ у­ет той же строк­ е, ко­то­рая со­отв­ ет­ств­ о­ва­ла пер­во­му под­ вы­раж­ ен­ ию в \( и \). На­прим­ ер, \([a-z]\).\1 со­от­ветс­ т­вуе­ т ata, ehe, tot и т. д. \2, \3 и проч­ ие мог­ ут исп­ ольз­ о­вать­ся для со­от­ветс­ тв­ ия вто­ро­ му, третье­ му и пос­ лед­ ующ­ им под­выр­ а­жен­ ия­ м. Оп­ции isident, iskeyword, isfname и isprint оп­ре­дел­ я­ют печ­ а­таем­ ые сим­ во­лы, со­держ­ а­щие­ся в  иден­тиф­ и­ка­тор­ ах, клю­чев­ ых слов­ ах и  име­нах файл­ ов. Исп­ оль­зо­ван­ ие этих опц­ ий прид­ а­ет рег­ ул­ ярн­ ым вы­раж­ е­ния­ м еще больш­ е гиб­ко­сти. 1 В вер­сии Vim 7.3 этот ме­тас­ имв­ ол уже раб­ о­то­спос­ об­ ен. – Прим. на­уч. ред.


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