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

Улучшения в редактировании 351 ка. Знач­ е­ние по умолчанию – \"tags /var/db/libc.tags /sys/kern/tags\", при ко­то­ром в сис­тем­ е 4.4 BSD сна­чал­ а идет пои­ ск в те­ку­щем ка­тал­ о­ге, а за­ тем в файл­ ах биб­лиот­ е­ки C и в ис­ходн­ ом ко­де опер­ а­цио­ н­ной сист­ ем­ ы. Оп­ция taglength управл­ я­ет ко­ли­че­ств­ ом сим­во­лов, кот­ о­рое знач­ и­мо в стро­ке тег­ а. Зна­чен­ ие по умол­чан­ ию, равн­ ое ну­лю, оз­нач­ а­ет, что нуж­ но исп­ оль­зов­ ать все симв­ ол­ ы. nvi ве­дет се­бя при­мерн­ о как vi: исп­ ольз­ уе­ т «сло­во», на ко­тор­ ом стои­ т кур­сор, нач­ ин­ ая с те­кущ­ ей поз­ и­ции курс­ о­ра. Ес­ли курс­ ор стои­ т на бу­к­ ве i в сло­ве main, то nvi ищет иден­тиф­ ик­ ат­ ор in, а не main. nvi опи­ра­ет­ся на трад­ иц­ и­онн­ ый форм­ ат фай­ла tags. К со­жал­ ен­ ию, этот форм­ ат силь­но огр­ а­нич­ ен. В час­ тн­ ос­ ти, в нем нет кон­цепц­ ии об­лас­ти ви­дим­ о­сти язы­ка прог­ рамм­ ир­ ов­ а­ния, по­зво­ляю­щей од­ном­ у иден­ти­ фи­кат­ о­ру исп­ оль­зов­ атьс­ я в  раз­ных конт­ ек­стах и  зак­ ре­пл­ ять за со­бой раз­ные пон­ ят­ ия. Эта проб­ ле­ма усуг­ убл­ я­етс­ я в C++, кот­ ор­ ый доп­ уск­ ае­ т явн­ ую пер­ е­груз­ку име­ни функц­ ии, то есть ис­поль­зов­ а­ние од­но­го и тог­ о же име­ни для разн­ ых функ­ций. nvi об­ход­ ит огр­ ан­ и­чен­ ия, на­клад­ ы­вае­мые файл­ ом tags, исп­ оль­зуя со­ верш­ енн­ о друг­ ой ме­хан­ изм1 – прог­ рамм­ у cscope. Бу­ду­чи ко­гда-то про­ приет­ арн­ ой, сей­час cscope яв­ля­етс­ я прог­ рамм­ ой с  от­кры­тым ко­дом, дост­ упн­ ой в прое­ кт­ е Bell Labs World-Wide Exptools (зайд­ ит­ е на http:// www.bell-labs.com/project/wwexptools/). Она счит­ ыв­ а­ет ис­ходн­ ые фай­лы C и соз­да­ет ба­зу дан­ных, опис­ ыв­ аю­щую про­грамм­ у. В nvi есть ком­ ан­ды, осу­ще­ств­ л­ яю­щие зап­ ро­сы и по­зво­ляю­щие обр­ а­бат­ ыв­ ать рез­ ульт­ ат­ ы. По­ сколь­ку cscope дост­ упн­ а не везд­ е, мы не ста­нем расс­ мат­рив­ ать ее здесь. Подр­ обн­ ос­ ти про ком­ анд­ ы nvi из­лож­ е­ны в его до­кум­ ен­тац­ ии. Форм­ ат файл­ а рас­шир­ енн­ ых те­гов, кот­ о­рый ге­нер­ ир­ у­етс­ я прог­ рамм­ ой Exuberant ctags, не прив­ ел ни к ка­ким ошибк­ ам в nvi 1.79; однако nvi ник­ ак не польз­ у­ет­ся пре­имущ­ ес­ т­вам­ и это­го форм­ а­та.Бесконечная отмена Как пра­ви­ло, в vi ко­манд­ а «точ­ка» (.) раб­ от­ а­ет в кач­ е­ств­ е ко­манд­ ы «по­ втор­ ить еще раз»: она пов­ то­ряе­ т по­след­нее дей­ств­ ие ре­дакт­ и­ров­ ан­ ия, будь то удал­ е­ние, встав­ка или за­мен­ а. nvi воз­вод­ ит эту ком­ анд­ у в полн­ оц­ енн­ ую «redo», прим­ ен­ яя ее даж­ е в тех слу­ча­ях, ко­гда пос­ лед­ней ко­манд­ ой бы­ла u (или от­мен­ а). Так­ им об­раз­ ом, чтоб­ ы нач­ ать сер­ ию ком­ анд «от­мен­ ы», прос­ то вве­дит­ е u. Зат­ ем для кажд­ ой ввод­ и­мой точ­ки nvi прод­ ол­жит от­мен­ ять изм­ ен­ е­ния, по­степ­ ен­но возв­ ращ­ ая файл к перв­ о­нач­ аль­но­му со­стоян­ ию. В конц­ е конц­ ов пер­вон­ а­чальн­ ое со­стоян­ ие файл­ а буд­ ет дост­ игн­ у­то. По­ сле это­го наж­ ат­ ие . прив­ е­дет к сис­темн­ ом­ у сиг­на­лу (или миг­ а­нию эк­ра­1 Ра­ди пол­но­ты кар­ти­ны за­мет­ им, что подд­ ержк­ а cscope есть и в Vim. – Прим. нау­ ч. ред.

352 Глава 16. nvi: новый vi на). Теп­ ерь мож­но ввод­ ить u, что­бы «от­ме­нить отм­ ен­ ы», а точк­ у исп­ оль­ зов­ ать для прим­ ен­ ен­ ия по­след­ ующ­ их прав­ ок. Зам­ е­тим, nvi не по­звол­ я­ет снаб­жать ком­ ан­ды u и . чи­сло­вы­ми ар­гу­мен­ там­ и.Строки произвольной длины и двоичные данные nvi мож­ ет ред­ акт­ и­ров­ ать фай­лы со стро­кам­ и прои­ з­воль­ной дли­ны и с про­из­вольн­ ым числ­ ом строк. Он ав­то­мат­ ич­ е­ски под­дер­жи­ва­ет дво­ичн­ ые данн­ ые. Для этог­ о не тре­бу­ ет­ся спе­циа­ ль­ных опц­ ий ком­ андн­ ой строк­ и или ко­ман­ды ex. Для вво­да в файл лю­бо­го 8-разр­ яд­но­го симв­ ол­ а на­бе­рит­ е ^X, а зат­ ем од­ну или две ше­стн­ а­дца­тер­ ичн­ ых цифр­ ы.Инкрементный поиск Инк­ ре­ментн­ ый пои­ ск в nvi мож­но включ­ ить с пом­ ощ­ ью :set searchincr. При наб­ ор­ е кур­сор пе­рем­ ещ­ а­етс­ я по файл­ у и всег­ да поп­ ад­ ае­ т на перв­ ый симв­ ол текс­ та, соо­ тв­ етс­ тв­ ующ­ е­го вво­ду.Прокрутка влево-вправо В nvi прок­ рутк­ а вле­во-вправ­ о вклю­чае­ тс­ я чер­ ез :set leftright. Знач­ е­ ние sidescroll опр­ ед­ е­ля­ет кол­ и­че­ст­во симв­ ол­ ов, на ко­то­рое nvi сме­щае­ т эк­ран при про­крут­ке влев­ о и впра­во.Помощь программисту В nvi нет спе­циа­ льн­ ых функ­ций для по­мо­щи про­грамм­ и­сту.Интересные функции Из всех клон­ ов nvi явл­ яе­ т­ся са­мым мин­ им­ ал­ и­стичн­ ым, так что ог­ром­ ное ко­лич­ е­ст­во доп­ ол­нит­ ель­ных функ­ций не подд­ ерж­ ив­ ае­ т­ся. Од­нак­ о сущ­ е­ств­ у­ет нес­ кольк­ о важ­ных особ­ ен­нос­ тей, про кот­ ор­ ые сто­ит упо­мя­ нуть: Под­держ­ка ин­тер­нац­ ион­ ал­ из­ а­ции Больш­ ую часть инф­ орм­ а­ци­он­ных со­общ­ е­ний и пред­ у­преж­ д­ ен­ ий в nvi можн­ о за­ме­нить их пер­ ев­ о­дом на друг­ ие язык­ и, исп­ ольз­ уя функ­цию под на­зва­ни­ем «ка­тал­ о­ги соо­ б­ще­ний» (message catalog). nvi реа­лиз­ уе­ т эту функц­ ию собс­ тв­ енн­ ым­ и сред­ст­вам­ и, исп­ оль­зуя мех­ ан­ изм, кот­ о­ рый опис­ ан в файл­ е catalog/README ди­стр­ и­бут­ и­ва nvi. Ка­та­лог­ и соо­ б­ ще­ний (message catalogs) под­дер­жив­ а­ютс­ я для гол­ланд­ско­го, анг­ лий­ско­го, франц­ узс­ ко­го, не­мецк­ ог­ о, русс­ ко­го, ис­панс­ ког­ о и  швед­ ско­го язы­ков.

































































Онлайн-справка и другая документация 385В доп­ олн­ ен­ ие к файл­ у справк­ и vile сод­ ер­жит не­сколь­ко встро­ен­ных ко­манд, ото­браж­ ающ­ их ин­фор­мац­ ию о функ­ция­ х и со­стоя­нии ре­дак­то­ра. Прив­ е­дем са­мые по­лез­ные из них::show-commands Созд­ а­ет но­вое окн­ о, в кот­ ор­ ом пок­ а­зы­вае­ тс­ я полн­ ый спи­сок всех ко­ манд vile с крат­ким опи­сан­ и­ем каж­дой из них. Инф­ ор­мац­ ия пом­ е­ щае­ т­ся в  собс­ тв­ ен­ный буф­ ер, кот­ ор­ ый мож­но расс­ матр­ ив­ ать как обычн­ ый буф­ ер. В ча­ст­но­сти, его мож­но за­пис­ ать в отд­ ельн­ ый файл, что­бы зат­ ем рас­пе­ча­тать.:apropos Пок­ аз­ ы­вае­ т все ком­ анд­ ы, имен­ а кот­ о­рых со­держ­ ат данн­ ую под­стро­ ку. Это нам­ но­го удоб­нее про­стог­ о пои­ с­ка ин­фор­мац­ ии по ин­тер­ е­сую­ щей те­ме в фай­ле справ­ки.:describe-key Зап­ ра­шив­ а­ет у поль­зов­ ат­ ел­ я клав­ иш­ у или пос­ ле­до­ват­ ельн­ ость кла­ виш, а зат­ ем по­ка­зы­ва­ет опис­ а­ние этой ко­ман­ды. На­при­мер, клав­ и­ ша x реа­ли­зу­ет функ­цию delete-next-character.:describe-function За­праш­ ив­ ае­ т у  вас имя функц­ ии, а  зат­ ем по­каз­ ы­вае­ т ее опис­ ан­ ие. Нап­ рим­ ер, функ­ция delete-next-character удал­ я­ет за­данн­ ое кол­ ич­ е­ ств­ о сим­вол­ ов спра­ва от по­зи­ции кур­со­ра.Ком­ ан­ды :apropos, :describe-function и :describe-key обес­пе­чив­ аю­ т опи­са­тельн­ ую ин­фор­ма­цию, вы­да­ют син­ о­ним­ ы (для удобс­ тв­ а, т. к. функ­ция мо­жет иметь бо­лее одн­ о­го имен­ и), все ост­ аль­ные кла­виш­ и, к кот­ о­рым при­пи­сан­ а данн­ ая ком­ ан­да (мно­гие со­чет­ ан­ ия кла­виш мог­ ут озн­ а­чать од­но и то же дей­ст­вие), и по­каз­ ы­вают, яв­ля­етс­ я ли ко­ман­да «пе­ре­ме­ще­ние­ м» или «опер­ а­тор­ ом». Ниж­ е прив­ е­ден под­ход­ ящ­ ий прим­ ервы­во­да ком­ ан­ды :describe-function next-line:\"next-line\" ^J ^N j #-Bor \"down-arrow\"or \"down-line\"or \"forward-line\"(motion: move down CNT lines )Ком­ ан­да выв­ е­ла все че­тыр­ е имен­ и функц­ ии и  со­че­та­ния клав­ иш длянее. (По­сле­дов­ ат­ ельн­ ость #-B – это не зав­ ис­ ящ­ ее от терм­ ин­ ал­ а пред­став­лен­ ие vile для «стрелк­ и вверх». Их пол­ный спи­сок можн­ о уви­деть с по­мощ­ ью :show-key-names.)Пер­ е­мен­ной окр­ уж­ е­ния VILE_STARTUP_PATH мож­но прис­ во­ить пу­ти пои­ ск­ афай­ла справк­ и, от­де­лен­ные друг от друг­ а двое­то­чия­ми1. Пер­ ем­ ен­ную1 Порт для Win32 в ка­че­ст­ве раз­де­лит­ е­ля исп­ ольз­ уе­ т точ­ку с зап­ ят­ ой, а порт для OpenVMS – зап­ ят­ ые.

386 Глава 18. vile: vi Like Emacs (vi как Emacs) окр­ уж­ ен­ ия VILE_HELP_FILE мож­но при­ме­нять для пер­ ео­ пр­ ед­ е­ле­ния име­ ни фай­ла справк­ и (обыч­но это vile.hlp). Если в онл­ айн-справк­ е прим­ ен­ ить воз­можн­ о­сть по­ис­ка, встро­ен­ные ко­ ман­ды, опис­ а­ния кла­виш и  авт­ о­за­верш­ ен­ ие ком­ анд, то польз­ о­вать­ся справк­ ой стан­ о­вит­ся про­сто и удобн­ о.Инициализация xvile про­из­во­дит до­пол­нит­ ель­ную иниц­ иал­ и­зац­ ию ме­ню пе­ред вы­пол­ не­ни­ем ост­ аль­ных эта­пов: 1. (Толь­ко в xvile). В ка­чес­ т­ве имен­ и фай­ла опи­са­ния мен­ ю исп­ оль­зуе­ т­ ся знач­ е­ние пе­ре­менн­ ой окр­ у­жен­ ия XVILE_MENU, ес­ли та­ков­ ая уст­ а­ нов­ле­на. Инач­ е исп­ ольз­ у­ет .vilemenu. Этот файл зад­ ае­ т ме­ню по умол­ ча­нию для ин­тер­фей­са X111. По­сле этог­ о разл­ ичн­ ые вер­сии vile, xvile и winvile про­из­вод­ ят од­ну и ту же двух­этап­ную иниц­ иа­лиз­ а­цию. Пер­вый этап исп­ ольз­ у­ет смесь пе­ре­ мен­ных окр­ уж­ ен­ ия и фай­лов: 2. Вы­полн­ я­ет­ся файл, ко­то­рый был ука­зан в ком­ анд­ной стро­ке опц­ и­ей @cmdfile, ес­ли так­ ов­ ая при­сутс­ т­во­ва­ла. Игн­ о­рир­ ую­ тс­ я ос­таль­ные шаг­ и иниц­ иал­ из­ ац­ ии, кот­ ор­ ые прод­ ел­ ы­ва­лись бы при от­сут­ств­ ии этой оп­ции. 3. Ес­ли су­ще­ст­ву­ет пер­ е­менн­ ая ок­руж­ ен­ ия VILEINIT, вы­полн­ я­ет­ся ее знач­ е­ние. Инач­ е прои­ зв­ о­дитс­ я по­иск файл­ а иниц­ иа­ли­зац­ ии. 4. Есл­ и су­щес­ т­ву­ет пер­ ем­ енн­ ая окр­ уж­ е­ния VILE_STARTUP_FILE, она ис­ поль­зу­ет­ся как имя стар­то­во­го файл­ а. Ес­ли нет, UNIX исп­ оль­зу­ет .vilerc, а дру­гие системы – файл vile.rc. 5. Стар­то­вый файл ищетс­ я в тек­ у­щем кат­ а­лог­ е, а затем в до­маш­нем ка­ та­ло­ге польз­ о­ва­тел­ я. Исп­ оль­зуе­ т­ся пер­вый найд­ енн­ ый. На вто­ром этап­ е при­мен­ яю­ тс­ я след­ ую­щие ко­манд­ ы иниц­ иа­лиз­ ац­ ии: 6. Файл, ука­занн­ ый пер­вым в ком­ анд­ной строк­ е, заг­ руж­ ае­ т­ся в бу­фер па­мят­ и. 7. Вы­полн­ я­ютс­ я ком­ анд­ ы, ко­то­рые был­ и зад­ а­ны в опц­ и­ях -c. По умол­ ча­нию они буд­ ут раб­ о­тать с пер­вым фай­лом. Как и друг­ ие мод­ иф­ и­кац­ ии, vile поз­ вол­ я­ет по­мещ­ ать общ­ ие дейс­ т­вия по иниц­ иа­лиз­ ац­ ии (то есть опц­ ии и ко­ман­ды для UNIX vi и/или друг­ их клонов) в ваш файл .exrc и вы­полн­ ять из .vilerc ком­ анд­ у :source .exrc до или по­сле уст­ а­но­вок, спец­ иф­ ич­ных для vile. 1 Ме­ню для winvile не на­страи­ваю­ тс­ я. Их функ­ции можн­ о ис­польз­ ов­ ать толь­ ко в Win32.

Многооконное редактирование 387Многооконное редактирование vile не­сколь­ко отл­ ич­ а­ет­ся от ост­ альн­ ых клон­ ов. Он нач­ ал свою жизнь как вер­сия MicroEMACS и толь­ко по­том пре­вра­тил­ся в ре­дак­тор с «ощу­ ще­ния­ми пальц­ ев» vi. Все верс­ ии Emacs хор­ ош­ о раб­ от­ ал­ и с  нес­ кольк­ им­ и окн­ ам­ и и  нес­ коль­ ким­ и фай­лам­ и, поэ­ том­ у vile стал перв­ ой про­грамм­ ой ти­па vi, в кот­ о­ рой был­ о не­сколь­ко окон и нес­ коль­ко буф­ е­ров. Как и в про­грам­мах elvis и Vim, ком­ ан­да :split1 соз­дае­ т но­вое ок­но, а за­ тем поз­ во­ля­ет ис­поль­зо­вать ко­ман­ду ex :e filename, что­бы ред­ ак­тир­ о­вать нов­ ый файл в но­вом ок­не. По­сле это­го нач­ и­на­ют­ся отл­ и­чия. В час­ тн­ о­ сти, ком­ анд­ ы пер­ ем­ е­ще­ния межд­ у окн­ ам­ и для реж­ им­ а vi со­всем дру­гие. На рис. 18.1 по­каз­ ан разд­ ел­ ен­ный эк­ран, по­яв­ляю­щийс­ я в ре­зуль­тат­ е вво­да ch12.xml2, а пот­ ом :split и :e !zcat chapter.xml.gz в vile.Рис. 18.1. Ре­дак­ти­ро­ван­ ие этой глав­ ы в vileКак в Vim, все окн­ а име­ют об­щую нижн­ юю стро­ку для вы­полн­ е­ния ко­манд ex. Каж­дое ок­но со­дер­жит соб­ст­вен­ную строк­ у со­стоян­ ия, а стро­ка со­стоя­ния тек­ ущ­ ег­ о окн­ а за­пол­не­на зна­ка­ми мин­ ус. Кром­ е тог­ о, при1 Это арт­ е­факт ре­дак­то­ра vile, по­звол­ яющ­ е­го сок­ ращ­ ать ко­ман­ды. Пра­виль­ ная ком­ анд­ а нос­ ит имя split-current-window.2 Вним­ а­тельн­ ый чи­тат­ ель за­мет­ ит, что это уже не глав­ а 12. Гла­вы был­ и пе­ре­ ну­ме­ров­ а­ны при раз­раб­ от­ке седьм­ ог­ о изд­ ан­ ия.

388 Глава 18. vile: vi Like Emacs (vi как Emacs) акт­ ив­ном реж­ им­ е вставк­ и во вто­ром столбц­ е строк­ и сос­ тоя­ния по­яв­ля­ етс­ я I, а есл­ и файл был из­ме­нен, но не со­хра­нял­ся, к его имен­ и при­пи­ сы­вае­ тс­ я [modified]. Так­же vile по­хож на Emacs в пла­не ко­манд и связ­ анн­ ых с ним­ и со­че­та­ ний клав­ иш. Они пок­ а­за­ны в табл. 18.1. В нек­ от­ ор­ ых случ­ ая­ х два со­че­ та­ния вып­ олн­ яю­ т одн­ у и ту же опе­рац­ ию, как у ко­манд­ ы delete-other- windows. Табл­ и­ца 18.1. Ко­ман­ды управ­лен­ ия ок­нам­ и в vile Ко­манд­ а Со­чет­ ан­ ие Функц­ ия кла­виш delete-other-windows ^O, ^X 1 Уда­ляе­ т все окн­ а, за ис­ключ­ е­ние­ м тек­ у­щег­ о. delete-window ^K, ^X 0 Удал­ я­ет тек­ у­щее ок­но, есл­ и тольк­ о оно не по­след­нее. edit-file, E, e ^X e Отк­ ры­вае­ т дан­ный (для ^X e – нах­ о­дя­щийс­ я под кур­сор­ ом) файл или сущ­ ес­ т­вую­щий бу­ фер в окн­ е. find-file ^X e То же, что edit-file. grow-window V Увел­ ич­ ив­ ае­ т разм­ ер те­ку­щег­ о ок­на на count строк. move-next-window-down ^A ^E Про­кру­чи­вае­ т след­ ую­щее окн­ о вниз (или буф­ ер – вверх) на count строк. move-next-window-up ^A ^Y Про­круч­ ив­ ае­ т след­ ую­щее окн­ о вверх (или бу­фер – вниз) на count строк. move-window-left ^X ^L Прок­ ру­чив­ ае­ т окн­ о влев­ о на count столб­цов или на полэкр­ а­на, есл­ и count не указ­ ан. move-window-right ^X ^R Про­круч­ и­ва­ет ок­но вправ­ о на count столб­ цов, или на полэк­ра­на, есл­ и count не ука­зан. next-window ^X o Пе­рех­ од­ ит на след­ ую­щее окн­ о. position-window z where Про­крут­ ить ок­но, пом­ ест­ ив те­кущ­ ую по­зи­ цию кур­сор­ а в where, где where при­ни­мае­ т од­но из сле­дую­щих знач­ ен­ ий: центр (., M, m), верх (ENTER, H, t) или низ (-, L, b). previous-window ^X O Пер­ ех­ од­ ит на пре­ды­ду­щее ок­но. resize-window Уст­ ан­ ав­ли­ва­ет раз­мер те­кущ­ е­го окн­ а рав­ ным count строк. count указ­ ы­ва­етс­ я как пре­фиксн­ ый арг­ у­мент. restore-window Воз­врат к ок­ну, сох­ ра­ненн­ о­му с пом­ ощ­ ью save-window. save-window По­мет­ка окн­ а для по­сле­дую­ще­го воз­вра­та в не­го с по­мощ­ ью restore-window. scroll-next-window- ^A ^D Про­круч­ ив­ ае­ т сле­дую­щее ок­но вниз на down count пол­ о­винок экр­ ан­ а. count зад­ а­етс­ я в вид­ е пре­фикс­ног­ о арг­ у­мент­ а.

Графические интерфейсы 389Ко­манд­ а Со­че­тан­ ие Функ­ция клав­ ишscroll-next-window-up ^A ^U Про­круч­ ив­ а­ет след­ ующ­ ее окн­ о вверх на count пол­ о­винок эк­ран­ а. count за­дае­ тс­ я в ви­де пре­фикс­ног­ о арг­ ум­ ент­ а.shrink-window v Уменьш­ а­ет раз­мер тек­ у­ще­го окн­ а на count строк. count за­дае­ т­ся в вид­ е преф­ иксн­ ог­ о арг­ ум­ ент­ а.split-current-window ^X 2 Разд­ е­ля­ет окн­ о пополам; count со зна­чен­ и­ ем 1 или 2 опр­ ед­ ел­ яе­ т, ка­кое из но­вых окон ста­нет тек­ ущ­ им. count за­да­ет­ся в вид­ е пре­ фиксн­ о­го арг­ у­мен­та.view-file От­крыв­ а­ет дан­ный файл или сущ­ ес­ т­вую­ щий бу­фер в ок­не и по­ме­чае­ т его как «толь­ ко для чтен­ ия».set-window От­крыв­ а­ет сущ­ е­ств­ ующ­ ий бу­фер в ок­не.historical-buffer _ Вы­дае­ т спи­сок перв­ ых пя­ти бу­фе­ров. Циф­ ра пе­ре­мес­тит в указ­ ан­ный буф­ ер, а сим­вол _ – в сам­ ый по­след­ний ред­ ак­ти­ров­ авш­ ийс­ я файл. Tab (и back-tab) про­кру­чи­ваю­ т спи­ сок, что об­лег­чае­ т пер­ е­мещ­ е­ние по не­му при длин­ных имен­ ах бу­фер­ ов.toggle-buffer-list * По­ка­зы­ва­ет/скры­ва­ет окн­ о, в ко­то­ром пок­ а­ за­ны все буф­ ер­ ы vile.Графические интерфейсы Снимк­ и эк­ран­ а и объ­ясн­ ен­ ия для это­го разд­ ел­ а был­ и пред­став­ле­ны Ке­ вин­ ом Буттн­ ер­ ом (Kevin Buettner), То­мас­ ом Дик­ и (Thomas Dickey) и По­ лом Фокс­ ом (Paul Fox), за что им больш­ ое спас­ и­бо. Для vile сущ­ ес­ тв­ у­ют не­скольк­ о ин­тер­фейс­ ов X11, каж­дый из ко­тор­ ых при­мен­ яе­ т свой ин­ст­ру­мент­ ар­ ий, ос­но­ванн­ ый на биб­лио­тек­ е Xt. Есть прос­ тая вер­сия «No Toolkit», где ин­ст­ру­мен­тар­ ий не исп­ ольз­ у­ет­ся, од­ нак­ о в ней при­сут­ств­ у­ет своя по­лос­ а прок­ рут­ки и видж­ ет «дос­ка обс­ уж­ ­ ден­ ия» (bulletin board) для управ­лен­ ия гео­метр­ и­ей. Есть вер­сии, ис­ поль­зую­щие ин­ст­ру­мен­тар­ ии Motif, Athena или OpenLook1. Наиб­ ол­ ее хо­ро­шо подд­ ер­жив­ аю­ тс­ я вер­сии Motif и Athena, и в них есть под­держ­ ка мен­ ю. Сущ­ е­ст­вуе­ т GUI для Win32, имеющ­ ий вар­ иа­ции с  под­держ­кой OLE и Unic­ ode. Обе ва­риа­ции выг­ ляд­ ят оди­нак­ ов­ о.1 Sun Microsystems прек­ ра­ти­ла под­держ­ку OpenLook пер­ ед вы­ход­ ом Solaris 9 в 2002 го­д­ у.

390 Глава 18. vile: vi Like Emacs (vi как Emacs) К сча­стью, ос­нов­ной ин­тер­фейс для всех вер­сий один­ а­ков: име­ет­ся од­но окн­ о верхн­ ег­ о уров­ня, ко­тор­ ое мож­но раз­бить на две или больш­ е пан­ е­ лей (panes). В свою оче­редь, пан­ ел­ и мож­но исп­ оль­зо­вать для по­каз­ а не­ сколь­ких предс­ тавл­ ен­ ий бу­фе­ра, нес­ коль­ких буф­ ер­ ов или их смес­ и. На язы­ке vile они наз­ ы­ва­ют­ся «окн­ ам­ и», но во из­беж­ а­ние пу­тан­ иц­ ы при дальн­ ей­шем изл­ о­же­нии мы прод­ олж­ им наз­ ы­вать их «па­не­ля­ми».Сборка xvile Хо­тя для xvile имею­ тс­ я дво­ичн­ ые пак­ ет­ ы, вы мо­жет­ е зах­ от­ еть скомп­ и­ лир­ о­вать его на платф­ орм­ е без под­держ­ки па­кет­ ов. При сборк­ е xvile не­обх­ о­ди­мо реш­ ить, ка­кой из ин­стр­ у­мент­ ар­ и­ев вы бу­ дет­ е ис­польз­ о­вать. Это мож­но сде­лать при на­стройк­ е vile с  по­мощ­ ью ком­ анд­ ы configure1. Выб­ ир­ ай­те из сле­дую­щих опц­ ий: --with-screen=value Опр­ е­де­ляе­ т драйв­ ер тер­мин­ ал­ а. По умолч­ а­нию это tcap для драй­ве­ ра termcap/terminfo. Сре­ди дру­гих зна­чен­ ий есть curses, ncurses, ncur­ sesw, X11, OpenLook, Motif, Athena, Xaw, Xaw3d, neXtaw и ansi. --with-x Исп­ оль­зов­ ать X Window System. Для верс­ ии «No Toolkit». --with-Xaw-scrollbars Ис­поль­зо­вать пол­ о­сы прок­ рутк­ и Xaw вмес­ то соб­ст­вен­ных пол­ ос про­ крутк­ и vile. --with-drag-extension Ис­поль­зо­вать рас­шир­ е­ние пе­рет­ аск­ ив­ а­ния/про­крут­ки с Xaw.Базовый внешний вид и функциональность xvile На сле­дую­щих ри­сун­ках предс­ тавл­ ен ин­тер­фейс Motif у xvile. Он по­ хож на инт­ ерф­ ейс Athena. На рис. 18.2 по­каз­ ан­ ы три пан­ ел­ и: 1. man-стран­ иц­ а vile, где де­монс­ тр­ ир­ уе­ тс­ я исп­ оль­зов­ а­ние под­чер­кив­ а­ ния и по­луж­ ирн­ ог­ о нач­ ерт­ ан­ ия. 2. Бу­фер misc.c из tin, где есть под­свет­ка син­так­сис­ а (на этот раз с раз­ лич­ны­ми цвет­ ам­ и для ди­рект­ ив пре­про­цесс­ о­ра, опе­рат­ ор­ ов, ком­мен­ тар­ и­ев и ключ­ е­вых слов, хотя в книге видн­ ы тольк­ о град­ а­ции сер­ о­го). 3. Акт­ ив­ная трех­строчн­ ая пан­ ель [Completions] (стро­ка сос­ тоян­ ия у нее тем­нее) для за­вер­ше­ния имен фай­лов. Она ко­орд­ ин­ ир­ у­етс­ я с мин­ и­ бу­фер­ ом (ком­ анд­ной строк­ ой с двоет­ оч­ и­ем): в перв­ ой строк­ е на­пи­са­ 1 Скрипт configure раб­ о­тае­ т на лю­бой плат­фор­ме UNIX или сходн­ ой с ней. Для сборк­ и в OpenVMS ис­польз­ уйт­ е скрипт vmsbuild.com. Инс­ т­рукц­ ии по сбор­ке рас­пол­ аг­ аю­ т­ся в са­мом на­ча­ле скрип­та.

Графические интерфейсы 391но Completions prefixed by /usr/build/in/tin-1.9.2+/src/m:, а в мини-бу-фере – Find file: m. Ост­ аль­ная часть мин­ и-б­ уф­ е­ра со­держ­ ит имен­ афай­лов, удовл­ е­твор­ яющ­ их за­прос­ у. Перв­ ая стро­ка [Completions] и со­дер­жи­мое ме­ня­ютс­ я по мер­ е за­вер­ше­ния поль­зо­ват­ е­лем име­ни фай­ла (и  на­жа­тия TAB, что укаж­ ет vile по­каз­ ать уменьш­ енн­ ый наб­ орва­риа­ н­тов).Рис. 18.2. Гра­фич­ е­ское ок­но xvileНа рис. 18.3 то­же есть три пан­ ел­ и:1. Пан­ ель [Help], в кот­ о­рой пок­ аз­ а­на, ра­зу­мее­ тс­ я, сам­ ая важ­ная функ­ ция ред­ акт­ о­ра (как выйт­ и из не­го, не со­хран­ яя изм­ е­не­ний). ☺2. [Buffer List], пок­ аз­ ыв­ ающ­ ая, что пред­ ы­ду­щим (#) бу­фе­ром яв­ляе­ т­ся charset.c. Бу­фер­ а % (тек­ у­щег­ о) в спи­ске нет, пос­ кольк­ у в этой коп­ ии [Buffer List] ото­бра­жаю­ т­ся тольк­ о «ви­ди­мые» буф­ е­ры. Есл­ и ко­манд­ е * зад­ ать арг­ ум­ ент, то она пок­ а­жет и не­вид­ и­мые. Бу­фер­ ы 0 и 2 – это charset.c и misc.c. Они за­гру­же­ны, а в [Buffer List] по­каз­ ан­ ы их разм­ е­ ры (12425 и 89340). В бу­фер­ е 1 (<vile.1>) сод­ ер­житс­ я форм­ ат­ ир­ о­ванн­ ая стра­ни­ца рук­ о­вод­ ства (manpage), сген­ е­рир­ о­ванн­ ая мак­рос­ ом. Этом­ у

392 Глава 18. vile: vi Like Emacs (vi как Emacs) буф­ ер­ у не со­отв­ етс­ т­ву­ет ник­ ак­ ой­ фай­л1. Буф­ ер 3 (color.c) не за­гру­ жен, то есть в пер­вом столбц­ е для нег­ о сто­ит u, а его размер – ноль. 3. Буф­ ер [Completions] явл­ я­етс­ я акт­ ивн­ ым. На этот раз в нем пок­ аз­ а­но за­верш­ ен­ ие по те­гам для част­ ич­ног­ о соо­ т­ветс­ т­вия co, а  со­об­ще­ние Completions prefixed не по­ка­за­но, пос­ коль­ку буф­ ер прок­ ру­чен пон­ и­ же, что явл­ яе­ тс­ я поб­ оч­ным дей­ств­ ие­ м наж­ ат­ ия TAB: vile де­лае­ т цик­лич­ ес­ кую про­крут­ку, так что при­во­дят­ся все вар­ иа­ нт­ ы, даж­ е ес­ ли ок­но ма­леньк­ ое2. Рис. 18.3. Бу­фе­ры и за­верш­ ен­ ие в vile Сген­ е­ри­ров­ анн­ ые бу­фе­ры, так­ ие как [Help] и [Buffer List], служ­ ат «ра­бо­ чим­ и» (scratch) буф­ е­ра­ми. Есл­ и их сверн­ уть, то они зак­ рыв­ аю­ тс­ я, а их 1 Уг­лов­ ые скоб­ки во­круг имен­ и <vile.1> ис­польз­ у­ютс­ я по сог­ лаш­ е­нию, чтоб­ ы изб­ е­жать конф­ лик­та имен, пос­ коль­ку иметь два бу­фе­ра с од­ним и тем же имен­ ем за­прещ­ е­но. 2 Раз­мер буф­ ер­ а [Completions] уст­ а­навл­ ив­ а­ет­ся ав­том­ а­ти­чес­ ки. Ни­ког­ да не по­ каз­ ыв­ а­етс­ я больш­ е нуж­но­го ко­ли­че­ст­ва строк. Ес­ли буф­ ер слиш­ком вел­ ик, vile «бе­рет в долг» до : мес­та у со­сед­ней па­не­ли.

Графические интерфейсы 393сод­ ерж­ и­мое проп­ а­дае­ т. Есть и друг­ ие «нев­ и­ди­мые» буф­ е­ры, на­прим­ ербуферы, сод­ ерж­ ащ­ ие скрипт­ ы. Как прав­ и­ло, ни те, ни дру­гие не ото­браж­ а­ютс­ я в [Buffer List].Полосы прокруткиСправ­ а от кажд­ ой па­нел­ и нах­ од­ ит­ся пол­ о­са про­крутк­ и, кот­ о­рую можн­ оисп­ ольз­ ов­ ать для пе­рем­ е­ще­ния по буф­ ер­ у стан­дартн­ ым спос­ о­бом. За­ме­тим, что этот станд­ артн­ ый спос­ об раз­ли­ча­етс­ я в раз­ных ин­ст­рум­ ент­ ар­ и­ях. В  вер­сия­ х Athena и  «No Toolkit» средн­ яя кноп­ка мыш­ и мож­ ет ис­польз­ о­ватьс­ я для пе­ре­тас­кив­ ан­ ия «бег­ ун­ка» или вид­ им­ о­го ин­дик­ ат­ ор­ а,а лев­ ая и прав­ ая пе­рем­ ещ­ а­ют вниз и вверх (соо­ тв­ етс­ тв­ ен­но) по бу­фе­ру.Ко­ли­че­ст­во пе­ре­мещ­ аем­ о­го кон­тент­ а зав­ ис­ ит от по­ло­же­ния кур­со­ра мы­ши на по­лос­ е про­крут­ки. Ес­ли пом­ ест­ ить его окол­ о вер­ха, пе­рем­ ещ­ ен­ иебу­дет прои­ с­ход­ ить по­строчн­ о, а есл­ и око­ло низ­ а – по це­лым пан­ е­лям.Воз­можн­ о, пол­ ос­ а про­крут­ки Motif бо­лее при­выч­на. Для всех опе­рац­ ийис­польз­ уе­ т­ся ле­вая кнопк­ а мыш­ и. Щел­чок по ма­лень­ким стрел­ очк­ амсме­стит вас вверх или вниз на одн­ у строк­ у. Для бы­стр­ о­го пе­рем­ ещ­ ен­ ияможн­ о пер­ е­тас­кив­ ать инд­ ик­ а­тор пол­ о­сы про­крутк­ и, а  ес­ли щелкн­ утьпо­выш­ е или по­ниж­ е ин­ди­кат­ о­ра, то про­изой­дет пе­ре­ме­щен­ ие вверхили вниз на всю па­нель.Во всех вер­сия­ х имее­ т­ся неб­ ольш­ ая «ру­ко­ят­ка» вы­ше или ниж­ е по­лоспрок­ рутк­ и (нах­ о­дитс­ я меж­ду ним­ и), ко­то­рую мож­но исп­ оль­зо­вать дляпод­строй­ки двух со­седн­ их пан­ ел­ ей. В верс­ ии xvile «No Toolkit» эта ру­коя­ т­ка впи­сы­ва­ет­ся в стро­ку сос­ тоян­ ия двух смежн­ ых па­нел­ ей. В дру­гих верс­ и­ях она бол­ ее разл­ и­чим­ а, но во всех случ­ ая­ х кур­сор мыш­ и приего по­ста­нов­ке над ру­ко­ятк­ ой сме­ны раз­ме­ра ме­ня­етс­ я на боль­шую вер­тик­ альн­ ую двой­ную стрел­ку. Раз­мер окон можн­ о по­мен­ ять пе­рет­ аск­ и­ван­ ие­ м ру­коя­ т­ки мыш­ ью.Пан­ ель мож­но разб­ ить на две част­ и, если при нажатой кла­виш­ е Ctrlщелкнуть ле­вой кноп­кой мыш­ и на по­лос­ е прок­ рут­ки. Вы пол­ у­чит­ е двапредс­ тав­лен­ ия одн­ о­го буф­ ер­ а. Есл­ и хо­тит­ е смен­ ить од­но из предс­ тав­ле­ний на дру­гой бу­фер, исп­ оль­зуйт­ е дру­гие ко­манд­ ы vile. Пан­ е­ли мож­ноудал­ ить, есл­ и удер­жив­ ать клав­ иш­ у Ctrl и наж­ ать на сред­нюю кнопк­ умы­ши. Ес­ли созд­ ан­ о мног­ о пан­ ел­ ей, мож­но сдел­ ать так, чтоб­ ы все окн­ оза­ним­ ал­ а одн­ а пан­ ель. Для это­го на­жми­те Ctrl и щелкни­те прав­ ой кноп­кой мыш­ и. Все дру­гие па­нел­ и удал­ ят­ся, ос­та­вив ок­но xvile с па­не­лью,по ко­тор­ ой вы щелк­нул­ и. Обзор дейс­ тв­ ий представлен в табл. 18.2.Табл­ иц­ а 18.2. Ком­ ан­ды vile для управл­ ен­ ия па­нел­ ям­ иКо­манд­ а Функ­цияCtrl-ле­вая кнопк­ а На по­лос­ е прок­ рутк­ и, раз­де­ля­ет па­нель.Ctrl-сред­няя кнопк­ аCtrl-прав­ ая кнопк­ а Удал­ яе­ т па­нель. Ос­тав­ля­ет на эк­ра­не толь­ко ту пан­ ель, по ко­тор­ ой щелк­нул­ и.

394 Глава 18. vile: vi Like Emacs (vi как Emacs) Установка положения курсора и движения мыши Внутр­ и тек­сто­вой обл­ аст­ и пан­ ел­ и курс­ ор можн­ о уст­ ан­ ов­ ить прос­ тым щелчк­ ом лев­ ой кноп­ки мыш­ и. Это дей­ств­ ие зад­ аст не тольк­ о по­лож­ е­ние кур­со­ра, но и  пан­ ель, в  кот­ о­рой бу­дет прои­ сх­ о­дить ре­дакт­ и­ров­ ан­ ие. Что­бы по­ме­нять ее, но со­хра­нить ее ста­рое пол­ ож­ ен­ ие, щелк­ни­те по строк­ е со­стоян­ ия под тем текс­ том, кот­ о­рый вы хо­ти­те ис­прав­ ить. Щел­чок мыш­ью расс­ мат­рив­ ае­ тс­ я как пе­ре­мещ­ е­ние, ана­ло­гич­но, на­ прим­ ер, ко­ман­де 4j. Что­бы удал­ ить пять строк, можн­ о ввес­ ти d4j, уда­ лив тек­ у­щую строк­ у и чет­ ы­ре под ней. То же са­мое де­ла­етс­ я и с пом­ о­ щью мыш­ и. Пом­ ест­ ит­ е курс­ ор в мес­ то на­ча­ла уда­лен­ ия и на­жми­те d, пос­ ле че­го щелк­ни­те по бу­фе­ру в том мес­те, до кот­ ор­ о­го вы хо­ти­те уда­ лить. Щелч­ки мыш­ ью яв­ля­ют­ся пер­ е­мещ­ ен­ и­ем кур­со­ра, так что они мо­гут ис­поль­зо­ватьс­ я и в друг­ их опер­ ац­ ия­ х. Выделения Чтоб­ ы за­дать вы­дел­ е­ние, перетащите мышь с нажатой ле­вой кнопк­ ой. Это наз­ ы­вае­ тс­ я PRIMARY (пер­вич­ным) выд­ е­ле­ни­ем. Есл­ и от­пуст­ ить кнопк­ у мы­ши, то выд­ е­ле­ние коп­ ир­ уе­ т­ся и стан­ ов­ итс­ я дос­тупн­ ым для вставк­ и. Мож­но по­треб­ о­вать, что­бы вы­де­лен­ная об­ласть был­ а прям­ о­ уголь­ной, есл­ и удер­жив­ ать кла­виш­ у Ctrl при пе­рет­ аск­ ив­ ан­ ии с наж­ а­ той лев­ ой кнопк­ ой мы­ши. Есл­ и пер­ ет­ ас­кив­ ан­ ие вы­ход­ ит за пре­де­лы окн­ а, текст бу­дет по воз­мож­нос­ ти прок­ руч­ ив­ ать­ся в нужн­ ом нап­ равл­ е­ нии, что­бы под­ ог­нать вы­дел­ ен­ ия, прев­ ыш­ аю­щие разм­ ер ок­на. Ско­ рость, при ко­то­рой идет прок­ рут­ка, бу­дет возр­ аст­ ать со врем­ е­нем, что по­зво­ляе­ т де­лать быс­ трое вы­де­ле­ние больш­ их куск­ ов текс­ та. От­дельн­ ые сло­ва или строк­ и мож­но выд­ ел­ ять двойн­ ым или тройн­ ым щелч­ком по ним. С  по­мо­щью пра­вой кнопк­ и мыш­ и вы­дел­ ен­ ие мо­жет быть расш­ и­ре­но. Как и в случ­ ае с лев­ ой кнопк­ ой, его мож­но подс­ трои­ ть или про­кру­тить, удер­жи­вая прав­ ую кнопк­ у при пе­ре­таск­ ив­ ан­ ии. Вы­де­ле­ния можн­ о рас­ шир­ ять и в друг­ их ок­нах, есл­ и в них от­крыт тот же бу­фер, что и в окн­ е, в ко­тор­ ом бы­ло сдел­ ан­ о вы­де­ле­ние. То есть ес­ли у вас есть два предс­ тав­ лен­ ия бу­фер­ а (на двух раз­ных пан­ е­лях), прич­ ем в одн­ ом ок­не пок­ аз­ а­но нач­ ал­ о бу­фе­ра, а в другом – его ко­нец, мож­но выд­ е­лить весь буф­ ер, ес­ ли на­жать лев­ ую кноп­ку в на­чал­ е па­нел­ и с нач­ а­лом бу­фе­ра и правую – в па­нел­ и с его конц­ ом. Такж­ е выд­ е­ле­ния мож­но дел­ ать пря­мо­уголь­ны­ ми, со­чет­ ая кла­виш­ у Ctrl с прав­ ой кнопк­ ой мы­ши. Сред­няя кнопк­ а мыш­ и ис­поль­зу­ет­ся для встав­ки вы­дел­ е­ния. По умол­ ча­нию она вставл­ я­ет текст в пос­ ледн­ юю по­зи­цию кур­сор­ а. Есл­ и при ее наж­ а­тии удер­жи­вать клав­ иш­ у Shift, то встав­ка про­изой­дет на мес­те кур­сор­ а. Вы­дел­ ен­ ие мож­но очис­ тить (есл­ и оно сде­ла­но в ред­ акт­ ор­ е xvile), два­ж­ ды щелк­нув по строк­ е сос­ тоя­ния.

Графические интерфейсы 395Системный буфер (Clipboard)Мож­но прои­ зв­ од­ ить об­мен данн­ ы­ми с дру­ги­ми при­ло­же­ния­ми X че­резPRIMARY-вы­дел­ е­ние. Выш­ е было опи­сан­ о, как зад­ ать вы­де­ле­ниеи управл­ ять им.Дру­гие при­лож­ е­ния ис­польз­ ую­ т вы­де­лен­ ие CLIPBOARD для обм­ ен­ аданн­ ым­ и меж­ду соб­ ой. На мно­гих клав­ иат­ у­рах Sun выд­ ел­ ен­ный текстпоп­ а­да­ет в сис­темн­ ый буф­ ер при наж­ а­тии клав­ иш­ и COPY, а вставл­ яе­ т­ся от­туд­ а при на­жат­ ии на PASTE. Ес­ли у  вас не по­луч­ а­ет­ся вста­витьтекст из xvile в друг­ ие прог­ рамм­ ы (или нао­ бо­рот), то это, ско­рее всег­ о,из-за исп­ оль­зо­ван­ ия этим­ и про­грам­ма­ми вы­дел­ ен­ ия CLIPBOARD вме­сто PRIMARY. (Дру­гой мех­ ан­ изм, кот­ ор­ ый ис­поль­зуе­ т­ся очень ста­ры­ми при­лож­ ен­ ия­ми, вклю­ча­ет ис­поль­зов­ ан­ ие коль­ца буф­ ер­ ов.)В xvile есть две ком­ анд­ ы для управл­ е­ния сис­тем­ным буф­ е­ром: copy-to-clipboard и  paste-from-clipboard. При выз­ ов­ е copy-to-clipboard сод­ ерж­ и­мое тек­ у­ще­го выд­ е­ле­ния коп­ ир­ у­ет­ся в спец­ иа­ ль­ный рег­ истр (clipboardkill register), который обоз­ нач­ а­ет­ся как ; в  спи­ске рег­ ис­ т­ров. Ког­ дапри­лож­ ен­ ие за­праш­ ив­ а­ет выд­ ел­ ен­ ие из сис­тем­ног­ о бу­фер­ а, xvile вы­да­ет сод­ ер­жим­ ое это­го ре­гис­ тр­ а. Ко­ман­да paste-from-clipboard за­праш­ и­вае­ т данн­ ые сист­ емн­ о­го буф­ е­ра у  те­ку­ще­го влад­ ельц­ а вы­де­лен­ ияCLIPBOARD.Возм­ ож­но, поль­зо­ват­ е­лям сис­тем Sun зах­ оч­ етс­ я опр­ ед­ ел­ ить след­ ую­щиесоч­ ет­ ан­ ия клав­ иш в  фай­ле .vilerc, чтоб­ ы мож­но бы­ло исп­ ольз­ ов­ атькнопк­ и COPY и PASTE: bind-key copy-to-clipboard #-^ bind-key paste-from-clipboard #-*В этой гла­ве мы еще верн­ емс­ я к прив­ язк­ ам клав­ иш.Ресурсыxvile сод­ ерж­ ит мно­жес­ тв­ о рес­ ур­сов, по­средс­ т­вом кот­ ор­ ых можн­ о управ­лять внешн­ им вид­ ом и по­ве­де­ние­ м про­грам­мы. Особ­ ен­но ва­жен выб­ оршрифт­ а, так как он оп­ре­де­ляе­ т пра­виль­ность ото­бра­же­ния кур­сив­ныхи  нак­ лонн­ ых шрифт­ ов. Док­ ум­ ент­ а­ция vile со­дер­жит полн­ ый спис­ окрес­ ур­сов, а такж­ е об­раз­ ец за­пис­ ей в .Xdefault.Добавление менюВ вер­си­ях Motif и Athena име­ет­ся под­держ­ка ме­ню. За­да­вае­мые поль­зов­ ат­ е­лем пункт­ ы мен­ ю счи­ты­ваю­ т­ся из фай­ла .vilemenu тек­ ущ­ е­го илидо­маш­не­го кат­ а­лог­ а. xvile доп­ ус­кае­ т пунк­ты мен­ ю трех тип­ ов:• Встрое­ нн­ ые, то есть спе­ци­фич­ные для сист­ е­мы ме­ню, та­кие как по­ вторн­ ое счит­ ы­ван­ ие фай­ла .vilerc или соз­да­ние нов­ ой коп­ ии xvile.• Неп­ о­средс­ тв­ ен­ный выз­ ов встрое­ нн­ ых ком­ анд (нап­ рим­ ер, по­ка­зать [Buffer List]).

396 Глава 18. vile: vi Like Emacs (vi как Emacs) • Вы­зов про­из­вольн­ ых ко­манд­ных по­сле­дов­ ат­ ельн­ о­стей (нап­ ри­мер, за­пуск ин­тер­ ак­тив­ног­ о мак­ро­са, так­ ог­ о как ком­ анд­ а по­ис­ка). Мы счи­та­ем два пос­ лед­них пунк­та раз­личн­ ым­ и, так как ав­тор­ ы пред­ поч­ ли, что­бы vile мог про­вер­ ять прав­ ильн­ ость ком­ анд пер­ ед их вып­ ол­ нен­ и­ем.Сборка winvile Для каж­дог­ о ре­ли­за winvile дос­туп­ны би­нарн­ ые фай­лы, но вам мо­жет зах­ от­ етьс­ я ском­пил­ и­ров­ ать ре­дак­тор из про­меж­ ут­ очн­ ых про­пат­чен­ ных верс­ ий (interim patch versions). В  исх­ од­ник­ ах есть Make-фай­лы для комп­ ил­ ят­ о­ров Microsoft (makefile.wnt) и Borland (makefile.tbc). В пер­ вом есть больш­ е воз­мож­нос­ тей, на­при­мер сбор­ка прог­ рамм­ ы с  под­ держ­кой OLE, perl и встрое­ нн­ ой под­светк­ ой син­такс­ и­са. GUI для Win32 можн­ о со­брать люб­ ым комп­ и­ля­то­ром.Базовый внешний вид и функциональность winvile На рис­ . 18.4 и 18.5 по­каз­ ан гра­фи­чес­ кий ин­терф­ ейс Win32 для winvile. На перв­ ый взгляд он очень пох­ ож на инт­ ерф­ ейс «No Toolkit» в X11 с по­ лос­ а­ми про­крутк­ и. Есл­ и копн­ уть поглубже – а это несложно – он ока­ зы­ва­етс­ я бо­лее за­мы­слов­ а­тым, чем инт­ ер­фейс Motif. Рис. 18.4. winvile с не-Unicode шриф­том

Графические интерфейсы 397Рис. 18.5. winvile со шриф­том UnicodeНа рис. 18.4 по­каз­ ан вид winvile при ре­дак­тир­ о­ва­нии дан­ных Unicode:• Диа­лог выб­ о­ра шрифт­ ов из­нач­ альн­ о уст­ ан­ овл­ ен на мон­ о­шир­ ин­ный сис­тем­ный шрифт. Как и  в  xvile, этот шрифт мож­но за­дав­ ать при старт­ е winvile или с по­мощ­ ью скрипт­ а. Такж­ е его мож­но уст­ а­но­вить пос­ ред­ст­вом OLE-сер­вер­ а. На­кон­ ец, как пок­ а­за­но на ри­сунк­ е, его можн­ о за­дать обыч­ны­ми средс­ тв­ ам­ и Win32.• Данн­ ые имею­ т фор­мат Unicode UTF-16, без от­мет­ки о по­рядк­ е бай­ тов. Они подч­ еркн­ ут­ ы, так как па­литр­ а под­свет­ки исп­ ольз­ уе­ т под­ чер­кив­ ан­ ие и го­луб­ ой (cyan) цвет для рас­крас­ки строк в кав­ ычк­ ах.• Сис­тем­ный шрифт, стоя­щий по умол­чан­ ию, не мо­жет ото­браз­ ить симв­ о­лы в фай­ле. winvile вид­ ит, что шрифт мал, и отоб­ ра­жа­ет дан­ ные Unicode в ше­стн­ а­дцат­ ер­ ич­ном ви­де.На рис. 18.5 по­ка­зан рез­ уль­тат вы­бо­ра бо­лее под­хо­дя­ще­го шрифт­ а. Есл­ иснов­ а вы­брать сис­тем­ный шрифт, про­грамм­ а сно­ва по­каж­ ет ше­стн­ а­д­ц­ а­тер­ ич­ные зна­чен­ ия. Есл­ и не­обх­ о­дим­ о по­стоя­ нн­ о ви­деть симв­ ол­ ы в ше­стн­ ад­ цат­ е­ричн­ ом вид­ е, в vile есть соо­ тв­ ет­ств­ ую­щая опц­ ия.На рис. 18.6 пок­ а­за­ны нес­ коль­ко функц­ ий мен­ ю winvile, сре­ди ко­то­рых:• winvile рас­шир­ я­ет сис­темн­ ое ме­ню. Его мож­но увид­ еть, щелкн­ ув пра­ вой кнопк­ ой мы­ши по заг­ о­ловк­ у ок­на. В появивш­ емся мен­ ю есть те же пунк­ты, то есть не нужн­ о кажд­ ый раз пе­ре­ме­щать­ся на­верх. Это по­вед­ е­ние вклю­ча­ет­ся с по­мощ­ ью пункт­ а Menu вниз­ у мен­ ю.

398 Глава 18. vile: vi Like Emacs (vi как Emacs) • Мен­ ю обесп­ еч­ ив­ аю­ т опер­ ац­ ии от­крыт­ ия, со­хра­не­ния, пе­чат­ и и ра­бо­ ты со шрифт­ ом, тип­ ичн­ ые для граф­ ич­ ес­ ких при­лож­ е­ний. В пункт­ е CD можн­ о за­дать те­ку­щий раб­ о­чий ка­та­лог winvile. Со­отв­ етс­ т­вую­щие диал­ о­ги так­же дост­ упн­ ы в конс­ ольн­ ой вер­сии для Win32, но без ме­ню. • winvile также по­звол­ яе­ т за­хо­дить в  пап­ку Windows Favorites (Из­ бран­ное). • Не­давн­ ие фай­лы (и не­давн­ ие папк­ и) выб­ и­раю­ т­ся из нес­ коль­ких (ко­ лич­ ес­ т­во за­дае­ тс­ я поль­зо­ват­ е­лем) нед­ ав­но исп­ оль­зов­ ав­шихс­ я фай­ лов (или пап­ ок). Про­грамм­ а сох­ ран­ я­ет эти имен­ а в реес­ т­ре, что дел­ а­ ет их дос­тупн­ ым­ и из всех за­пущ­ енн­ ых экз­ ем­п­ляр­ ов winvile. Рис. 18.6. Ме­ню пос­ ледн­ их файл­ ов в winvileРасширенные регулярные выражения Мы уже по­зна­ко­ми­лись с рас­шир­ енн­ ы­ми ре­гу­ляр­ны­ми выр­ аж­ е­ниям­ и в разд­ ел­ е «Рас­ши­рен­ные рег­ ул­ яр­ные вы­ра­жен­ ия» на стр. 152. vile пре­ доставл­ яе­ т прим­ ер­но те же воз­мож­нос­ ти, что и  опц­ ия extended в  nvi. Они включ­ а­ют групп­ о­вые выр­ аж­ е­ния POSIX для класс­ ов симв­ ол­ ов, [[:alnum::]], с не­кот­ ор­ ы­ми расш­ ир­ е­ниям­ и (доп­ ол­нит­ ель­ные клас­сы и со­

Расширенные регулярные выражения 399кра­щен­ ия) и инт­ ер­вальн­ ые вы­раж­ е­ния, так­ ие как {,10}. Син­так­сис не­мно­го отл­ и­чае­ тс­ я от синт­ акс­ ис­ а в nvi – упор де­ла­етс­ я на доп­ олн­ и­тель­ные симв­ о­лы, экр­ ан­ и­ров­ анн­ ые об­ратн­ ой кос­ ой черт­ ой:\| Ука­зы­ва­ет на аль­тер­нат­ иву: house\|home.\+ Со­от­ветс­ тв­ уе­ т од­но­му или бо­лее предш­ е­ств­ ую­щим ре­гу­ляр­ным вы­ ра­же­ни­ям.\? Соо­ тв­ ет­ств­ у­ет одн­ о­му или ни од­но­му пред­ше­ст­вующ­ ем­ у рег­ ул­ яр­но­ му выр­ аж­ е­нию.\(...\) Пред­ ост­ ав­ля­ет групп­ ир­ ов­ку для *, \+ и \?, а такж­ е по­зво­ля­ет указ­ ы­ вать под­стро­ки в  за­мен­ яю­щей час­ти ком­ ан­ды подс­ тан­ ов­ки (\1, \2 и т. д.).\s, \S Соо­ тв­ етс­ т­вуе­ т про­бельн­ ым и ви­дим­ ым сим­во­лам со­отв­ ет­ств­ ен­но.\w, \W Оп­ре­де­ляе­ т симв­ ол­ ы, «из ко­тор­ ых сос­ то­ят слов­ а» (бу­кв­ ен­но-цифр­ о­ вые и знак подч­ ер­кив­ ан­ ия, «_»), и симв­ ол­ ы, так­ ов­ ым­ и не явл­ яю­щие­ ся, со­отв­ етс­ тв­ ен­но. Нап­ рим­ ер, \w\+ зад­ ае­ т клю­чев­ ые слов­ а и иден­ти­ фи­ка­то­ры в C/C++1.\d, \D За­дае­ т цифр­ ы и нец­ иф­ро­вые симв­ о­лы соо­ т­ветс­ т­вен­но.\p, \P Опр­ ед­ ел­ яе­ т неп­ еч­ а­таем­ ые и  печ­ ат­ аем­ ые сим­вол­ ы соо­ т­вет­ст­вен­но. Проб­ ел­ ы отн­ ос­ ятс­ я к печ­ а­тае­мым.vile доп­ ус­ка­ет исп­ ольз­ о­ван­ ие escape-пос­ ле­до­ва­тель­но­стей \b, \f, \r, \tи \n в за­мен­ яющ­ ей час­ти ком­ анд­ ы за­мен­ ы. Они озн­ ач­ а­ют Backspace, за­прос на под­ ач­ у стран­ иц­ ы, воз­врат ка­рет­ки, таб­ у­ля­цию и симв­ ол но­войстро­ки, соо­ т­ветс­ т­вен­но. За­ме­тим, что vile под­ра­жае­ т perl-обр­ а­ботк­ е \u\L\1\E, а  не той, ко­то­рая есть в vi. Ес­ли ско­ман­до­вать :s/\(abc\)/\u\L\1\E/, то vi за­ме­нит на abc, то­ гда как vile и perl за­мен­ ят на Abc. Это пол­ езн­ ее для ка­пи­та­ли­зац­ ии слов.1 Для сам­ ых въедл­ ив­ ых доб­ а­вим, что это так­же соо­ т­ветс­ тв­ уе­ т иден­тиф­ ик­ а­ то­рам, на­чи­нающ­ имс­ я с цифр­ ы; обыч­но это не при­во­дит к про­бле­мам.

400 Глава 18. vile: vi Like Emacs (vi как Emacs)Улучшенные возможности редактирования В  этом разд­ ел­ е опи­сан­ ы функ­ции vile, ус­ко­ряющ­ ие и  упр­ о­щающ­ ие обычн­ ое ре­дакт­ ир­ ов­ а­ние.История командной строки и автозавершение vile зап­ о­мин­ а­ет вво­дим­ ые польз­ о­ват­ ел­ ем ком­ анд­ ы ex в буф­ е­ре под на­ зва­ни­ем [History]. Эта возм­ ож­ность управл­ яе­ т­ся опц­ ие­ й history, кот­ о­ рая по умол­ча­нию уст­ ан­ овл­ ен­ а в зна­че­ние true. Ес­ли она вы­клю­чен­ а, то со­хран­ ен­ ие ком­ анд не ве­детс­ я, а  буф­ ер [History] удал­ яе­ тс­ я. Ко­манд­ а show-history раз­де­ля­ет экр­ ан, по­сле чег­ о в нов­ ом окн­ е ото­бра­жае­ т­ся бу­ фер [History]. В ре­аль­нос­ ти ком­ анд­ная строк­ а с двое­точ­ ие­ м явл­ яе­ т­ся мин­ и-­ бу­фер­ ом. Ее мож­но исп­ оль­зов­ ать, чтоб­ ы вспомн­ ить строк­ и из бу­фе­ра [History] и отр­ е­дакт­ и­ро­вать их. Кла­виш­ и ↑ и ↓ при­ме­няю­ тс­ я для про­крутк­ и вверх и вниз по ист­ о­рии ко­ манд, а ← и → – для пер­ е­ме­ще­ния по стро­ке. Для уда­лен­ ия сим­во­лов ис­ поль­зу­ет­ся тек­ ущ­ ий симв­ ол удал­ ен­ ия (как прав­ и­ло, это BACK­SPAC­ E). Все ос­тальн­ ые вво­ди­мые знак­ и ото­бра­жаю­ тс­ я в тек­ у­щей поз­ и­ции кур­ со­ра. Мин­ и-­буф­ ер мож­но пер­ е­ключ­ ить в реж­ им vi, есл­ и ввес­ ти симв­ ол mini- edit (по умол­чан­ ию это ^G). По­сле этог­ о vile подс­ ве­тит ми­ни-­бу­фер с по­ мо­щью мех­ ан­ из­ма, опр­ ед­ е­ляе­мог­ о оп­цие­ й mini-hilite. По умолч­ а­нию знач­ ен­ ие опции – reverse, инв­ ерт­ и­рую­щее цвет. В  реж­ им­ е vi мож­но польз­ о­вать­ся ком­ ан­дам­ и vi для пе­ре­мещ­ ен­ ия. Такж­ е мож­но за­дав­ ать ком­ ан­ды vile, под­хо­дя­щие для ред­ ак­тир­ ов­ ан­ ия в одн­ ой строк­ е, нап­ ри­ мер i, I, a и A. vile ре­шае­ т, как­ ие ком­ ан­ды бу­дут ра­бот­ ать, ос­нов­ ы­ва­ясь на свои­ х таб­ли­цах ком­ анд, что поз­ вол­ яе­ т польз­ о­ват­ ельс­ ким прив­ яз­кам кла­виш такж­ е раб­ о­тать в мин­ и­-бу­фер­ е. Ин­тер­ ес­ной особ­ ен­нос­ тью vile явл­ яе­ т­ся ис­поль­зо­ван­ ие им ист­ ор­ ии для отоб­ раж­ ен­ ия ран­ ее вво­ди­мых данн­ ых, соо­ тв­ етс­ тв­ ую­щих ввод­ им­ ой ко­ ман­де. На­при­мер, пос­ ле вво­да :set и про­бел­ а vile вы­свет­ ит под­сказ­ку Global value:. При этом мож­но ис­польз­ ов­ ать ↑, что­бы увид­ еть пре­дыд­ у­ щие за­данн­ ые ва­ми глоб­ аль­ные пе­рем­ ен­ные и  пол­ у­чить возм­ ож­ность изм­ ен­ ить одн­ у из них. Ком­ андн­ ая строк­ а ex пре­дос­тав­ля­ет авт­ о­за­верш­ е­ние раз­личн­ о­го ви­да. При вво­де име­ни ко­манд­ ы мож­но в  люб­ ой мом­ ент на­жать кла­виш­ у TAB, пос­ ле че­го vile по возм­ ож­нос­ ти зап­ ол­нит ос­тат­ ок имен­ и ком­ анд­ ы. Ес­ли на­жать TAB во втор­ ой раз, про­грамм­ а соз­даст но­вое ок­но, в ко­то­ ром буд­ ут по­каз­ а­ны все воз­мож­ные вар­ и­ант­ ы за­вер­ше­ния. Зав­ ер­шен­ ие про­из­во­дитс­ я у  встрое­ нн­ ых и  поль­зо­ва­тельс­ ких ко­манд vile, тег­ ов, имен файл­ ов, реж­ им­ ов (про них чуть поз­же), пе­рем­ енн­ ых, зна­чен­ ий пе­ре­чис­лен­ ий (нап­ рим­ ер, имен цве­тов) и симв­ о­лов терм­ ин­ а­ла


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