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

Редактирование двоичных файлов 321ния. На­при­мер, циф­ров­ ые кам­ ер­ ы част­ о хра­нят изоб­ ра­же­ния в фор­ма­теJPEG – сжа­том дво­ичн­ ом файл­ е для циф­ро­вых фо­то­граф­ ий. Хоть онии дво­ичн­ ые, но со­дер­жат хор­ ош­ о опр­ ед­ е­ленн­ ые раз­де­лы (или блок­ и), гдехра­нитс­ я стан­дарт­ная инф­ орм­ а­ция (фай­лы со­держ­ ат их, ес­ли со­от­вет­ст­вую­ т спе­циф­ и­кац­ ии). Цифр­ о­вые изо­бра­жен­ ия в форм­ ат­ е JPEG сод­ ер­жат ме­та-инф­ орм­ ац­ ию об изо­браж­ ен­ ии (врем­ я, разр­ е­шен­ ие, нас­ трой­кикам­ е­ры, да­та и  проч­ ее) в  зар­ е­зерв­ ир­ ов­ анн­ ых бло­ках, отд­ е­лен­ных отсоб­ст­вен­но сжа­тых данн­ ых изоб­ раж­ е­ния. Практ­ ич­ е­ским при­мен­ е­ние­ мфунк­ции ре­дак­тир­ о­ва­ния дво­ичн­ ых фай­лов в Vim мож­ ет стать ис­прав­ле­ние по­ля год (year) в блок­ е «соз­дан­ о» в ка­тал­ ог­ е снимк­ ов JPEG дляиз­ме­не­ния пол­ я «да­та созд­ ан­ ия».На рис. 15.1 пок­ аз­ ан сеа­ нс ред­ ак­ти­ров­ а­ния фай­ла JPEG. Об­рат­ и­те вни­ман­ ие, как расп­ ол­ ож­ ен курс­ ор в пол­ е да­ты. Из­мен­ ив эти пол­ я, мож­новручн­ ую ред­ ак­ти­ро­вать ин­фор­ма­цию об изо­браж­ е­нии.Рис. 15.1. Ре­дак­ти­ров­ ан­ ие двои­ ч­ног­ о файл­ а JPEGДля опыт­ных польз­ ов­ ат­ ел­ ей, знак­ ом­ ых с конк­ рет­ным дво­ичн­ ым фор­мат­ ом, Vim мо­жет стать чрезв­ ыч­ айн­ о по­лез­ным для неп­ о­средс­ тв­ ен­ног­ оисп­ равл­ ен­ ия, ина­че при­детс­ я обр­ а­щать­ся к  скучн­ ой по­втор­ яющ­ ейс­ яра­бо­те в дру­гих про­грам­мах.Сущ­ е­ств­ уе­ т два спос­ об­ а от­ред­ ак­ти­ров­ ать двои­ ч­ный файл. Можн­ о в ко­манд­ной строк­ е Vim ус­тан­ о­вить опц­ ию binary: set binaryИли за­пус­тить Vim с опц­ ие­ й -b.Что­бы обл­ ег­чить дво­ичн­ ое ре­дакт­ ир­ о­ван­ ие и защ­ ит­ ить файл от порч­ исо стор­ он­ ы Vim, про­грам­ма де­ла­ет след­ ующ­ ее:• Опц­ ии textwidth и wrapmargin уст­ ан­ авл­ ив­ аю­ тс­ я рав­ным­ и 0. Это пре­ дот­вра­ща­ет встав­ку в файл по­бочн­ ых симв­ о­лов нов­ ой строк­ и.• Опц­ ии modeline и  expandtab сбра­сыв­ аю­ тс­ я (nomodeline и  noexpandtab). Это пре­дот­вра­щае­ т разв­ о­рач­ ив­ а­ние таб­ ул­ я­ций в проб­ ел­ ы shiftwidth

322 Глава 15. Другие полезности в Vim и инт­ ер­пре­тир­ о­ва­ние ко­манд в строк­ е modeline1, что по­тен­ци­аль­но мож­ ет ус­та­но­вить оп­ции, прив­ од­ ящ­ ие к нео­ жи­данн­ ым и не­нужн­ ым по­бочн­ ым эф­фек­там. В дво­ич­ном реж­ и­ме при пер­ е­ход­ е от ок­на к ок­ну или от буф­ е­ра к бу­ фе­ру будьт­ е вним­ ат­ ель­ны. Vim ис­поль­зуе­ т со­бы­тия вход­ а и вых­ о­да для за­дан­ ия и уст­ а­новк­ и оп­ций и мож­ ет не­нар­ о­ком сбро­сить нек­ о­ тор­ ые из толь­ко что пе­ре­чис­лен­ных защ­ ит­ных ус­тан­ ов­ ок. При ре­ дакт­ ир­ о­ван­ ии двои­ чн­ ых фай­лов мы рек­ ом­ енд­ у­ем поль­зо­ватьс­ я одно­оконн­ ым, одн­ о­бу­фер­ным реж­ им­ ом.Диграфы: не-ASCII символы По­лаг­ ае­те, ав­тор «Мес­сии» – George Frideric Händel (Гео­ рг Фридр­ их Ген­дель), а не George Frideric Handel? Счи­тает­ е, что ва­ше résumé пе­ре­ дае­ т боль­ше, чем resume? Ис­поль­зуй­те ди­граф­ ы в Vim для вво­да спец­ и­ альн­ ых симв­ о­лов. Даж­ е в текс­ те на анг­лийс­ ком язык­ е иног­ да встреч­ аю­ т­ся спец­ иа­ ль­ные симв­ ол­ ы, осо­бен­но в ссыл­ках на глоб­ а­лиз­ ов­ анн­ ый мир. Тек­стов­ ые фай­ лы на дру­гих язы­ках треб­ ую­ т куч­ у спец­ иа­ ль­ных симв­ о­лов. Vim поз­ вол­ яе­ т вве­сти спе­ци­альн­ ый симв­ ол нес­ коль­ким­ и спос­ о­ба­ми, два из кот­ ор­ ых ин­туит­ ивн­ ы и про­сты. Оба опи­ра­ютс­ я на опр­ е­дел­ ен­ ие ди­граф­ а чер­ ез пре­фикс (CTRL-K) или исп­ ольз­ ую­ т кла­виш­ у BS (Back­ space) меж­ду дву­мя симв­ о­ла­ми клав­ иат­ ур­ ы. (Друг­ ие ме­то­ды боль­ше подх­ од­ ят при вво­де симв­ о­лов по их «сыр­ ым» чи­сло­вым зна­че­ния­ м, за­ данн­ ым в  вид­ е дес­ ят­ ичн­ о­го, ше­стн­ ад­ цат­ ер­ ич­ног­ о или вось­ме­ричн­ о­го чис­ла. Эти мощ­ные ме­тод­ ы сам­ и по се­бе не обес­пе­чив­ аю­ т прос­ той мне­ мон­ ик­ и диг­ раф­ ов.) Тер­мин ди­граф тра­диц­ ио­ нн­ о опи­сыв­ ае­ т двухб­ ук­ ­венн­ ое соч­ ет­ ан­ ие, пред­ставл­ яющ­ ее един­ ый фон­ ет­ ич­ е­ский звук, нап­ ри­мер ph в «di­ graph» или «phonetic». Vim пе­рен­ ял по­ня­тие «двух­бу­к­венн­ ог­ о» со­ че­та­ния для опис­ ан­ ия ме­ха­низм­ а ввод­ а сим­вол­ ов со спец­ иа­ льн­ ы­ми ха­рак­те­рис­ ти­кам­ и, как пра­ви­ло, уда­рен­ ие­ м и друг­ и­ми знак­ ам­ и, на­ прим­ ер умл­ яу­том в ä. Эти спе­ци­аль­ные знак­ и прав­ иль­но на­зыв­ а­ют­ ся ди­ак­ри­ти­кой, или диа­ к­рит­ и­че­ски­ми зна­кам­ и. Друг­ им­ и сло­ва­ ми, Vim ис­поль­зу­ет ди­граф­ ы для созд­ ан­ ия диа­ кр­ и­ти­ки. Мы рад­ ы, что смог­ли это объя­ сн­ ить. Перв­ ый мет­ од ввод­ а ди­ак­ри­тик­ и – это трехб­ у­к­вен­ное соч­ е­та­ние, со­дер­ жащ­ ее CTRL-K, ба­зо­вый симв­ ол и знак пре­пин­ а­ния, указ­ ы­ваю­щий на 1 Осо­бым обр­ а­зом отф­ орм­ ат­ ир­ ов­ анн­ ый комм­ ент­ ар­ ий, встав­ляем­ ый в ред­ ак­ тир­ уем­ ый файл, что­бы оп­ре­де­лить спе­циф­ ич­ные для нег­ о на­строй­ки (ве­ли­ чи­ну отс­ туп­ а и т. п.). – Прим. на­уч. ред.

Диграфы: не-ASCII символы 323ак­цент или знак, ко­тор­ ый нужн­ о по­ста­вить. На­прим­ ер, чтоб­ ы на­брать«c» с  сед­ и­лем (ç), введ­ ит­ е CTRL-K c,. Для созд­ ан­ ия «a» с  гра­ви­сом (à)вве­дит­ е CTRL-K a!.Гре­чес­ кие бук­ в­ ы мож­но на­брать по со­отв­ етс­ тв­ ующ­ ей лат­ ин­ской бук­ ­ве,по­сле ко­то­рой над­ о ввес­ ти звез­доч­ку (на­прим­ ер, вве­ди­те CTRL-K p* длястроч­ной ). Русс­ кие бук­ ­вы можн­ о созд­ ать по со­от­вет­ств­ ую­щей лат­ ин­ской, пос­ ле ко­то­рой сле­ду­ет пос­ тав­ ить знак рав­но1 или, в  нек­ от­ о­рыхслу­ча­ях, знак про­цен­та. Ис­поль­зуйт­ е CTRL-K ?I (убед­ и­тесь, что I про­писн­ ая) для ввод­ а пер­ е­верн­ у­тог­ о зна­ка воп­ рос­ а (¿) и CTRL-K ss, чтоб­ ыввес­ ти не­мец­кий эсц­ ет (ß).Что­бы ис­польз­ ов­ ать вто­рой мет­ од Vim, уст­ ан­ ов­ и­те оп­цию digraph: set digraphТе­перь соз­дай­те спец­ иа­ ль­ный симв­ ол, введ­ я пер­вый симв­ ол двухс­ им­воль­ной комб­ и­нац­ ии, зат­ ем backspace (BS), а пос­ ле этого – знак пре­пи­на­ния, за­даю­щий знак. Так, для ç вве­ди­те cBS,, а для à – aBS!.Уст­ ан­ ов­ка оп­ции digraph не ме­ша­ет вам вво­дить ди­гра­фы ме­тод­ омCTRL-K. Пол­ аг­ атьс­ я толь­ко на мет­ од CTRL-K стои­ т, ес­ли ва­ши на­вы­кина­бор­ а не осо­бо вы­дающ­ ие­ся. Инач­ е вы мо­жет­ е обн­ ар­ уж­ ить, что не­пред­на­ме­ренн­ о ввод­ ит­ е диг­ ра­фы из-за исп­ оль­зо­ван­ ия Backspace при ис­прав­ле­нии оши­бок.На­бер­ ит­ е ком­ ан­ду :digraph, чтоб­ ы по­ка­зать все уст­ ан­ ов­ки по умол­ча­нию; бо­лее подр­ об­ное опи­са­ние мож­но пол­ уч­ ить с  по­мо­щью :help di­graph-table. Рисунок  15.2 пок­ аз­ ы­ва­ет час­тич­ный спи­сок от ко­ман­дыdigraph.Рис. 15.2. Диг­ ра­фы в Vim1 Раз­ ум­ е­етс­ я, как русс­ ко­го­во­ря­щий поль­зо­ват­ ель, вы мо­же­те про­сто пе­ре­ ключ­ ить рас­клад­ку клав­ иа­тур­ ы. – Прим. на­уч. ред.

324 Глава 15. Другие полезности в Vim В  выв­ о­де каж­дый диг­ раф digraph предс­ тавл­ ен тре­мя столбц­ а­ми. Дис­ плей нем­ но­го «ком­ка­ет­ся», пос­ коль­ку Vim «вти­скив­ а­ет» стольк­ о трех­ столб­цо­вых комб­ ин­ ац­ ий в каж­дой стро­ке, скольк­ о по­зво­лит эк­ран. Для кажд­ ой из групп перв­ ый стол­бец по­ка­зы­вае­ т двух­симв­ ольн­ ую комб­ и­ на­цию ди­гра­фа, второй – сам ди­граф, а третий – дес­ я­тичн­ ое зна­че­ние Unicode для ди­граф­ а. Для удобс­ тв­ а в табл. 15.1 прив­ ед­ е­ны зна­ки пре­пин­ ан­ ия, ис­польз­ уе­мые в  кач­ е­ств­ е по­след­нег­ о симв­ ол­ а в  пос­ ле­дов­ ат­ ельн­ о­сти, для наиб­ о­лее упот­реб­ ит­ ельн­ ых удар­ ен­ ий и диа­ к­ри­ти­чес­ ких зна­ков. Таб­лиц­ а 15.1. Как вво­дить ак­цен­ты и дру­гие зна­ки Знак Симв­ ол, ввод­ и­мый как часть ди­граф­ а Акут (fiancé) Апос­ т­роф (') Знак кратк­ ос­ ти (publica˘) Лев­ ая скобк­ а ( Гач­ ек (Dubcˇek) Знак меньш­ е (<) Се­диль (français) Зап­ ят­ ая (,) Цирк­ ум­флекс (portugus) Знак больш­ е (>) Гра­вис (voilà) Воск­ лиц­ а­тель­ный знак (!) Макр­ он (%tm%) Мин­ ус (-) Пе­реч­ ер­ки­ва­ние (Søren) Ко­сая чер­та (/) Тиль­да (señor) Во­про­си­тельн­ ый знак (?) Ум­ля­ут или дие­рез­ ис (Noël) Двоет­ о­чие (:)Редактирование файлов из других мест Благ­ од­ ар­ я глад­кой инт­ е­гра­ции се­те­вых прот­ о­ко­лов Vim по­звол­ яе­ т ре­ дакт­ и­ро­вать файл­ ы на удал­ ен­ных ма­шин­ ах, как есл­ и бы они был­ и на ло­каль­ном комп­ ью­ ­тер­ е! Есл­ и вы прос­ то укаж­ е­те URL вме­сто име­ни файл­ а, Vim от­крое­ т его в окн­ е и зап­ иш­ ет изм­ е­не­ния на уда­лен­ную сис­ тем­ у (ко­неч­но, при на­лич­ ии прав дос­туп­ а). Нап­ ри­мер, след­ ующ­ ая ко­ манд­ а ре­дак­ти­ру­ет файл .vimrc, прин­ ад­ле­жа­щий поль­зов­ ат­ ел­ ю ehannah на сист­ е­ме mozart. Удал­ ен­ная маш­ ин­ а пред­ ост­ ав­ля­ет безо­ пас­ный дос­ туп по про­ток­ о­лу SSH на пор­ту 122 (это нес­ тан­дарт­ный порт, что дае­ т еще больш­ е за­щит­ ы из-за неи­ з­вест­нос­ти): $ vim scp://ehannah@mozart:122//home/ehannah/.vimrc По­сколь­ку мы ред­ акт­ ир­ у­ем файл в дом­ ашн­ ем ка­та­лог­ е ehannah на уда­ лен­ной ма­шин­ е, то мож­ ем сок­ ра­тить URL, исп­ ольз­ уя прос­ тое имя фай­ ла. Оно рас­сматр­ и­вае­ т­ся как путь по отн­ ош­ ен­ ию к дом­ аш­нем­ у кат­ а­ло­ гу польз­ ов­ а­тел­ я на удал­ ен­ной сист­ е­ме: $ vim scp://ehannah@mozart:122/.vimrc Рас­смот­рим URL отд­ ель­но и изу­чим за­пись URL для кон­кретн­ о­го окр­ у­ жен­ ия:

Редактирование файлов из других мест 325scp: Пер­вая часть, до двоет­ оч­ ия, пред­ставл­ я­ет трансп­ орт­ный про­то­кол. В этом при­мер­ е им яв­ляе­ т­ся scp – прот­ ок­ ол коп­ и­ров­ ан­ ия фай­лов, ос­ но­ван­ный на про­то­ко­ле SSH (Secure Shell). По­сле­дующ­ ее двое­точ­ ие (:) обя­за­тель­но.// Пред­вар­ яе­ т инф­ орм­ а­цию о хос­те, ко­тор­ ая в боль­шинс­ т­ве транс­порт­ ных про­ток­ о­лов имее­ т вид [user@]hostname[:port].ehannah@ Эта часть не­обя­за­тель­на. Для без­опас­ных прот­ ок­ о­лов, так­ их как scp, опр­ ед­ ел­ я­ет, ка­ког­ о польз­ о­ват­ е­ля за­рег­ ис­ тр­ ир­ ов­ ать как удал­ ен­ ног­ о польз­ ов­ а­тел­ я. Ес­ли ее опус­тить, по умол­ча­нию буд­ ет исп­ оль­зо­ ватьс­ я имя поль­зо­ва­те­ля на лок­ альн­ ой маш­ ин­ е. На за­прос вве­сти пар­ оль след­ уе­ т вве­сти па­роль поль­зо­ват­ ел­ я на уда­лен­ной маш­ ин­ е.mozart Это сим­вол­ и­чес­ кое имя удал­ ен­ной маш­ ин­ ы, ко­тор­ ое можн­ о зад­ ать и в цифр­ ов­ ом вид­ е, на­при­мер 192.168.1.106.:122 Эта нео­ бяз­ а­тельн­ ая часть зад­ а­ет порт, на ко­то­ром об­служ­ ив­ а­ет­ся про­ток­ ол. Но­мер порт­ а от­де­ляе­ тс­ я от предш­ ес­ т­вующ­ е­го имен­ и хос­та двое­точ­ ие­ м. Все станд­ арт­ные про­то­кол­ ы ис­польз­ ую­ т вполн­ е опр­ ед­ е­ лен­ные пор­ты, так что обыч­но этот эле­мент URL мож­но опуст­ ить. В наш­ ем при­ме­ре порт 122 не явл­ яе­ тс­ я станд­ арт­ным для про­ток­ о­ла scp. Та­ким обр­ аз­ ом, по­сколь­ку адм­ ин­ ис­ т­ра­тор сист­ ем­ ы mozart раз­ мес­тил серв­ ис на порт­ у 122, та­кое указ­ ан­ ие обяз­ а­тель­но.//home/ehannah/.vimrc Это файл на уда­лен­ной маш­ ин­ е, ко­тор­ ый мы хот­ им отр­ ед­ акт­ и­ро­ вать. На­чин­ а­етс­ я с двойн­ ой кос­ ой чер­ты, пос­ кольк­ у мы за­дае­ м аб­со­ лют­ный путь. Отн­ ос­ ит­ ельн­ ый путь или про­сто имя файл­ а треб­ у­ет тольк­ о оди­нарн­ ой ко­сой черт­ ы, отд­ е­ляющ­ ей имя фай­ла от име­ни хост­ а. Отн­ о­сит­ ель­ный путь бе­ретс­ я отн­ ос­ ит­ ельн­ о до­маш­не­го ка­та­ ло­га поль­зов­ а­те­ля, под кот­ о­рым был вы­полн­ ен вход в сист­ е­му. Так, в  наш­ ем при­мер­ е от­но­сит­ ельн­ ый путь бу­дет братьс­ я отн­ ос­ и­тель­но дом­ ашн­ ег­ о ка­тал­ ог­ а ehannah, на­прим­ ер /home/ehannah.Ниж­ е при­вед­ ен част­ ич­ный спис­ ок под­держ­ и­ваем­ ых про­ток­ ол­ ов:• ftp: и sftp: (обычн­ ый FTP и без­опас­ный FTP).• scp: (безо­ пасн­ ое удал­ ен­ное коп­ и­ро­ван­ ие по SSH).• http: (пе­ред­ а­ча файл­ а по стан­дарт­но­му про­ток­ ол­ у брау­зер­ а).• dav: (срав­нит­ ель­но нов­ ый, но поп­ у­ляр­ный от­кры­тый станд­ арт для пе­ред­ ач­ и че­рез веб).• rcp: (удал­ ен­ное коп­ ир­ о­ва­ние).

326 Глава 15. Другие полезности в Vim Вы­ше­сказ­ анн­ ог­ о дост­ ат­ оч­но для по­лу­чен­ ия раз­ре­ше­ния на уда­лен­ное ред­ ак­ти­ров­ а­ние, од­нак­ о сам проц­ есс мо­жет быть ме­нее проз­ рач­ным, чем ред­ ак­тир­ о­ва­ние ло­кальн­ о­го файл­ а. То есть из-за про­меж­ ут­ очн­ ог­ о треб­ ов­ ан­ ия пе­рем­ ещ­ ать данн­ ые с удал­ ен­ног­ о хос­та вас мог­ ут поп­ рос­ ить вве­сти пар­ оль во вре­мя ра­бот­ ы. Это спос­ обн­ о уто­мить, осо­бен­но ес­ли вы прив­ ык­ли пе­рио­дич­ е­ски зап­ ис­ ыв­ ать файл на диск при ред­ ак­тир­ о­ва­ нии, по­скольк­ у каж­дое из так­ их «со­хран­ е­ний» пре­ры­вае­ т­ся вво­дом па­ ро­ля для за­вер­шен­ ия пе­ре­дач­ и. Все трансп­ орт­ные про­то­ко­лы из выш­ еп­ ри­ве­ден­ног­ о спис­ ка по­зво­ляю­ т нас­ траи­вать служб­ у так, что­бы дос­туп был бес­па­роль­ным, од­нак­ о де­та­ ли это­го проц­ ес­са буд­ ут отл­ ич­ атьс­ я. За подр­ обн­ о­стям­ и и на­строй­кам­ и кажд­ ог­ о конк­ рет­ног­ о про­ток­ о­ла обр­ ат­ и­тесь к док­ у­мент­ а­ции служ­бы.Переход и смена каталогов Ес­ли вы дол­го польз­ ует­ есь Vim, то, воз­мож­но, уже обн­ а­руж­ и­ли, что он по­зво­ля­ет прос­ матр­ ив­ ать кат­ а­лог­ и и пер­ ем­ ещ­ атьс­ я по ним с исп­ оль­зо­ ва­ни­ем клав­ иш, прим­ ен­ яе­мых в файл­ ах. Расс­ мотр­ им кат­ ал­ ог ex-050325, со­дер­жа­щий мно­же­ст­во файл­ ов .c (это ка­та­лог с комп­ ил­ ир­ уе­мы­ми ис­ход­ник­ а­ми для ори­гин­ альн­ ог­ о ре­дакт­ о­ ра vi). От­ре­дак­тир­ уй­те ex-050325 с по­мощ­ ью: $ vim ex-050325 На рис.  15.3 предс­ тавл­ ен­ а часть снимк­ а экр­ а­на, пок­ а­зы­вающ­ ая при­ мерн­ о то, что вы мо­жет­ е увид­ еть. Vim отоб­ раж­ а­ет ин­форм­ ац­ ию трех тип­ ов: вводн­ ые комм­ ент­ а­рии (пе­ред ним­ и сто­ят знак­ и ра­венс­ т­ва), кат­ ал­ ог­ и (по­сле имен­ и ка­та­ло­га стои­ т ко­ сая черт­ а) и файл­ ы. Кажд­ ый ка­та­лог или файл выв­ од­ ит­ся в сво­ей стро­ке. Есть мног­ о спос­ о­бов ис­польз­ ов­ ать эту особ­ енн­ ость, одн­ а­ко при по­мощ­ и станд­ арт­ных ко­манд пе­ре­ме­ще­ния Vim (на­при­мер, w для пе­рех­ о­да на сле­дующ­ ее слов­ о, j или стрелк­ и вниз для пе­рех­ од­ а на стро­ку ниж­ е и т. д.) и клик­ ов мы­шью по эле­мен­там можн­ о дост­ ат­ оч­но быс­ тр­ о и инт­ уи­тивн­ о дост­ ичь вы­сок­ ой про­дук­тивн­ о­сти при мин­ им­ аль­ных усил­ ия­ х. Рас­смотр­ им не­ко­тор­ ые особ­ ен­нос­ ти реж­ и­ма ка­тал­ ог­ ов: • Ког­ да курс­ ор сто­ит на име­ни ка­та­ло­га, на­жат­ ие ENTER пе­ре­ме­щае­ т внутрь этог­ о ка­тал­ ог­ а. • Ког­ да кур­сор стои­ т на име­ни фай­ла, на­жат­ ие ENTER от­кры­ва­ет этот файл для ред­ ак­тир­ ов­ ан­ ия. Есл­ и нужн­ о ос­тав­ ить ок­но с кат­ а­лог­ ам­ и для даль­нейш­ ей ра­бо­ты с фай­ла­ми, наж­ ат­ и­ем o отк­ рой­те файл под курс­ ор­ ом. При этом Vim разд­ ел­ ит ок­но, а файл буд­ ет ре­дак­ти­ров­ ать­ся в созд­ ан­ном нов­ ом ок­ не (то же отн­ о­ситс­ я к пер­ ех­ од­ у в друг­ ой ка­тал­ ог: ес­ли курс­ ор сто­ял на имен­ и кат­ а­ло­га, Vim разд­ ел­ яе­ т ок­но и «ре­дак­тир­ уе­ т» кат­ ал­ ог, в ко­то­рый вы пе­реш­ ли, в нов­ ом окн­ е).

Переход и смена каталогов 327Рис. 15.3. «Ред­ ак­тир­ о­ва­ние» каталога ex-050325 в VimРис. 15.4. Приг­ лаш­ ен­ ие при пе­ре­име­нов­ а­нии в реж­ и­ме«ре­дакт­ ир­ ов­ а­ния кат­ а­ло­гов»• Мож­но уда­лять и пер­ е­име­но­вы­вать фай­лы и кат­ а­лог­ и. Пер­ е­име­но­ ва­ние осу­ще­ств­ л­ я­ет­ся наж­ ат­ ие­ м проп­ исн­ ой R. Воз­можн­ о, это вы­гля­ дит не­сколь­ко странн­ о, но Vim созд­ ае­ т при­глаш­ ен­ ие ком­ андн­ ой стро­ки, где и  про­исх­ од­ ит пе­ре­имен­ о­ван­ ие. Это выг­ ля­дит при­мер­но как на рис. 15.4. Для за­верш­ ен­ ия про­цес­са отр­ ед­ ак­тир­ уй­те вто­рой ар­гум­ ент ко­манд­ ной стро­ки. Удал­ е­ние фай­ла раб­ от­ ае­ т ана­ло­гичн­ о: по­мес­тит­ е кур­сор над имен­ ем удал­ яе­мо­го фай­ла и на­жми­те про­пис­ную D. Vim по­каж­ ет диа­лог и по­ прос­ ит подт­ вер­дить удал­ ен­ ие файл­ а. Как и пер­ еи­ мен­ о­ван­ ие, проц­ есс про­ис­ход­ ит в об­лас­ти ком­ анд­ной строк­ и.• Еще одн­ о инт­ е­ресн­ ое пре­иму­щес­ т­во ред­ акт­ и­ров­ а­ния каталогов – быс­ тр­ ый дост­ уп к файл­ ам по функ­ции по­иск­ а. Пусть нам нуж­но от­ ре­дакт­ и­ров­ ать файл expreserve.c из упом­ я­ну­то­го вы­ше кат­ ал­ о­га ex-050325. Чтоб­ ы быс­ т­ро пе­рей­ти и от­крыть этот файл, найд­ ит­ е его по име­ни файл­ а или его част­ и: /expreserve.c а пос­ ле ус­та­новк­ и курс­ ор­ а на имя этог­ о файл­ а наж­ ми­те ENTER или o.

328 Глава 15. Другие полезности в Vim Ес­ли вы поч­ ит­ ает­ е он­лайн-справ­ку по ред­ акт­ ир­ о­ван­ ию кат­ а­лог­ ов, то уви­ди­те, что Vim опи­сы­ва­ет эту функ­цию как часть средств для ред­ акт­ ир­ о­ван­ ия файл­ ов чер­ ез сет­ ев­ ые прот­ о­кол­ ы, рас­смот­ренн­ ые в пред­ ы­дущ­ ем разд­ е­ле кни­ги. Мы вын­ ес­ ли из­ме­не­ние ка­та­ло­гов в от­дель­ный раз­дел, по­скольк­ у это важ­ная те­ма, а в боль­шом ко­ли­ че­ств­ е де­та­лей сет­ е­вых прот­ ок­ ол­ ов легк­ о за­пут­ ать­ся.Резервные копии в Vim Vim защ­ ищ­ а­ет от неп­ ред­на­мер­ енн­ ой по­тер­ и данн­ ых, по­зво­ляя соз­да­ вать рез­ ерв­ные ко­пии ред­ акт­ ир­ уе­мых фай­лов. Ес­ли во вре­мя правк­ и все по­шло не так, то они при­го­дят­ся для восс­ тан­ ов­лен­ ия пре­ды­ду­щей верс­ ии файл­ а. Рез­ ерв­ные коп­ ии управл­ яю­ тс­ я за­да­ни­ем двух опц­ ий: backup и  write­ backup. Ме­сто и врем­ я созд­ а­ния ре­зервн­ ых ко­пий оп­ред­ ел­ яе­ тс­ я чет­ ырь­ мя оп­циям­ и: backupskip, backupcopy, backupdir и backupext. Есл­ и обе опции – backup и writebackup – вы­ключ­ е­ны (ус­та­нов­ле­ны noback­ up и nowritebackup), Vim не де­ла­ет рез­ ервн­ ых ко­пий во вре­мя сеа­ нс­ а ре­ дак­ти­ров­ а­ния. Ес­ли backup вклю­че­на, про­грамм­ а удал­ я­ет ста­рые ре­ зерв­ные ко­пии и  соз­да­ет коп­ ию для тек­ у­щег­ о фай­ла. Ес­ли backup вы­ ключ­ е­на, но включ­ е­на writebackup, Vim соз­да­ет ре­зервн­ ую ко­пию на врем­ я сеа­ нс­ а ре­дак­тир­ о­ван­ ия и удал­ я­ет ее по­сле окон­чан­ ия ра­бот­ ы. Backupdir – это разд­ е­ленн­ ый за­пят­ ы­ми спис­ ок ка­тал­ ог­ ов, внут­ри кот­ о­ рых Vim соз­да­ет рез­ ерв­ные ко­пии. Нап­ ри­мер, ес­ли вы хо­ти­те, что­бы они всег­ да соз­да­ва­лись в  сист­ ем­ном вре­мен­ном кат­ а­лог­ е, ус­та­но­вит­ е back­ updir равн­ ым \"C:\TEMP\" для Windows или \"/tmp\" для UNIX и Linux. Есл­ и не­об­хо­дим­ о, что­бы ре­зерв­ная коп­ ия все­гда соз­дав­ а­лась в тек­ у­ щем ка­тал­ о­ге, в ка­че­ств­ е ка­та­лог­ а рез­ ерв­ных коп­ ий мож­но про­пи­ сать «.» (точ­ку). Есть вар­ иа­ нт, ко­гда ко­пию сна­ча­ла пыт­ аю­ тс­ я соз­ дать в скрыт­ ом под­кат­ ал­ ог­ е, ес­ли так­ ов­ ой сущ­ е­ств­ у­ет, а зат­ ем в те­ кущ­ ем ка­та­лог­ е. Это можн­ о осу­щес­ тв­ ить, за­дав зна­чен­ ие backupdir равн­ ым че­му-то врод­ е \"./.mybackups,.\" (пос­ ледн­ яя точк­ а озн­ ач­ ае­ т те­ ку­щий кат­ а­лог для файл­ а). Это очень гиб­кая оп­ция, по­звол­ яющ­ ая за­дав­ ать не­скольк­ о страт­ е­гий опр­ е­дел­ е­ния ме­сто­пол­ ож­ ен­ ий рез­ ерв­ ной ко­пии. Ес­ли вы хот­ ит­ е созд­ ав­ ать ре­зерв­ные коп­ ии не для всех файл­ ов во врем­ я ра­бо­ты, исп­ ольз­ уй­те оп­цию backupskip, в  ко­то­рой оп­ред­ е­ли­те спис­ ок шабл­ о­нов, разд­ е­лив их за­пят­ ы­ми. Vim не буд­ ет соз­да­вать ре­зерв­ные ко­ пии для фай­лов, удовл­ ет­ во­ряю­щих этим шабл­ о­нам. На­прим­ ер, вам не нуж­но соз­дав­ ать рез­ ерв­ные ко­пии файл­ ов, ре­дакт­ и­руем­ ых в ка­та­ло­гах /tmp или /var/tmp. Зап­ рет нак­ лад­ ыв­ а­етс­ я пу­тем ус­та­новк­ и зна­чен­ ия \"/tmp/*,/var/tmp/*\" в backupskip.

Создание HTML из текста 329 По умолч­ ан­ ию Vim соз­да­ет файл ре­зервн­ ой ко­пии с имен­ ем ори­ги­нал­ а, доб­ ав­ляя ~ (тильд­ у) в конц­ е. Это вполн­ е без­опасн­ ый суфф­ икс, пос­ коль­ ку имен­ а файл­ ов с этим симв­ ол­ ом на конц­ е встре­чаю­ т­ся ред­ко. Опц­ ия backupext поз­ вол­ я­ет из­ме­нить эту доб­ авк­ у по свое­ му усм­ от­рен­ ию. На­ при­мер, ес­ли вы хот­ ит­ е, чтоб­ ы ре­зервн­ ые коп­ ии имел­ и расш­ и­рен­ ие .bu, ус­тан­ ов­ ит­ е backupext равн­ ым \".bu\". На­кон­ ец, опц­ ия backupcopy опр­ е­дел­ яе­ т, как созд­ ае­ тс­ я рез­ ерв­ная ко­пия. Мы ре­ко­менд­ у­ем уст­ а­но­вить ее равн­ ой \"auto\", что­бы Vim сам выч­ ис­лял наил­ учш­ ий мет­ од созд­ ан­ ия коп­ ии.Создание HTML из текста У вас воз­ник­ ал­ а по­треб­ность предс­ тав­лять свой код или текст друг­ им люд­ ям? Вы ко­гда-ниб­ удь пы­тал­ ись изуч­ ить код, исп­ ольз­ уя чу­жую кон­ фи­гу­ра­цию Vim, с кот­ о­рой не смогл­ и ра­зоб­ ратьс­ я? Поп­ ро­буйт­ е пре­об­ раз­ о­вать ваш текст или код в HTML и про­смотр­ еть его в брау­зер­ е. Vim пред­ла­гае­ т три спо­соб­ а ге­нер­ ац­ ии HTML из имеющ­ е­гос­ я текс­ та. Все они соз­даю­ т но­вый бу­фер с име­нем, анал­ ог­ ич­ным ори­гин­ аль­ном­ у фай­лу, но с  расш­ и­ре­ни­ем .html. Vim раз­дел­ я­ет окн­ о те­кущ­ е­го се­анс­ а и по­ка­зы­ва­ет HTML-верс­ ию фай­ла в нов­ ом окн­ е. gvim «Convert to HTML» Это сам­ ый друж­ е­ст­вен­ный ме­тод, встро­ен­ный в гра­фи­чес­ кий ред­ ак­ тор gvim (про кот­ ор­ ый рас­сказ­ ы­вал­ ось в глав­ е 13). От­крой­те в gvim ме­ ню Syntax и вы­бе­ри­те «Convert to HTML». 2html.vim, скрипт Это скрипт, ле­жа­щий в ос­нов­ е пункт­ а мен­ ю «Convert to HTML», то есть опи­санн­ о­го выш­ е спо­соб­ а. Он вы­зы­ва­ет­ся ко­манд­ ой: :runtime!syntax/2html.vim Скрипт не по­ним­ а­ет диа­паз­ о­нов: об­раб­ а­ты­вае­ тс­ я весь буф­ ер. TOhtml, ком­ ан­да Это бо­лее гиб­кая ком­ ан­да по сравн­ е­нию со скрип­том 2html.vim, по­ скольк­ у здесь мож­но за­да­вать точ­ный диап­ а­зон строк, ко­то­рые над­ о прео­ бр­ а­зо­вать. На­прим­ ер, что­бы кон­верт­ ир­ ов­ ать строк­ и с 25 по 44 из буф­ е­ра, вве­ди­те: :25,44TOhtml Пре­имущ­ е­ст­вом ис­польз­ ов­ ан­ ия gvim при прео­ б­ра­зов­ а­нии в HTML яв­ля­ етс­ я то, что GUI поз­ вол­ я­ет точн­ о расп­ о­знать цвет­ а и за­дать прав­ ильн­ ые дир­ ек­тив­ ы HTML. Эти ме­тод­ ы ра­бот­ аю­ т и в нег­ ра­фи­чес­ ком конт­ екс­ те, но ре­зульт­ ат­ ы не буд­ ут нас­ тольк­ о же точ­ны­ми и  мо­гут не прин­ ес­ти польз­ ы.

330 Глава 15. Другие полезности в Vim Вы сам­ и ре­шает­ е, что де­лать с но­вым фай­лом. Vim не бу­дет сох­ ра­ нять его сам, а про­сто соз­даст бу­фер. Мы рек­ о­мен­ду­ем при­держ­ и­ ватьс­ я опр­ е­де­ленн­ ой по­ли­ти­ки для со­хра­нен­ ия и синх­ рон­ из­ ац­ ии HTML-вер­сий ваш­ их тек­стов­ ых фай­лов. Нап­ ри­мер, для созд­ а­ния и со­хран­ ен­ ия файл­ ов HTML можн­ о исп­ ольз­ о­вать авт­ о­ко­ман­ды. Сох­ ра­ненн­ ый файл HTML мож­но про­смотр­ еть в люб­ ом брауз­ е­ре. Не­ко­ то­рые из вас мо­гут быть не­ знак­ ом­ ы со спос­ об­ а­ми от­крыт­ ия фай­лов в брау­зер­ е на ло­кальн­ ых сист­ ем­ ах. Это до­воль­но легк­ о: тео­рет­ и­чес­ ки во всех брауз­ ер­ ах есть пункт ме­ню Open File в мен­ ю File, по­сле чег­ о по­яв­ ляе­ т­ся диа­лог, в кот­ о­ром мож­но пе­рей­ти в кат­ а­лог с HTML-фай­лом. Ес­ ли вы пла­нир­ уе­те вып­ ол­нять эти дей­ств­ ия ре­гул­ ярн­ о, рек­ ом­ енд­ у­ем соз­дать наб­ ор зак­ лад­ ок на свои фай­лы.В чем разница? Раз­лич­ ия в раз­ных верс­ и­ях одн­ о­го файл­ а част­ о трудн­ о обн­ ар­ уж­ ить, по­ этом­ у утил­ и­та для прос­ мотр­ а всех от­ли­чий од­ним ра­зом мож­ ет сэко­но­ мить час­ ы ра­бо­ты. Изв­ естн­ ая ко­манд­ а UNIX diff ин­тегр­ ир­ о­ва­на в Vim по­сред­ств­ ом изо­щрен­но­го инт­ ерф­ ей­са виз­ уал­ из­ а­ции, ко­то­рый выз­ ы­ва­ ет­ся ко­ман­дой vimdiff. Для вы­зов­ а этой функц­ ии есть два экв­ ив­ ал­ ентн­ ых спо­соб­ а: отд­ ельн­ ая ко­манд­ а и оп­ция для Vim: $ vimdiff old_file new_file $ vim -d old_file new_file Как прав­ и­ло, пер­вый срав­нив­ аем­ ый файл пред­став­ля­ет стар­ ую вер­ сию, а втор­ ой – бол­ ее но­вую, но это тольк­ о со­гла­ше­ние. На са­мом де­ле, все­гда мож­но пом­ е­нять пор­ яд­ ок. На рис. 15.5 по­каз­ ан при­мер вы­вод­ а ком­ ан­ды vimdiff. Из-за огр­ а­нич­ ен­ но­сти мес­та мы уменьш­ и­ли ши­ри­ну и  вы­клю­чи­ли опц­ ию wrap, чтоб­ ы прои­ л­люс­ т­рир­ о­вать отл­ ич­ ия. Хот­ я ри­сун­ ок не пер­ е­да­ет всег­ о эф­фек­та виз­ уа­лиз­ ац­ ии со­дер­жим­ ог­ о (в ча­ст­но­сти, из-за пред­ставл­ е­ния цвет­ ов в отт­ енк­ ах се­рог­ о), на нем по­ каз­ ан­ ы клю­чев­ ые дейс­ тв­ ия: • В  стро­ке 4 сле­ва вы мо­жет­ е за­мет­ ить тем­ный блок, ко­тор­ о­го нет справ­ а. Это подс­ веч­ ен­ное слов­ о, указ­ ы­ваю­щее на от­ли­чия в строк­ ах. Анал­ ог­ ичн­ о в стро­ке 32 справ­ а сод­ ерж­ ится под­све­чен­ное сло­во, ко­ то­рое сле­ва от­сутс­ тв­ уе­ т. • На строк­ е 11 с  обе­их стор­ он Vim соз­дал 15-строч­ную свертк­ у. Эти 15 строк один­ ак­ о­вы в обои­ х файл­ ах. Vim сверн­ ул их, что­бы на эк­ра­ не был­ о как можн­ о боль­ше ин­форм­ ац­ ии о «разн­ иц­ ах».

В чем разница? 331• Стро­ки 41–42 слев­ а подс­ ве­чен­ ы, то­гда как на соо­ тв­ ет­ств­ ую­щих по­ зиц­ и­ях справ­ а сто­ят мин­ ус­ ы (-), ко­тор­ ые ука­зы­ваю­ т, что справ­ а этих строк нет. Нач­ ин­ ая с это­го мес­та ну­ме­ра­ция строк отл­ ич­ ае­ т­ся, по­скольк­ у пра­вая часть на две строк­ и меньш­ е. Тем не мен­ ее со­отв­ ет­ ств­ ую­щие друг дру­гу стро­ки из обои­ х фай­лов по-прежн­ е­му вы­ров­не­ ны по гор­ и­зонт­ а­ли.Функц­ ия vimdiff име­ет­ся во всех ус­та­новк­ ах Vim в UNIX-сис­те­мах, по­сколь­ку diff вхо­дит в  стан­дарт UNIX. Ус­тан­ овк­ и ре­дак­то­ра не подUNIX долж­ны по­ставл­ ять­ся со сво­ей верс­ ие­ й diff. Vim до­пус­ка­ет зам­ е­ну ко­манд­ ы diff на друг­ ие, есл­ и они то­же выр­ а­бат­ ы­ваю­ т станд­ арт­ныйвы­вод diff.Пе­рем­ ен­ная diffexpr опр­ е­дел­ яе­ т вы­раж­ ен­ ие, зам­ ен­ яющ­ ее со­бой стан­дарт­ную ко­ман­ду, исп­ ольз­ уем­ ую vimdiff для выч­ исл­ е­ния разл­ и­чий меж­ду дву­мя фай­лам­ и. Обыч­но это выр­ а­же­ние реа­лиз­ у­ет­ся че­рез скрипт,раб­ от­ ающ­ ий со след­ ующ­ им­ и пер­ е­мен­ным­ и:v:fname_in Перв­ ый сравн­ ив­ аем­ ый файл.v:fname_new Вто­рой срав­нив­ ае­мый файл.v:fname_out Файл для со­дер­жим­ ог­ о выв­ од­ а diff.Рис. 15.5. Рез­ ульт­ а­ты vimdiff

332 Глава 15. Другие полезности в VimОтмена отмен Кром­ е от­мен­ ы нео­ гр­ ан­ ич­ ен­но­го кол­ и­че­ств­ а пра­вок Vim име­ет ин­те­рес­ ную осо­бен­ность, на­зы­ваем­ ую ветвл­ е­ни­ем отм­ ен. Что­бы ис­польз­ ов­ ать эту воз­мож­ность, нужн­ о снач­ а­ла реш­ ить, ка­ким кол­ ич­ е­ст­вом от­мен вы хот­ ит­ е управ­лять. Опц­ ия undolevels опр­ ед­ ел­ яе­ т чис­ло отм­ е­няе­мых изм­ ен­ ен­ ий, кот­ о­рые мож­но дел­ ать во вре­мя сеа­ нс­ а раб­ о­ты. По умолч­ ан­ ию знач­ ен­ ие равн­ о 1 000. Ско­рее все­го, это­го бо­лее чем дост­ ат­ оч­но для боль­шинс­ тв­ а поль­зов­ ат­ ел­ ей. Чтоб­ ы обесп­ е­чить со­ вмес­тим­ ость с vi, ус­тан­ о­ви­те undolevels равн­ ым 0. :set undolevels=0 По су­ти, в vi ко­манд­ а отм­ ен­ ы u пе­рек­ лю­ча­ет меж­ду те­кущ­ им со­стоян­ и­ ем фай­ла и его сам­ ой по­следн­ ей вер­си­ей. Перв­ ая от­ме­на пе­рек­ лю­чае­ т в со­стоян­ ие пер­ ед по­след­ней прав­кой, а сле­дую­щая от­ме­на восс­ тан­ ав­ лив­ а­ет отм­ е­нен­ное сос­ тоя­ние. Vim вед­ ет себ­ я сов­ сем ина­че, и, сле­до­ва­ тельн­ о, эти ко­манд­ ы ра­бот­ аю­ т по-раз­ном­ у. Вме­сто пе­ре­клю­че­ния меж­ду со­стоян­ ия­ми с пос­ ледн­ ей правк­ ой пов­ тор­ ный выз­ ов от­мен­ ы в Vim от­ка­тыв­ а­ет сос­ тоян­ ие файл­ а наз­ ад к наиб­ ол­ ее ран­ним сос­ тоян­ ия­ м до тог­ о, кот­ ор­ ое за­дае­ т оп­ция undolevels. По­сколь­ ку ком­ ан­да отм­ ен­ ы u пе­ре­ме­щае­ т толь­ко на­зад, нам пот­ ре­буе­ тс­ я ком­ ан­ да для возв­ рат­ а и «по­втор­но­го при­мен­ е­ния» изм­ е­не­ний. Vim вы­пол­няе­ т это дей­ств­ ие ком­ ан­дой :redo или со­че­тан­ ие­ м клав­ иш CTRL-R. Ком­би­ нац­ ия CTRL-R мож­ ет пред­ва­рять­ся чис­ лов­ ым арг­ у­мен­том, чтоб­ ы вос­ стан­ о­вить не­сколь­ко изм­ ен­ е­ний сраз­ у. При пер­ е­ход­ е впер­ ед и  наз­ ад по из­ме­не­ния­ м ко­ман­да­ми возв­ ра­та (CTRL-R) и отм­ е­ны (u) Vim подд­ ер­жив­ а­ет кар­ту сос­ тоя­ний файл­ а и зна­ ет, ког­ да прои­ зошл­ а по­следн­ яя воз­мож­ная от­ме­на. Ко­гда все отм­ е­ны ис­ черп­ а­ны, прог­ рам­ма мен­ яе­ т сос­ тоя­ние «из­ме­нен­ный» у файл­ а, что по­ звол­ ит вый­ти без до­пол­нит­ ельн­ ог­ о суфф­ икс­ а ! (вос­клиц­ а­тель­но­го зна­ ка). Хо­тя польз­ ов­ ат­ ел­ ю от это­го ма­ло выг­ од­ ы, данн­ ый факт можн­ о ис­ поль­зов­ ать при нап­ и­са­нии скрип­тов, где мо­ди­фи­цир­ ов­ анн­ ое сос­ тоян­ ие фай­ла явл­ яе­ т­ся важ­ным. Функц­ ий от­мен­ ы и возв­ ра­та буд­ ет дос­та­точ­но для ра­бо­ты боль­шин­ст­ва поль­зов­ а­те­лей. Од­нак­ о рас­смотр­ им бол­ ее слож­ную си­туац­ ию. Что есл­ и вы сдел­ ал­ и семь исп­ рав­ле­ний в фай­ле, а от­ме­нил­ и толь­ко три? По­ка все хор­ ош­ о, нет нич­ е­го нео­ бычн­ о­го. А теп­ ерь пред­ста­вим, что, от­ме­нив три из се­ми дей­ств­ ий, вы прод­ ел­ а­ли изм­ е­нен­ ие, от­личн­ ое от то­го, что стои­ т след­ ую­щим в колл­ екц­ ии дейс­ т­вий Vim. Про­грамм­ а опр­ е­дел­ я­ет это дей­ ст­вие как точк­ у из­ме­не­ния ис­тор­ ии в ви­де нов­ ой ветк­ и, в кот­ о­рой про­ ис­ход­ ят свои со­бы­тия. По этом­ у пу­ти вы то­же мож­ е­те пер­ ем­ ещ­ атьс­ я впе­ред и наз­ ад по хрон­ ол­ ог­ ии соб­ ы­тий, а на точ­ке ветвления – пер­ ейт­ и впер­ ед по лю­бом­ у из пу­тей со­хран­ енн­ ых из­мен­ е­ний.

На чем я остановился? 333 Для полн­ о­го озн­ ак­ ом­ле­ния с пер­ е­ме­ще­ние­ м по изм­ е­нен­ и­ям как по де­ рев­ у исп­ оль­зуйт­ е ко­манд­ у справк­ и Vim: :help usr_32.txtНа чем я остановился? Боль­шин­ст­во ре­дак­то­ров нач­ ин­ а­ют се­анс раб­ о­ты на строк­ е 1, стол­бец 1. То есть каж­дый раз при зап­ ус­ке про­грам­мы за­гру­жае­ тс­ я файл, и  ре­ дак­ти­ров­ ан­ ие на­чи­на­ет­ся с перв­ ой строк­ и. Есл­ и вы дол­го пра­вит­ е текст, дви­гая­ сь по не­му впер­ ед, то бу­дет удобн­ ее, ес­ли нов­ ый сеа­ нс ре­дак­ти­ ров­ ан­ ия нач­нет­ся с мес­та окон­чан­ ия пред­ ы­дущ­ е­го сеанса. Vim поз­ во­ля­ ет это сдел­ ать. Есть два спос­ о­ба сох­ ра­нять ин­форм­ а­цию о се­анс­ е ре­дак­тир­ ов­ а­ния для бу­ду­щих цел­ ей: оп­ция viminfo и ком­ анд­ а mksession.Опция viminfo Vim исп­ оль­зуе­ т опц­ ию viminfo, чтоб­ ы опр­ е­дел­ ить, что, как и где со­хра­ нять в ви­де инф­ орм­ а­ции о се­анс­ е. Она пред­став­ляе­ т со­бой стро­ку с раз­ де­лен­ным­ и зап­ я­ты­ми па­рам­ ет­ра­ми, ко­то­рые соо­ б­ща­ют Vim, как­ ую ин­ фор­ма­цию сох­ ран­ ять и где это дел­ ать. Нек­ от­ о­рые из под­ опц­ ий viminfo оп­ре­де­ляю­ т­ся сле­дую­щим об­ра­зом: <n Ука­зы­вае­ т Vim сох­ ран­ ять строк­ и для кажд­ ог­ о рег­ ис­ тр­ а, вплоть до макс­ и­мум­ а из n строк. Ес­ли этот параметр не задан, бу­дут сох­ ра­нен­ ы все строк­ и. Хот­ я на перв­ ый взгляд это мож­ ет по­ка­затьс­ я ес­те­ст­вен­ным жел­ ан­ и­ем, под­ у­ майт­ е о по­следс­ т­ви­ях при ре­дак­тир­ о­ва­нии больш­ их фай­лов и боль­ шом ко­лич­ ес­ тв­ е ис­правл­ ен­ ий. На­прим­ ер, есл­ и вы обыч­но ред­ ак­ти­ рует­ е файл из 10 000 строк, уда­ляе­те все строк­ и (воз­можн­ о, что­бы восп­ ре­пятс­ тв­ ов­ ать его бы­стр­ о­му рос­ту, выз­ ванн­ о­му дру­гой прог­ рам­ мой), а за­тем со­хран­ яет­ е файл, то все 10 000 строк ре­гис­ тр­ а бу­дут со­ хра­не­ны в файл­ е viminfo. Есл­ и это прод­ ел­ ы­ва­етс­ я мног­ ок­ рат­но для не­сколь­ких фай­лов, то раз­мер viminfo силь­но уве­лич­ ит­ся. Ес­ли вы зам­ ет­ и­те дол­гие за­держ­ки при зап­ ус­ке даж­ е неб­ ольш­ их файл­ ов в Vim, то, возм­ ож­но, это свя­зан­ о с нео­ бх­ о­дим­ ос­ тью обр­ а­бо­тать файл viminfo при старт­ е ре­дакт­ о­ра. Мы рек­ ом­ ен­ду­ем ука­зать как­ ой-ни­будь раз­ умн­ ый, но при­годн­ ый пре­дел. Авт­ ор этих строк ис­поль­зуе­ т 50. /n Ко­лич­ е­ст­во со­хра­няе­мых пункт­ ов в ист­ ор­ ии пои­ ск­ а. Есл­ и па­ра­метр не за­дан, Vim ис­поль­зуе­ т знач­ е­ние опц­ ии history.

334 Глава 15. Другие полезности в Vim :n Мак­сим­ альн­ ое ко­ли­че­ст­во сох­ ран­ яем­ ых ком­ анд из ис­то­рии ко­манд­ ной стро­ки. Ес­ли пар­ а­метр не зад­ ан, Vim исп­ оль­зу­ет зна­че­ние опц­ ии history. 'n Макс­ им­ альн­ ое ко­лич­ е­ств­ о фай­лов, для ко­то­рых Vim со­хран­ яе­ т ин­ фор­ма­цию. Ес­ли вы за­дае­те опц­ ию viminfo, этот пар­ ам­ етр яв­ля­ет­ся обяз­ ат­ ельн­ ым. В фай­ле viminfo со­хра­няе­ тс­ я след­ ую­щее: • Ис­тор­ ия ко­мандн­ ой строк­ и • Ист­ ор­ ия строк пои­ ск­ а • Ист­ о­рия строк вво­да1 • Рег­ и­стр­ ы • Метк­ и в  файл­ ах (то есть со­хран­ я­ютс­ я метк­ и, соз­данн­ ые ко­манд­ ой mx, пос­ ле че­го при пов­ тор­ном ре­дакт­ и­ров­ ан­ ии фай­ла на них мож­но бу­дет пе­рейт­ и с по­мо­щью 'x) • Пос­ лед­ний пои­ ск и шабл­ о­ны подс­ та­новк­ и • Спис­ ок бу­фе­ров • Глоб­ альн­ ые пер­ ем­ енн­ ые Эта опц­ ия очень удобн­ а для под­дер­жа­ния не­пре­рыв­но­сти в раб­ от­ е. На­ при­мер, при ре­дакт­ ир­ о­ван­ ии боль­шог­ о фай­ла, в ко­тор­ ом де­ла­ют­ся из­ ме­не­ния по шабл­ он­ у, сох­ ра­няе­ т­ся шаб­лон пои­ ск­ а и по­лож­ е­ние кур­сор­ а в  фай­ле. Что­бы про­дол­жить ред­ акт­ ир­ ов­ ан­ ие в  нов­ ом се­анс­ е, нужн­ о лишь вве­сти n для пер­ ех­ о­да на след­ ую­щее вхо­ж­де­ние шаб­ло­на пои­ с­ка.Команда mksession Ко­манд­ ой mksession Vim со­хра­ня­ет всю ин­форм­ а­цию, ка­саю­щую­ся ре­ дакт­ и­ро­ва­ния в данн­ ом се­ан­се ра­бо­ты. Оп­ция sessionoptions со­держ­ ит стро­ку с  зап­ я­ты­ми в  кач­ ес­ тв­ е разд­ е­лит­ е­лей, в  ко­тор­ ой опр­ е­де­ля­ютс­ я комп­ о­нен­ты се­ан­са для сох­ ра­нен­ ия. Этот спос­ об со­хра­нен­ ия ин­фор­ма­ ции о  сеа­ н­се бо­лее полн­ ый, но и  бо­лее спе­циф­ ич­ный, неж­ ел­ и viminfo. Он зат­ ра­гив­ а­ет фай­лы, буф­ ер­ ы, ок­на и так да­лее, поэ­ то­му mksession со­ хра­нит ин­фор­мац­ ию с  возм­ ож­но­стью пол­но­го восс­ тан­ ов­ле­ния се­анс­ а, включ­ ая все ред­ ак­ти­ров­ ав­шие­ся файл­ ы и  все уст­ ан­ овк­ и всех оп­ций, да­же раз­ме­ры окон. В этом и со­сто­ит отл­ ич­ ие от опц­ ии viminfo, ко­то­рая со­хран­ яе­ т ин­форм­ а­цию по од­но­му фай­лу. Что­бы со­хра­нить се­анс так­ им спо­соб­ ом, вве­ди­те: :mksession [filename] 1 Строк­ и, введ­ енн­ ые в  отв­ ет на вы­зов функц­ ии input(); под­робн­ о­сти ищи­те в онл­ айн-справк­ е. – Прим. нау­ ч. ред.

На чем я остановился? 335где filename за­да­ет файл, в кот­ ор­ ый буд­ ет им­пор­тир­ ов­ а­на ин­фор­мац­ ияо сеа­ нс­ е. Vim соз­да­ет файл скрипт­ а, восс­ тан­ ав­лив­ ающ­ ий сеа­ нс ре­дак­ти­ров­ ан­ ия при его по­сле­дую­щем вы­полн­ е­нии ко­ман­дой source (есл­ иимя файл­ а не указ­ ан­ о, то по умол­ча­нию прис­ ваи­вае­ тс­ я Session.vim). Та­ким об­раз­ ом, ес­ли вы сох­ ра­няе­те сеа­ нс ко­ман­дой: :mksession mysession.vimто впос­ ледс­ тв­ ии смо­жет­ е зан­ ов­ о восс­ озд­ ать его, вы­полн­ ив: :source mysession.vimНиж­ е мы пе­реч­ ис­лим комп­ он­ ен­ты, кот­ ор­ ые мож­но сох­ ран­ ять из сеа­ нс­ ас со­от­вет­ств­ ующ­ им па­ра­мет­ром для опц­ ии sessionoptions:blank Пуст­ ые ок­на.buffers Скрыт­ ые и выг­ руж­ ен­ные бу­фер­ ы.curdir Те­ку­щий ка­тал­ ог.folds Созд­ анн­ ые вручн­ ую и отк­ рыт­ ые/за­крыт­ ые свертк­ и, а такж­ е лок­ аль­ ные опц­ ии свер­ток. Нет нео­ б­хо­дим­ ос­ ти со­хран­ ять друг­ ие сверт­ки, кро­ме соз­дан­ных вруч­ную. Сверт­ки, соз­дан­ные ав­то­мат­ и­че­ски, буд­ ут ав­том­ а­тич­ ес­ ки вос­созд­ ан­ ы!globals Гло­баль­ные пе­рем­ енн­ ые, ко­то­рые нач­ ин­ а­ютс­ я с  про­писн­ ой бук­ ­вы и сод­ ер­жат по край­ней мер­ е одн­ у строчн­ ую.help Окн­ о справк­ и.localoptions Опц­ ии, опр­ е­де­лен­ные лок­ аль­но для окн­ а.options Опц­ ии, зад­ анн­ ые с по­мощ­ ью :set.resize Раз­мер ок­на Vim.sesdir Ка­тал­ ог, где леж­ ит файл сеа­ нс­ а.slash Об­ратн­ ые кос­ ые чер­ты в фай­ле, зам­ е­нен­ные на прям­ ые кос­ ые чер­ты.

336 Глава 15. Другие полезности в Vim tabpages Все стра­ниц­ ы вклад­ ок. Ес­ли это не оп­ре­дел­ ить спец­ и­альн­ о в строк­ е sessionoptions, то буд­ ет со­хра­нен се­анс толь­ко для тек­ ущ­ ей вкладк­ и. В рез­ ульт­ а­те мож­но оп­ ре­дел­ ять сеа­ нс для од­ной вкладк­ и либ­ о гло­баль­но для всех вкла­док. unix Фор­мат конц­ а строк­ и UNIX. winpos Пол­ о­же­ние окн­ а Vim на эк­ра­не. winsize Разм­ ер окон буф­ ер­ ов на экр­ ан­ е. Нап­ ри­мер, есл­ и вы хо­ти­те сох­ ран­ ить се­анс, что­бы удер­жать всю инф­ ор­ мац­ ию о всех бу­фер­ ах, всех вкладк­ ах, гло­бальн­ ых пер­ е­мен­ных, а так­ же о разм­ е­ре и пол­ о­жен­ ии ок­на, нео­ б­ход­ и­мо за­дать опц­ ию sessionoptions след­ ую­щим об­раз­ ом: :set sessionoptions=buffers,folds,globals,options,resize,winposНа какой я строке? Vim доп­ ус­кае­ т стро­ки поч­ти не­огр­ ан­ ич­ ен­ной дли­ны. Их мож­но либ­ о пер­ ен­ ос­ ить на нес­ коль­ко строк эк­ран­ а, что­бы вид­ еть без гор­ и­зонт­ аль­ ной про­крутк­ и, либ­ о отоб­ ра­жать на эк­ран­ е толь­ко нач­ ал­ о кажд­ ой стро­ ки, по­звол­ яя ей уйт­ и вправ­ о за пре­дел­ ы эк­ран­ а. Есл­ и вы пред­поч­ и­тает­ е, что­бы од­ной строк­ е эк­ра­на со­отв­ етс­ тв­ о­ва­ла од­ на строк­ а текс­ та, отк­ люч­ ит­ е опц­ ию wrap: set nowrap При nowrap Vim ото­бра­жа­ет столь­ко симв­ о­лов в стро­ке, скольк­ о по­зво­ ля­ет ши­рин­ а эк­ран­ а. Предс­ тавь­те, что экран – это смот­ро­вое отв­ ерс­ тие или окн­ о, че­рез ко­тор­ ое расс­ мат­рив­ а­етс­ я длин­ная строк­ а. На­прим­ ер, стро­ка из 100 симв­ ол­ ов сод­ ер­жит на 20 сим­во­лов боль­ше, чем мо­жет вме­стить эк­ран, со­стоящ­ ий из 80 столб­цов. В зав­ ис­ им­ о­сти от то­го, ка­ кой сим­вол сто­ит в пер­вом столб­це экр­ а­на, Vim опр­ е­де­ля­ет, ка­кие сим­ во­лы в 100-сим­вольн­ ой строк­ е не отоб­ ра­жаю­ тс­ я. На­при­мер, ес­ли в пер­ вом столб­це на­ход­ ит­ся 5-й симв­ ол стро­ки, то симв­ о­лы 1–4 рас­по­ло­же­ ны за лев­ ым кра­ем эк­ран­ а, поэ­ том­ у их не видн­ о. Симв­ о­лы 5–84 видн­ ы на экр­ а­не, а ос­тавш­ ие­ся симв­ ол­ ы, с 85 по 100, вы­ход­ ят за пра­вый край экр­ ан­ а, по­этом­ у их такж­ е не вид­но. В Vim мож­но управл­ ять ото­браж­ ен­ ие­ м строк­ и при пе­рем­ е­щен­ ии по ней влев­ о и  вправ­ о. Мин­ им­ альн­ ое кол­ ич­ ес­ т­во симв­ о­лов, на ко­то­рое Vim смещ­ а­ет стро­ку на­ле­во и на­пра­во, рав­но sidescroll. Это знач­ е­ние можн­ о зад­ ать так:

На какой я строке? 337 set sidescroll=nгде n – числ­ о прок­ руч­ ив­ ае­мых столб­цов. Мы рек­ ом­ ен­ду­ем уст­ ан­ о­витьsidescroll равн­ ым 1, пос­ коль­ку сов­ рем­ ен­ные ПК обл­ ад­ аю­ т мощн­ ос­ тьюпроц­ есс­ о­ра, дос­та­точ­ной для гладк­ ог­ о смещ­ ен­ ия всег­ о эк­ран­ а на одинсимв­ ол за один раз. Ес­ли ваш эк­ран тор­мо­зит и име­ет боль­шое врем­ яотк­ ли­ка, мож­но увел­ ич­ ить знач­ е­ние для уменьш­ ен­ ия чис­ла пе­ре­рис­ о­вок эк­ран­ а.Оп­ция sidescroll опр­ е­дел­ я­ет ми­ни­маль­ный сдвиг. Как мож­но ожид­ ать,Vim пе­рем­ е­ща­ет кур­сор нас­ толь­ко дал­ е­ко, нас­ коль­ко это тре­бу­ет­ся длявып­ олн­ ен­ ия зад­ анн­ ой ва­ми ко­ман­ды пер­ ем­ ещ­ е­ния. На­при­мер, ввод wпер­ е­мес­тит кур­сор на сле­дующ­ ее сло­во в стро­ке. Од­нак­ о об­ра­ботк­ а пе­рем­ е­щен­ ий в Vim не­мно­го мудр­ е­ная.Есл­ и след­ ую­щее слов­ о видн­ о не полн­ о­стью (справ­ а), ред­ ак­тор пе­рем­ ес­тит вас на пер­вый симв­ ол это­го слов­ а, не смещ­ ая эк­ран. Сле­дую­щее вы­пол­нен­ ие ком­ анд­ ы w сме­стит стро­ку вле­во на та­кое рас­стоян­ ие, что­быкурс­ ор по­пал на пер­вый симв­ ол сле­дующ­ ег­ о сло­ва, но что­бы был вид­ ентольк­ о этот перв­ ый симв­ ол.Под­ обн­ ое по­ве­де­ние можн­ о конт­ ро­ли­ро­вать опц­ и­ей sidescrolloff. Онаопр­ ед­ ел­ яе­ т мак­сим­ альн­ ое ко­ли­че­ст­во столб­цов, сод­ ер­жащ­ ихс­ я спра­ваи сле­ва от курс­ ор­ а. Так, ес­ли за­дать sidescrolloff равн­ ой 10, Vim со­хра­няе­ т по крайн­ ей мер­ е 10 симв­ ол­ ов ок­руж­ ен­ ия, ког­ да кур­сор на­хо­дитс­ яблиз­ко к краю эк­ран­ а. Сейч­ ас, ког­ да вы пе­ре­мещ­ ает­ есь по стро­ке нал­ е­во и  нап­ ра­во, кур­сор не по­дойд­ ет к  каж­дом­ у из кра­ев эк­ра­на ближ­ е,чем (в  на­шем слу­чае) на 10 симв­ ол­ ов, так как про­грамм­ а нач­нет сме­щать текст для про­смотр­ а этог­ о кон­текс­ та. Воз­можн­ о, это наил­ уч­шийспос­ об нас­ трои­ ть Vim в реж­ и­ме nowrap.Ред­ акт­ ор пре­дос­тав­ля­ет удобн­ ые виз­ у­аль­ные подс­ каз­ки с по­мо­щью оп­ции listchar. Она зад­ ае­ т спо­соб ото­бра­же­ния сим­во­лов при ус­та­нов­лен­ной опц­ ии list. В  Vim такж­ е есть два па­рам­ ет­ра этой опц­ ии, ко­то­рыеопр­ е­дел­ яю­ т, исп­ оль­зов­ ать ли до­пол­нит­ ель­ные симв­ ол­ ы, что­бы пок­ аз­ атьнал­ ич­ ие симв­ о­лов за пред­ ел­ ам­ и ле­вог­ о и прав­ о­го кра­ев эк­ра­на в длин­ной стро­ке. На­прим­ ер: set listchars=extends:> set listchars+=precedes:<пред­пи­сыв­ ае­ т Vim пок­ аз­ ы­вать < в  столбц­ е 1, есл­ и длин­ная строк­ а со­держ­ ит друг­ ие симв­ о­лы сле­ва от вид­ им­ о­го экр­ ан­ а, а  > – в  пос­ ледн­ емстолб­це, что­бы пок­ аз­ ать прис­ ут­ств­ ие друг­ их симв­ о­лов справ­ а от вид­ и­мог­ о экр­ а­на. Прим­ ер предс­ тав­лен на рис. 15.6.Рис. 15.6. Длинн­ ая стро­ка в реж­ им­ е nowrap

338 Глава 15. Другие полезности в Vim Нап­ ро­тив, есл­ и вам хо­чет­ся ви­деть всю стро­ку без про­крутк­ и, опц­ и­ей wrap мож­но за­дать пер­ е­нос строк в Vim. set wrap Те­перь стро­ка вы­гляд­ ит, как на рис. 15.7. Рис. 15.7. Длин­ная стро­ка в реж­ им­ е wrap Очень длин­ные стро­ки, ко­то­рые не вле­заю­ т пол­нос­ тью на эк­ран, пред­ ставл­ яю­ т­ся един­ст­вен­ным симв­ о­лом @ на пер­вой поз­ иц­ ии, по­ка кур­сор и  файл не буд­ ут расп­ о­лож­ е­ны так, что­бы стро­ка влез­ла полн­ о­стью. Строк­ а на рис. 15.7 бу­дет выг­ ляд­ еть, как на рис. 15.8, есл­ и рас­пол­ о­жит­ ся вниз­ у экр­ ан­ а. Рис. 15.8. Инд­ и­ка­тор длин­ной стро­киСокращения команд и опций Vim В Vim су­щес­ тв­ у­ет мног­ о ком­ анд и опц­ ий, по­это­му мы ре­ко­менд­ у­ем сна­ чал­ а выу­ чить их наз­ ва­ния. Почт­ и все ко­манд­ ы и оп­ции (по край­ней ме­ ре, с длин­ны­ми имен­ а­ми) име­ют связ­ ан­ную с ним­ и ко­рот­кую фор­му. Это пом­ ож­ ет сэкон­ ом­ ить вре­мя, но нуж­но быть уве­ренн­ ым, что вы знае­те эту аб­брев­ иа­ту­ру! Ав­тор иног­ да по­луч­ ал смущ­ ающ­ ие и не­ожи­дан­ные ре­ зульт­ ат­ ы при ис­поль­зов­ ан­ ии неп­ ра­вильн­ ой ко­рот­кой фор­мы ком­ анд­ ы. Есл­ и вы осв­ оил­ ись в лю­бим­ ом подм­ нож­ е­ст­ве ком­ анд и опц­ ий Vim, то исп­ оль­зов­ ан­ ие сок­ ра­щен­ных форм сэкон­ ом­ ит ва­ше вре­мя. Как пра­ви­ ло, для опц­ ий ре­дакт­ ор пы­та­ет­ся взять со­кра­щен­ ия тип­ а UNIX, а для ком­ ан­ды бе­рет на­чальн­ ую уник­ альн­ ую под­строк­ у ее име­ни. Прив­ ед­ ем не­ко­тор­ ые сок­ ращ­ е­ния для час­то исп­ оль­зуем­ ых ко­манд: n next prev previous q quit se set w write

Несколько мелочей (не обязательно для Vim) 339И опц­ ий: ai autoindent bg background ff fileformat ft filetype ic ignorecase li list nu number sc showcommand (а не showcase) sm showmatch sw shiftwidth wm wrapmarginСо­кращ­ ен­ная форм­ а эко­ном­ ит врем­ я, ес­ли вы дост­ а­точн­ о хор­ о­шо знае­теко­манд­ ы и оп­ции. Од­нак­ о при нап­ и­са­нии скрипт­ ов и при на­строй­ке се­анс­ а ко­ман­дам­ и в фай­ле .vimrc или .gvimrc вы, скор­ ее все­го, в пер­спек­тив­ е сэко­но­мит­ е врем­ я, есл­ и буд­ ет­ е исп­ ольз­ о­вать полн­ ые име­на ко­манди опц­ ий, т. к. это об­лег­чае­ т чте­ние и от­слеж­ ив­ а­ние файл­ ов и скрип­тов. Об­рат­ и­те вни­ман­ ие, что в ком­плект­ е фай­лов скрипт­ ов из дис­ т­риб­ у­ тив­ а Vim (syntax, autoindent, colorscheme и т. д.) пред­прин­ ят про­ти­во­ по­лож­ный подх­ од, и мы нич­ е­го не име­ем про­тив не­го. Тем не ме­нее для удоб­ст­ва исп­ оль­зов­ а­ния соб­ств­ ен­ных скрип­тов мы рек­ о­мен­ду­ ем указ­ ы­вать их пол­ные име­на.Несколько мелочей (не обязательно для Vim) Мы предл­ ож­ им не­сколь­ко прие­мов. Нек­ от­ о­рые из них, имеющ­ иес­ я как в исх­ од­ном vi, так и в Vim, стои­ т за­помн­ ить и исп­ ольз­ ов­ ать для об­легч­ е­ ния раб­ от­ ы: Быс­ тр­ ая пе­рес­ та­нов­ка До­вольн­ о час­то встреч­ а­ет­ся та­кая ошиб­ка, как ввод двух сим­во­лов в неп­ рав­ иль­ном пор­ яд­ке. По­мес­тит­ е курс­ ор на перв­ ый из «кап­ риз­ ных» зна­ков и вве­ди­те xp (удал­ ить симв­ ол, вста­вить симв­ ол). Дру­гая быс­ тр­ ая пе­ре­ста­новк­ а У вас есть две строк­ и, ко­то­рые нуж­но по­мен­ ять мест­ а­ми? Пом­ ест­ и­те курс­ ор на верхн­ юю и вве­дит­ е ddp (удал­ ить строк­ у, встав­ ить строк­ у по­сле те­ку­щей). Бы­ст­рая справк­ а Не за­бы­вай­те о встро­енн­ ой справ­ке в Vim. На­жат­ ие кла­виш­ и F1 раз­ дел­ ит окн­ о и отоб­ раз­ ит со­дер­жи­мое онл­ айн­ о­вой справк­ и. Что это за ком­ ан­ду я ис­польз­ о­вал? В об­щем случ­ ае Vim от­крыв­ ае­ т дос­туп к не­дав­но выз­ ванн­ ым ко­ман­ дам пут­ ем ис­польз­ о­ван­ ия клав­ иш со стрелк­ а­ми в ком­ андн­ ой строк­ е.

340 Глава 15. Другие полезности в Vim На­жи­мая стрел­ки вверх и вниз, вы смо­же­те пер­ ем­ ещ­ ать­ся по не­дав­ ним ком­ ан­дам из спис­ ка и  ред­ акт­ ир­ ов­ ать их. Не­за­ви­сим­ о от то­го, пра­ви­лись ли ком­ ан­ды в ист­ ор­ ии Vim или нет, мож­но выз­ вать лю­ бую из них наж­ а­тие­ м на ENTER. Мож­но лучш­ е изуч­ ить эту особ­ ен­ность, есл­ и выз­ вать встро­ен­ное в  Vim ред­ акт­ ир­ о­ван­ ие ис­тор­ ии ко­манд. Это дел­ ае­ тс­ я наж­ ат­ ие­ м CTRL-F в ко­мандн­ ой стро­ке. От­кро­етс­ я не­больш­ ое «ко­манд­ное» ок­ но (его вы­сот­ а по умолч­ ан­ ию рав­на 7), в кот­ ор­ ом вы смо­же­те пе­рем­ е­ щать­ся обычн­ ы­ми ко­ман­дам­ и пе­рем­ е­щен­ ия Vim. Так­же здесь мож­ но вып­ ол­нять пои­ ск, как в  обычн­ ом буф­ е­ре Vim, и  ре­дакт­ и­ров­ ать ко­манд­ ы. В  окн­ е ре­дакт­ ир­ о­ван­ ия ко­манд­ ы можн­ о легк­ о отыс­ кать не­давн­ юю ко­ман­ду, при не­обх­ о­ди­мос­ ти из­мен­ ить ее и вы­полн­ ить наж­ а­ти­ем на ENTER. Этот бу­фер мож­но за­пис­ ать в отд­ ельн­ ый файл, чтоб­ ы сох­ ра­ нить ис­то­рию ком­ анд для буд­ у­ще­го исп­ оль­зо­ван­ ия. Нем­ но­го юмор­ а По­проб­ уй­те вве­сти :help sure и по­чит­ айт­ е, что отв­ ет­ ит Vim.Другие ресурсы Здесь мы прив­ ед­ ем две ссыл­ки на HTML-коп­ ии встро­ен­ной справк­ и Vim для двух сам­ ых пос­ ледн­ их осн­ ов­ных рел­ из­ ов Vim: Vim 6.2 http://www.vim.org/htmldoc/help.html Vim 7 http://vimdoc.sourceforge.net/htmldoc/usr_toc.html Кром­ е тог­ о, http://vimdoc.sourceforge.net/vimfaq.html – это FAQ (час­то за­ да­вае­мые воп­ рос­ ы) для Vim. В нем не связ­ ан­ ы отв­ ет­ ы и во­прос­ ы, но все они на­ход­ ят­ся на од­ной стра­ниц­ е. Мы рек­ о­менд­ уе­ м про­лис­тать стран­ и­ цу вниз до от­ве­тов и нач­ ать чте­ние от­туд­ а. Рань­ше на офи­ци­аль­ной стра­ниц­ е Vim мож­но был­ о по­слать со­ве­ты по про­грамм­ е, од­нак­ о из-за про­блем со спа­ме­ра­ми ад­мин­ ис­ т­ра­тор­ ы пе­ре­ мес­тил­ и со­вет­ ы в wiki, где со спа­мом бор­ отьс­ я прощ­ е. Адр­ ес стран­ иц­ ы в wiki: http://vim.wikia.com/wiki/Category:Integration.

III Другие клоны vi Часть III.В част­ и III расс­ мат­рив­ аю­ тс­ я друг­ ие поп­ у­ляр­ные клон­ ы vi, ко­тор­ ые раз­вив­ а­лись па­ралл­ ельн­ о с Vim. Эта часть сод­ ерж­ ит сле­дую­щие гла­вы:• Глав­ а 16 «nvi: нов­ ый vi»• Гла­ва 17 «elvis»• Глав­ а 18 «vile: vi Like Emacs»



16 nvi: новый vi Глава 16.nvi – сок­ ра­щен­ ие от «new vi» (нов­ ый vi). Изн­ ач­ альн­ о этот ред­ акт­ ор былразр­ аб­ от­ ан в  Кал­ и­фор­нийс­ ком унив­ ерс­ ит­ ет­ е в  Берк­ли (University ofCalifornia at Berkeley) (UCB), на род­ и­не Berkeley Software Distribution(BSD) UNIX. Он и был исп­ ольз­ ов­ ан для нап­ ис­ ан­ ия этой глав­ ы.Автор и историяОри­гин­ аль­ный vi был созд­ ан в UCB в конц­ е 1970-х год­ ов Билл­ ом Джой­ем (Bill Joy), тог­ да еще студ­ ен­том от­дел­ е­ния комп­ ь­ют­ ер­ных нау­ к, ко­то­рый поз­же стал осн­ ов­ ат­ е­лем и виц­ е-през­ и­ден­том Sun Microsystems.До vi Билл Джой (Bill Joy) снач­ ал­ а нап­ и­сал ex, ос­но­выв­ ая­ сь на силь­ноулучш­ ен­ном шест­ ом изд­ ан­ ии ре­дак­то­ра ed. Пер­вым усо­вер­шенс­ тв­ ов­ а­ни­ем стал отк­ рыт­ ый реж­ им, кот­ о­рый он сдел­ ал со­вмес­ т­но с Чак­ ом Ха­ли (Chuck Haley). Межд­ у 1976 и 1979 го­д­ ам­ и ex прев­ рат­ ил­ся в vi. Зат­ емв Берк­ли приш­ ел Марк Хор­тон (Mark Horton), до­ба­вил макр­ ос­ ы «и дру­гие функц­ ии»1 и  про­де­лал над прог­ рамм­ ой мног­ о раб­ от­ ы, пос­ ле чег­ оред­ акт­ ор стал зап­ уск­ атьс­ я на ог­ромн­ ом чис­ле терм­ ин­ ал­ ов и UNIX-сис­тем. К верс­ ии 4.1 BSD (1981) он уже со­дер­жал в себ­ е все функ­ции, опи­санн­ ые в част­ и I этой книг­ и.Нес­ мотр­ я на все пер­ е­мен­ ы, ядром vi был (и ос­та­ет­ся) из­нач­ альн­ ый UNIX-ред­ ак­тор ed. Из-за этог­ о его код нельз­ я бы­ло своб­ од­но рас­прос­ тран­ ять.К  нач­ а­лу 1990-х год­ ов, ко­гда шла ра­бо­та над 4.4 BSD, разр­ аб­ от­чик­ иBSD за­хо­те­ли иметь верс­ ию vi, кот­ ор­ ая мог­ла бы сво­бодн­ о расп­ рос­ тра­нять­ся в вид­ е ис­ходн­ ог­ о код­ а.1 Из спра­вочн­ о­го ру­ко­вод­ ства vi. К  сож­ ал­ ен­ ию, как­ ие именн­ о функц­ ии, не го­во­рит­ся.

344 Глава 16. nvi: новый vi Кейт Бос­тич (Keith Bostic) из UCB на­чал с elvis 1.81 – своб­ од­но расп­ ро­ стра­няе­мой мод­ иф­ ик­ а­ции vi – и стал пре­вра­щать его в «по­оши­бочн­ о со­ вмест­ и­мую» раз­но­вид­ность изн­ а­чаль­но­го ред­ акт­ ор­ а. nvi такж­ е сле­дуе­ т стан­дар­там POSIX Command Language и Utilities Standard (IEEE P1003.1) вез­де, где это име­ет смысл. Буд­ уч­ и уже не связ­ анн­ ым с UCB, Кейт Бос­тич (Keith Bostic) про­долж­ а­ ет расп­ рос­ тран­ ять nvi. На мо­мент на­пи­са­ния книг­ и тек­ ущ­ ая верс­ ия имел­ а ном­ ер 1.79. nvi ва­жен, пос­ кольк­ у это «офи­циа­ ль­ная» берк­лее­ в­ская вер­сия vi. Это часть 4.4 BSDLite II, и именн­ о она ис­польз­ у­ет­ся в по­пу­лярн­ ых раз­но­ видн­ о­стях BSD, та­ких как NetBSD и FreeBSD.Важные аргументы командной строки В чист­ ом окр­ уж­ е­нии BSD nvi ус­та­нав­ли­ва­ет­ся под име­нам­ и ex, vi и view. Обыч­но все они ссы­лаю­ тс­ я на один и тот же ис­полн­ яем­ ый файл, и nvi смотр­ ит, как он был вы­зван, что­бы вест­ и себ­ я со­отв­ ет­ств­ ующ­ им обр­ а­ зом. В нем доп­ ус­ка­ет­ся ком­ ан­да Q реж­ им­ а vi для пе­ре­ход­ а в реж­ им ex. Ва­ри­ант view по­хож на vi, за иск­ лю­чен­ ие­ м из­нач­ аль­но ус­та­новл­ ен­ной опц­ ии readonly. nvi под­держ­ и­вае­ т оп­ред­ е­лен­ный наб­ ор опц­ ий ко­манд­ной строк­ и. При­ вед­ ем наиб­ о­лее част­ о употр­ еб­ляем­ ые: -c command При стар­те вы­пол­ня­ет ком­ анд­ у command. Это POSIX-вер­сия ист­ ор­ и­ чес­ ки сло­жив­ше­гос­ я синт­ ак­си­са +command, одн­ а­ко nvi не ог­ран­ и­чен по­зи­ци­онн­ ым­ и ар­гу­мен­та­ми (стар­ ый син­так­сис тож­ е ра­бот­ а­ет). -F Не коп­ и­ров­ ать весь файл при на­чал­ е ред­ акт­ ир­ о­ван­ ия. Это мож­ ет уве­ лич­ ить скор­ ость ра­бо­ты, но при этом до­пус­ка­етс­ я воз­мож­ность си­ туа­ции, ког­ да в ред­ ак­ти­руем­ ый вам­ и файл кто-то дру­гой тож­ е вно­ сит из­ме­нен­ ия. -r Вос­ста­нов­ ить указ­ анн­ ые фай­лы или, есл­ и файл­ ы не ука­за­ны в ко­ мандн­ ой строк­ е, выв­ ест­ и спи­сок всех файл­ ов, кот­ о­рые мож­но вос­ стан­ ов­ ить. -R Зап­ уск в реж­ им­ е «тольк­ о для чтен­ ия» и ус­та­новк­ а опц­ ии readonly. -s Вход в па­кетн­ ый (скрип­то­вый) реж­ им. Пред­наз­ нач­ е­но тольк­ о для ex и для за­пуск­ а скрип­тов ред­ акт­ и­ро­ва­ния. От­клю­чен­ ы все подс­ каз­ки 1 Хот­ я от перв­ он­ ач­ альн­ о­го код­ а elvis ед­ва ли что-то ос­та­лось.

Онлайн-справка и другая документация 345 и соо­ бщ­ ен­ ия, кром­ е соо­ бщ­ е­ний об ошибк­ ах. Это POSIX-верс­ ия для ист­ о­рич­ ес­ ко­го арг­ ум­ ент­ а «-»; nvi подд­ ер­жив­ а­ет оба вар­ и­ан­та. -S Зап­ уск с  уст­ ан­ ов­лен­ной оп­цие­ й secure, кот­ ор­ ая зап­ рещ­ ае­ т дос­туп к внешн­ им про­грамм­ ам1. -t tag Нач­ ать ре­дакт­ и­ров­ а­ние на указ­ анн­ ом тег­ е tag. -w size Уст­ а­нов­ка разм­ ер­ а внутр­ енн­ ег­ о окн­ а равн­ ым size строк.Онлайн-справка и другая документация nvi пос­ тав­ля­етс­ я с до­вольн­ о пол­ной рас­печ­ а­ты­ваем­ ой до­кум­ ент­ а­цие­ й. Она дост­ упн­ а в  вид­ е ис­ходн­ ик­ а troff, в  форм­ ат­ е ASCII и  в  PostScript и вклю­чае­ т след­ ующ­ ие до­кум­ ен­ты: Спра­вочн­ ое рук­ о­вод­ ство vi Справ­ очн­ ое ру­ков­ од­ ство для nvi, опис­ ы­вающ­ ее все опц­ ии ком­ анд­ ной строк­ и nvi, ко­ман­ды, оп­ции и ко­манд­ ы ex. Man-стран­ иц­ ы vi Стран­ иц­ ы рук­ о­вод­ ства (manpage) для nvi. Учебн­ ик vi Этот док­ у­мент яв­ляе­ т­ся ввод­ным курс­ ом в ре­дак­тир­ ов­ ан­ ие в vi. Справ­ оч­ное рук­ ов­ од­ ство для ex Пред­став­ляе­ т со­бой ис­ход­ный ва­ри­ант до­ку­мен­тац­ ии по ex и яв­ляе­ т­ ся нем­ ног­ о ус­та­рев­шим вви­ду но­вых воз­можн­ о­стей в nvi. Кро­ме тог­ о, сюд­ а вклю­че­ны фай­лы ACSII, в кот­ о­рых зад­ ок­ ум­ ен­тир­ о­ва­ ны не­ко­то­рые внутр­ енн­ ие осо­бенн­ ос­ ти nvi, а  так­же да­ет­ся спис­ ок по­ лез­ных функц­ ий и фай­лы, кот­ ор­ ые мож­но ис­польз­ ов­ ать в кач­ е­ст­ве он­ лайн-справ­ки vi. Встро­ен­ная в  nvi онл­ айн-справ­ка мин­ им­ аль­на и  сод­ ер­жит две ком­ ан­ ды: :exusage и  :viusage. Они пре­дост­ ав­ляю­ т одн­ о­строчн­ ые ре­зюм­ е для кажд­ ой ко­манд­ ы ex и  vi. Обычн­ о этог­ о дос­тат­ оч­но, что­бы вспомн­ ить, как ра­бот­ ае­ т та или иная ко­манд­ а, но не под­ход­ ит для изуч­ е­ния но­вых или не­по­нятн­ ых функ­ций nvi. В кач­ е­ст­ве ар­гум­ ент­ а для :exusage и :viusage можн­ о за­дав­ ать ком­ ан­ду. В этом случ­ ае nvi пок­ а­жет справ­ку тольк­ о для нее и вы­вед­ ет од­ну стро­1 Как и на все, что имее­ т в наз­ ва­нии «secure» (безо­ пас­ный), полн­ ос­ тью по­ла­ гать­ся на это не стои­ т. Тем не ме­нее Кейт Бос­тич (Keith Bostic) утв­ ер­жда­ет, что оп­ции secure в nvi можн­ о до­ве­рять.

346 Глава 16. nvi: новый vi ку, объ­яс­няющ­ ую на­зна­чен­ ие этой ко­манд­ ы, и од­ну, где по­ка­зан­ о ее ис­ поль­зо­ван­ ие.Инициализация Ес­ли ука­за­ны опц­ ии -s или «-», nvi иг­но­рир­ у­ет все иниц­ иа­ли­за­ции. Ина­че про­грам­ма про­из­ве­дет сле­дующ­ ие шаг­ и: 1. Счит­ а­ет и вып­ олн­ ит файл /etc/vi.exrc. Его вла­дельц­ ем долж­ны быть ли­бо вы, либ­ о root. 2. Вы­числ­ ит зна­чен­ ие пе­ре­менн­ ой ок­руж­ е­ния NEXINIT при ее на­лич­ ии, инач­ е исп­ оль­зуе­ т пер­ ем­ енн­ ую EXINIT, ес­ли она сущ­ е­ств­ уе­ т. Ис­поль­ зуе­ т­ся тольк­ о одн­ а из этих пер­ ем­ ен­ных. Игн­ о­рир­ уе­ тс­ я1 вы­полн­ ен­ ие $HOME/.nexrc или $HOME/.exrc. 3. Есл­ и су­щес­ т­ву­ет файл $HOME/.nexrc, то он счи­ты­вае­ тс­ я и вы­полн­ я­ет­ ся. Инач­ е счи­ты­вае­ т­ся и  вып­ олн­ я­етс­ я $HOME/.exrc. Об­раб­ а­ты­ватьс­ я буд­ ет толь­ко один файл. 4. Есл­ и ус­тан­ ов­ле­на опц­ ия exrc, то ред­ ак­тор ищет и  вы­пол­ня­ет файл ./.nexrc, а ес­ли та­ко­во­го нет, то./.exrc. Обр­ а­ба­ты­вать­ся бу­дет тольк­ о один из этих файл­ ов. nvi не буд­ ет обр­ аб­ а­тыв­ ать файл, прав­ а на за­пись в ко­тор­ ый имее­ т кто-то еще кро­ме его вла­дель­ца. В  до­ку­мент­ ац­ ии nvi пред­лаг­ а­ет­ся по­мес­тить об­щие дей­ст­вия иниц­ иа­ лиз­ ац­ ии (то есть опц­ ии и ком­ анд­ ы для UNIX vi) в ваш файл .exrc и вы­ зы­вать ко­ман­ду :source .exrc в ваш­ ем файл­ е .nexrc пе­ред или пос­ ле ини­ циал­ и­зац­ ий, спе­ци­фич­ных для nvi.Многооконное редактирование Что­бы соз­дать нов­ ое окн­ о в  nvi, исп­ оль­зуй­те вер­сию одн­ ой из ко­манд ре­дакт­ и­ров­ ан­ ия ex, нап­ и­сан­ную с про­писн­ ой бук­ ­вы: Edit, Fg, Next, Pre­ vious, Tag или Visual (как обычн­ о, можн­ о при­ме­нять абб­ рев­ иа­тур­ ы этих ком­ анд). Ес­ли курс­ ор нах­ од­ ит­ся в  верх­ней по­ло­вин­ е экр­ ан­ а, то нов­ ое ок­но поя­ вит­ся в ниж­ней, и нао­ бор­ от. Пер­ е­клю­че­ние на дру­гое окн­ о про­ исх­ о­дит с по­мо­щью CTRL-W: <preface id=\"VI6-CH-0\"> <title>Preface </title> <para> Text editing is one of the most common uses of any computer system, and <command>vi</command> is one of the most useful standard text editors on your system. With <command>vi</command> you can create new files, or edit any existing 1 Есл­ и пе­рем­ енн­ ые NEXINIT или EXINIT опр­ е­де­лен­ ы. – Прим. нау­ ч. ред.

Многооконное редактирование 347Unix text file.</para>ch00.sgm: unmodified: line 1# Makefile for vi book## Arnold RobbinsCHAPTERS = ch00_6.sgm ch00_5.sgm ch00.sgm ch01.sgm ch02.sgm ch03.sgm \ ch04.sgm ch05.sgm ch06.sgm ch07.sgm ch08.sgmAPPENDICES = appa.sgm appb.sgm appc.sgm appd.sgmPOSTSCRIPT = ch00_6.ps ch00_5.ps ch00.ps ch01.ps ch02.ps ch03.ps \ ch04.ps ch05.ps ch06.ps ch07.ps ch08.ps \Makefile: unmodified: line 1В  этом при­мер­ е пок­ а­за­но, как nvi ред­ ак­тир­ у­ет два фай­ла: ch00.sgmи Makef­ile. Раз­де­ле­ние эк­ра­на прои­ зошл­ о в рез­ уль­та­те вво­да nvi ch00.sgmи  по­сле­до­вавш­ ег­ о за ним :Edit Makefile. По­следн­ яя строк­ а каж­до­гофай­ла ра­бот­ ае­ т как стро­ка со­стоя­ния, и именн­ о там вы­пол­ня­ютс­ я ко­манд­ ы с двоет­ о­чи­ем для этог­ о ок­на. Строк­ и сос­ тоян­ ия по­ка­зан­ ы инв­ ер­тир­ о­ванн­ ым цве­том.Ко­ман­ды соз­дан­ ия окон в реж­ им­ е ex и их дей­ств­ ия опи­сан­ ы в табл. 16.1.Таб­ли­ца 16.1. Ко­ман­ды управ­ле­ния ок­нам­ и в nviКом­ анд­ а Функ­цияbg Скрыв­ а­ет тек­ у­щее ок­но. Его можн­ о выз­ вать пов­ торн­ о ко­манд­ а­ ми fg и Fg.di[splay] Пок­ а­зы­вае­ т все буф­ е­ры, вклю­чая име­но­ванн­ ые, не­име­но­ван­ныеb[uffers] и циф­ро­вые.di[splay] По­ка­зы­ва­ет все име­на фай­лов окон, рас­пол­ ож­ ен­ных в фон­ е.s[creens]Edit filename Ред­ акт­ и­руе­ т файл filename в но­вом ок­не.Edit /tmp Соз­дае­ т но­вое окн­ о, где пок­ аз­ ыв­ а­етс­ я пуст­ ой буф­ ер. /tmp спе­ци­fg filename альн­ о инт­ ерп­ рет­ ир­ уе­ т­ся как созд­ ан­ ие нов­ о­го врем­ енн­ ог­ о файл­ а.Fg filename Воз­вра­щае­ т файл filename в тек­ у­щее ок­но. Пред­ ы­дущ­ ий файл от­ход­ ит на фон. Возв­ ра­ща­ет файл filename в но­вом ок­не. Те­кущ­ ее ок­но раз­де­ля­ ет­ся, вме­сто тог­ о что­бы мес­ то на экр­ ан­ е пер­ е­расп­ ре­дел­ ил­ ось меж­ ду все­ми от­кры­ты­ми ок­нам­ и.Next Ре­дакт­ ир­ у­ет сле­дую­щий файл из спи­ска ар­гу­мент­ ов в нов­ ом окн­ е.Previous Ре­дакт­ и­руе­ т пре­дыд­ ущ­ ий файл из спис­ ка арг­ у­мент­ ов в нов­ ом окн­ е (в nvi есть со­отв­ етс­ тв­ ую­щая ком­ ан­да previous, пе­рем­ ещ­ аю­ щая польз­ о­ва­те­ля обр­ атн­ о к пред­ ы­ду­ще­му файл­ у, но в vi ее нет).resize ±nrows Уве­ли­чи­ва­ет или умень­ша­ет разм­ ер те­ку­ще­го ок­на на nrows строк.Tag tagstring Ред­ акт­ и­руе­ т файл, сод­ ерж­ ащ­ ий tagstring, в но­вом окн­ е.

348 Глава 16. nvi: новый vi Ко­ман­да CTRL-W цик­ли­чес­ ки пе­ре­мещ­ а­ет меж­ду ок­на­ми, свер­ху вниз. Ком­ ан­ды :q и ZZ – это вы­ход из те­ку­ще­го ок­на. Мож­но иметь нес­ коль­ко окон, в  кот­ о­рых отк­ рыт один файл. Изм­ е­не­ ния, сде­ланн­ ые в одн­ ом окн­ е, отр­ а­жаю­ тс­ я в друг­ ом, хот­ я исп­ рав­ле­ния, сдел­ анн­ ые в реж­ им­ е вставк­ и nvi, не бу­дут вид­ны в дру­гом окн­ е, по­ка вы не за­верш­ и­те правк­ у на­жа­ти­ем ESC. Поль­зо­ва­те­ля не буд­ ут при­гла­ шать сох­ ра­нить изм­ ен­ ен­ ия до вы­зов­ а ко­манд­ ы, зак­ ры­вающ­ ей пос­ лед­ нее ок­но у файл­ а.Графические интерфейсы nvi не имее­ т вер­сии с граф­ и­чес­ ким поль­зов­ ат­ ельс­ ким инт­ ер­фейс­ ом (GUI).Расширенные регулярные выражения Мы поз­ нак­ ом­ ил­ ись с  рас­ши­рен­ны­ми рег­ ул­ яр­ны­ми выр­ аж­ е­ния­ми еще рань­ше, в раз­дел­ е «Расш­ и­рен­ные ре­гул­ ярн­ ые выр­ а­же­ния» на стр. 152. Сейч­ ас  мы обоб­щим мет­ а­сим­вол­ ы, пре­дос­тав­ляем­ ые nvi. Прог­ рам­ма такж­ е подд­ ерж­ ив­ ае­ т груп­пов­ ые выр­ а­жен­ ия POSIX, [[:alnum:]] и про­чие. Для вы­зо­ва пои­ ск­ а по рас­ши­ренн­ ым рег­ ул­ ярн­ ым вы­раж­ ен­ ия­ м нужн­ о вып­ ол­нить :set extended: | Ука­зы­вае­ т на аль­тер­нат­ иву. Ле­вая и  пра­вая сто­рон­ ы не обя­за­ны быть один­ оч­ным­ и симв­ ол­ ам­ и. (...) Исп­ ольз­ уе­ т­ся для груп­пир­ ов­ки, чтоб­ ы до­пуст­ ить при­ме­нен­ ие до­ пол­ни­тельн­ ых опер­ а­то­ров раб­ от­ ы с ре­гул­ яр­ным­ и выр­ аж­ е­ниям­ и. Ко­гда ус­тан­ овл­ ен extended, текст, сгрупп­ ир­ о­ванн­ ый кругл­ ы­ми скоб­ кам­ и, ра­бот­ ае­ т как текст, сгруп­пир­ о­ванн­ ый в  \(...\) в  обыч­ном vi. К соб­ст­вен­но тек­сту мож­но обр­ ат­ итьс­ я в стро­ке зам­ е­ны с пом­ ощ­ ью \1, \2 и  т. д. В  этом случ­ ае \( пред­став­ля­ет соб­ ой бу­к­вальн­ о ле­вую скобк­ у. + Соо­ т­вет­ст­ву­ет одн­ о­му или нес­ кольк­ им вхо­жд­ ен­ и­ям пред­ше­ств­ ую­ щег­ о ре­гул­ яр­ног­ о вы­ра­же­ния. Им мо­жет быть один симв­ ол ли­бо групп­ а симв­ ол­ ов, зак­ люч­ ен­ных в круг­лые скоб­ки. ? Соо­ тв­ ет­ств­ уе­ т одн­ ом­ у или ни одн­ о­му вхо­ж­де­нию пред­ше­ст­вующ­ ег­ о ре­гул­ ярн­ о­го вы­раж­ ен­ ия. {...} Опр­ е­дел­ я­ет инт­ ер­валь­ное вы­раж­ е­ние. Оно опис­ ыв­ а­ет счетн­ ое числ­ о пов­ тор­ ен­ ий. В сле­дую­щем опи­сан­ ии n и m предс­ тав­ля­ют со­бой цел­ о­ чис­лен­ные кон­стан­ты.

Улучшения в редактировании 349 {n} Соо­ тв­ етс­ т­ву­ет n вхож­ д­ ен­ и­ям пред­ше­ст­вую­щег­ о рег­ ул­ ярн­ о­го вы­ ра­жен­ ия. {n,} Со­от­вет­ст­ву­ет не ме­нее чем n вхо­жд­ ен­ и­ям пред­ше­ств­ ующ­ е­го ре­ гу­ляр­ног­ о выр­ а­же­ния. {n,m} Соо­ т­вет­ств­ уе­ т ко­ли­че­ств­ у вхож­ д­ е­ний предш­ е­ств­ ую­щег­ о ре­гул­ яр­ но­го вы­ра­же­ния от n до m. Есл­ и опц­ ия extended не ус­тан­ овл­ ен­ а, nvi пред­ ост­ ав­ляе­ т те же са­мые воз­можн­ о­сти, но с исп­ ольз­ ов­ ан­ ие­ м \{ и \}. Как можн­ о ожи­дать, есл­ и extended уст­ а­нов­лен­ а, то для бу­к­вальн­ о­го со­ от­ветс­ тв­ ия ме­тас­ имв­ о­лам пе­ред ним­ и нужн­ о став­ ить об­рат­ную ко­сую черт­ у.Улучшения в редактировании Этот раз­дел опи­сыв­ а­ет особ­ ен­нос­ ти nvi, ко­тор­ ые еще бо­лее обл­ ег­чаю­ т раб­ от­ у и расш­ ир­ я­ют воз­мож­но­сти прос­ тог­ о ред­ акт­ и­ров­ а­ния текс­ та.История и завершение командной строки nvi сох­ ра­няе­ т ком­ анд­ ы ex и да­ет воз­можн­ ость ред­ ак­ти­ро­вать их для по­ сле­дую­ще­го вво­да. Эта спо­собн­ ость управ­ля­етс­ я оп­цие­ й cedit, знач­ ен­ ие которой – строк­ а. При вво­де пер­во­го симв­ о­ла этой стро­ки в ко­мандн­ ой строк­ е с двое­то­чи­ ем nvi отк­ ры­ва­ет но­вое ок­но с ист­ ор­ и­ей ко­манд, ко­то­рую можн­ о ре­дак­ тир­ ов­ ать. Есл­ и на ка­кой-ни­будь строк­ е на­жать ENTER, про­грамм­ а вы­ пол­нит ее. Этой оп­ции удоб­но по­ста­вить в  со­отв­ етс­ т­вие ESC (для его ввод­ а исп­ ольз­ уй­те ^V ^[). Так как на­жа­тие ENTER за­пус­ка­ет вы­полн­ ен­ ие ком­ ан­ды, для пе­ре­ме­ щен­ ия вниз по стро­кам нео­ б­ход­ им­ о польз­ о­ватьс­ я кла­виш­ а­ми j или ↓. Помимо ре­дакт­ ир­ ов­ а­ния ко­мандн­ ой строк­ и мож­ но вы­полн­ ять под­ста­ нов­ку в имен­ ах фай­лов. Эта воз­мож­ность управ­ляе­ т­ся опц­ ие­ й filec. При вво­де ее перв­ о­го симв­ о­ла в ко­манд­ной строк­ е с двое­точ­ ие­ м nvi рас­ смат­рив­ ае­ т отд­ е­лен­ное проб­ е­ла­ми слов­ о пер­ ед курс­ о­ром, как есл­ и бы к нем­ у бы­ла прип­ и­са­на * и про­изв­ о­дит подс­ та­нов­ку имен­ и фай­ла, как в ком­ андн­ ой строк­ е. Этой опц­ ии такж­ е удоб­но пос­ та­вить в соо­ тв­ ет­ств­ ие ESC (для его ввод­ а исп­ оль­зуйт­ е ^V ^[). Есл­ и вы пос­ та­ви­ли этой опц­ ии в со­от­вет­ст­вие тот же сим­вол, что и для опц­ ии cedit, ре­дак­ти­ро­ван­ ие ко­мандн­ ой стро­ки про­ис­хо­дит толь­ко то­

350 Глава 16. nvi: новый vi гда, ко­гда перв­ ый введ­ енн­ ый симв­ ол знач­ ен­ ия опц­ ии cedit одн­ ов­ рем­ ен­ но явл­ яе­ тс­ я перв­ ым в ком­ андн­ ой стро­ке с двое­точ­ и­ем. Док­ у­мент­ а­ция nvi указ­ ы­вае­ т, что TAB – еще один расп­ ро­стра­нен­ ный выб­ ор для оп­ции filec. Что­бы это зар­ а­бот­ а­ло, нуж­но вве­сти :set filec=\TAB. В лю­бом случ­ ае на прак­ти­ке ис­польз­ ов­ ан­ ие ESC хор­ ош­ о раб­ о­та­ет для обо­их вар­ и­ан­тов. Про­ще всег­ о ус­та­нов­ ить эти опц­ ии в файл­ е .nexrc: set cedit=^[ set filec=^[Стеки тегов Те­ги был­ и опис­ ан­ ы ран­ ее в разд­ ел­ е «Стек­ и те­гов» на стр. 157. Стек те­гов в nvi – са­мый про­стой сре­ди чет­ ы­рех мо­ди­фи­кац­ ий ори­ги­наль­ног­ о ре­ дак­то­ра. В табл. 16.2 и 16.3 пок­ а­за­ны исп­ оль­зуе­мые для нег­ о ко­манд­ ы. Таб­лиц­ а 16.2. Ком­ анд­ ы раб­ от­ ы с тег­ а­ми в nvi Ко­манд­ а Функ­ция di[splay] t[ags] Ото­браз­ ить стек тег­ ов. ta[g][!] tagstring Ред­ акт­ ир­ ов­ ать файл, сод­ ерж­ а­щий tagstring, как опр­ е­де­ле­но в фай­ле tags. ! при­ну­жд­ а­ет nvi пе­ре­ключ­ итьс­ я в нов­ ый файл, даж­ е есл­ и те­кущ­ ий буф­ ер был изм­ е­нен, но не со­хран­ ен. Ta[g][!] tagstring Дей­ст­ву­ет как :tag, толь­ко в данн­ ом слу­чае файл ре­дак­ти­ ру­етс­ я в нов­ ом ок­не. tagp[op][!] tagloc Из­влек­ а­ет из стек­ а все тег­ и вплоть до указ­ анн­ о­го или до по­ следн­ е­го исп­ оль­зов­ ав­ше­гос­ я те­га, есл­ и tagloc от­сутс­ тв­ уе­ т. Поз­ иц­ и­ей мож­ ет быть как имя фай­ла ин­тер­ е­сую­щег­ о нас те­га, так и ном­ ер, прис­ вое­ н­ный тег­ у в стек­ е. tagt[op][!] Пе­рех­ о­дит на сам­ ый стар­ ый тег в стек­ е. При этом стек очи­ ща­ет­ся. Табл­ иц­ а 16.3. Ко­ман­ды ра­бо­ты с те­га­ми для ко­манд­ног­ о реж­ им­ а nvi Ко­манд­ а Функ­ция ^] В файл­ е tags ищет по­лож­ е­ние идент­ иф­ и­ка­тор­ а, на ко­тор­ ом ^T сто­ит курс­ ор, и пе­ре­хо­дит на это ме­сто. Тек­ у­щее по­ло­же­ние авт­ о­мат­ ич­ е­ски зан­ о­ситс­ я в стек те­гов. Возв­ рат к пре­дыд­ ущ­ ем­ у пол­ ож­ ен­ ию в стек­ е тег­ ов, то есть изв­ ле­чен­ ие элем­ ент­ а из сте­ка. Можн­ о ус­та­но­вить опц­ ию tags как спис­ ок имен фай­лов, где nvi бу­дет ис­ кать тег. Та­кой подх­ од по­зво­ля­ет за­дать уп­рощ­ енн­ ую схе­му пу­тей по­ис­


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