Сохранение команд 129 4. Наж ать ENTER для пер ех од а на новую строк у. 5. Нажать ESC, чтоб ы завершить реж им вставки. 6. Удал ить дефис и два окруж ающих его пробел а (3x), после чего сде лать след ующ ее слово прописным (~). Если эти действ ия нужн о пов торить нескольк о раз, то это довольно нуд ная работ а. С помощ ью :map можно сохранить всю послед овательн ость, чтобы затем выз ывать ее одн им нажатие м клав иш и: :map g I.IP \"^[ea\" 10n^M^[3x~ Обр ат ите вним ан ие, что как ESC, так и ENTER нео бх од им о «спрят ать» с помощ ью CTRL-V. Послед ов ат ельность ^[ возник ает после ввода CTRL- V и ESC. Если ввес ти CTRL-V и ENTER, то поя вится пос лед ов ат ель ность ^M. Пос ле этого простое наж атие на g произведет целую серию исправл ений. Есл и связь медленная, то вы смож ет е увидеть, как происх од ят эти прав ки, одна за друг ой. Если же канал широкий (или вы ред акт ируете файл лок ально), то это буд ет выг лядеть как волш ебс тво. Не расс траивайт есь, есл и ваша первая поп ытк а задать отображ ен ие для клав иш и не удастс я. Даж е неб ольш ая ошибка в опред ел ении ото браж ения мож ет привест и к рез ульт ат ам, дал ек им от ожид аемых. Вве дите u для отмен ы правки и поп роб уйте все сначал а.Другие примеры отображения клавиш Следующие прим ер ы показ ываю т нек от орые разумн ые сочет ан ия кла виш, котор ые можно использ овать в отображениях: 1. Доб авление текста при кажд ом пер ех оде в кон ец слов а: :map e ea В большинств е случае в единств енная прич ина для пер ех од а на кон ец слова – добавл ение текс та. Эта отображенн ая пос ледов ат ельность ав томат ич ески переводит пользов ателя в режим вставки. Обр атите вниман ие, что отоб раж аем ая клав иш а e уже имее т знач ен ие в vi. Можн о пер ео пред елять используемую в редакт оре клав ишу, но пок а работ ае т отоб раж ен ие, обычн ое действие этой клав иши нед ост упн о. В нашем случае это не страшн о, так как E част о равносильн а e. 2. Пер естановка двух слов: :map K dwElp Ранее в глав е мы уже обс уж д ал и аналогичн ую последовательн ость, однако сейч ас нужно исп ользовать E (здесь, как и во всех прим ер ах ниж е, мы полаг ае м, что ком анда e отоб раж ен а на ea). Не заб ыв айте, что курсор долж ен стоя ть в нач але первого из двух пер еставляемых слов. К сожален ию, из-за команд ы l эта послед ов ат ельн ость (как
130 Глава 7. Продвинутое редактирование и прив еденн ая ранее) не будет работ ать, есл и слова стоя т в конце стро ки, так как во врем я вып олнения пос ледов ательн ости курс ор поп ад ет на кон ец строк и и не мож ет стоя ть правее. Так что привед ем решен ие пол учше: :map K dwwP Вместо w можно исп ользов ать W. 3. Сохран ение файла и переход к след ующ ему из набора: :map q :w^M:n^M Обр ат ите вним ан ие, что можн о отоб ражать на клавиш и ком анд ы ex, но убед итесь, что пос ле кажд ой команды ex стоит возврат каретк и. Подобн ая последов ательность облегч ит пер ем ещен ие межд у файла ми и приг одится, есл и вы открыли множеств о небольших файлов одной командой vi. Отоб раж ение на бук ву q поможет запомн ить, что действ ие пос лед ов ат ельнос ти пох ож е на выход «quit». 4. Поместить код troff для жирног о шрифт а вокруг слов а: :map v i\fB^[e\fP^[ Здесь предп ол аг ается, что курсор стои т в нач але слова. Сначала вы пер еход ите в реж им вставк и, зат ем ввод ите код для жирного шриф та. Следует отм ет ить, что в ком андах отоб раж ения не нужн о впис ы вать две обр атные косые черты для получ ен ия одн ой. После этог о пос редством ввод а «спрят анног о» ESC происх од ит пер ех од в команд ный реж им. Наконец, к конц у слова припис ыв ае тс я заверш ающ ий код troff, после чего вы возвращаетесь в командный реж им. Обр ати те вним ан ие, что при добавл ен ии кода к конц у слов а пос лед ов ат ель ность ea не нужна, так как она уже отоб ражена на одн у букв у e. Это пок аз ывае т, что отоб раженн ые пос лед ов ательнос ти мог ут сод ержать друг ие отоб ражен ия (возм ожн ость использ овать влож енн ые после дов ательн ос ти отображ ен ий управл яе тся опц ией vi remap, котор ая обычно включен а). 5. Поместить вок руг слов а HTML-код жирног о шрифта, даж е есл и кур сор расположен не в нач ал е слов а: :map V lbi<B>^[e</B>^[ Эта пос лед оват ельн ость нап омин ае т пред ыдущ ую: помимо тог о, что здесь присутствуе т HTML, а не troff, она исп ольз уе т lb для выполн е ния дополнительн ой задачи – пом ещения курсора в начал о слов а. Если курс ор нах одится в середин е слова, то ком анда b перем ест ит его на нач ало. Однак о если курсор уже находитс я в начале слов а, ко манд а b пер енес ет его на нач ало предыд ущ ег о слова. Чтоб ы иск лю чить эту возможность, пер ед b стои т l. Можно опр едел ить вар иа нты этой пос лед ов ат ельн ости, заменяя b на B и e на Ea. Во всяком случае, команда l помеш ае т выполнению пос ледоват ельн ос ти, есл и курс ор стоит в конц е строки (это можно обойт и, доб авив пробел).
Сохранение команд 1316. Найти и удал ить скобки вок руг слова или фразы1 по всему документ у: :map = xf)xn Здесь предпол аг ается, что снач ал а ком анд ой /( вы найдете отк рыв а ющую скобку, а затем наж мет е ENTER. Есл и нео бходимо удал ить скобк и, использ уйт е ком анду map следую щим обр азом: удалите отк рыв ающ ую скобку с пом ощью x, найдит е зак рывающую с пом ощью f), удал ите ее с пом ощью x и повторите по иск отк рыв ающ ей скобки командой n. Есл и вы не хот ите удал ять скобк и (нап рим ер, ког да они стоя т пра вильно), не исп ольз уйте отображенную команду, а вмес то этого на жмит е n для поиска нов ой открыв ающ ей скобк и. Последов ат ельность отображ ения из этог о пример а можн о изм енить так, чтобы она обр аб ат ыв ал а не скобки, а кавычк и.7. Сделать всю строк у комм ентарием C/C++: :map g I/* ^[A */^[ Эта последов ательность добавл яет соч етан ие /* в нач ало строки, а к конц у прип ис ыв ае т */. То же самое можн о сдел ать, отобразив ко манду подс тан овк и: :map g :s;.*;/* & */;^M Здесь с помощ ью .* мы ищем соо тв етс тв ие всей строке, затем при ее воспрои зв еден ии (используя &) пом ещ аем ее между симв ол ам и ком мент ар ия. Обратит е внимание, что в качеств е разд елит елей исп оль зую тс я точк и с зап ятой, чтобы не пришлось экранир овать / в ком мент ар иях.8. Безо пасн о повторить большую вставк у: :map ^J :set wm=0^M.:set wm=10^M Как уже гов орил ось в глав е 2, в vi иногда возникае т проблема, свя занная с пов торен ие м больш их вставок текс та при включ енной опц ии wrapmargin. Ком анда map пом ож ет с этим справиться. Она временно от ключает wrapmargin (устан овив ее равной нул ю), вып олн яе т команд у пов торен ия, а зат ем восс тан авл ив ает знач ен ие опц ии. Обр ат ите вни ман ие, что в этой послед ов ательнос ти отображения присутс твую т од новременн о команды vi и ex.В предыд ущем прим ер е, нес мотр я на то, что ^J явл яетс я команд ой vi(пер емещает курс ор вниз на одн у строк у), эта клав иш а безо пасн о отоб-ражается, поскольку ее действие аналог ичн о команд е j. Сущ ес твуетмного клавиш, котор ые либ о выполняю т анал ог ичн ые другим дейс твия, либо редко использую тся. Одн ак о все-так и след уе т озн акомитьс яс ком анд ами vi, перед тем как смело использ овать клав иш и в качеств еотображаем ых, отказывая сь тем самым от их обычных знач ений.1 Взят о из стат ьи Вальт ер а Зинтца (Walter Zintz) в UNIX World, апрель 1990.
132 Глава 7. Продвинутое редактированиеОтображение клавиш в режиме вставки Как правило, отоб раж ен ия работ аю т только в командн ом реж име. Дей ствительно, в реж им е вставки клавиш и имеют свои обычн ые значен ия и им нельзя приписать команд ы. Тем не менее, если доб авить в ком ан ду map воск лиц ат ельный знак, то можно отм ен ить обычное знач ен ие клавиш и и сдел ать отоб раж ение в реж име вставк и. Эта функция пол ез на при раб от е в реж име вставки, ког да нужн о быс тр о отт уд а выйт и, вы полн ить ком анд у и вернутьс я обратн о. Предп оложим, вы наб рали слов о и забыли выд ел ить его курс ив ом (по мест ить в кавычки и т. п.). Можете задать отоб раж ен ие тип а: :map! + ^[bi<I>^[ea</I> Теперь при вводе + в конц е слов а оно выд елится HTML-кодом курс ива. Сам знак плюс а в тексте не поя вится. Опр едел енная подобным образом последовательн ость выходит из режи ма вставк и (^[), возвращ ает курсор в начал о слова, вставл яе т перв ую часть код а (bi<I>), снов а выход ит из реж им а вставки (^[) и двигает кур сор впер ед на место вставк и втор ой части код а (ea</I>). Пос кольк у ото браженная пос ледоват ельн ость нач инаетс я и зак анчив ае тся в реж име вставк и, пос ле так ого выд ел ен ия слова можно продолжать ввод текста. А вот другой пример: доп устим, нужн о пос тавить двоеточие в конц е пред ыд ущ ей строки. Это может сделать следующ ая отображ енная по след овательн ость1: :map! % ^[kA:^[jA Теп ерь, введя % в люб ом месте текущей строки, вы прип иш ите двоето чие к конц у пред ыдущей. Эта команда вых одит в командный реж им, пер ем ещае т курс ор вверх на строку и добавл яет к ней двоет оч ие (^[kA:), затем снова вых одит из реж има вставки, пер емещ ае т курсор на строку ниж е и включает реж им вставки (^[jA). Обр атит е вним ан ие, что в предыд ущих команд ах отображен ия мы ис польз овал и редк о встреч ающиеся симв олы (% и +). Если симв ол отоб ра жен для реж им а вставки, вы уже не смож ет е ввод ить его как текст. Чтобы верн уть знак у его прям ое значение, использ уйте команд у: :unmap! x где x – это симв ол, котор ый прежде был отображ ен для режим а вставки (хотя vi раскроет симв ол x в командной строке при его ввод е, и это будет пох оже на снятие отоб ражения раск рытого текста, он прои зведет кор ректную отмену отоб ражения симв ола). Отображен ия в реж им е вставки больше подход ят для привязки сим вольн ых строк к специа льн ым клавишам, не использ уемым для других 1 Из стат ьи Walter Zintz в журнале UNIX World, апрель 1990.
Сохранение команд 133 целей. Оно особ енн о пол езно при раб оте с программ ир уемыми функцио нальн ым и клав иш ам и.Отображения функциональных клавиш Многие термин ал ы имеют прог рамм ируемые функц ион альн ые клав и ши1 (кот орые удачн о эмулир уются на эмул ятор ах терм ин алов на совре менных раст ров ых рабоч их станц иях). В спец иальн ом уст анов очном реж им е (setup) термин ал а эти клавиш и можно нас трои ть на печать од ног о или нескольких любых симв олов. Одн ако клав иш и, запрограмми ров анные в уст ан ов очном реж им е термин ала, будут работать только на этом терм ин ал е. Кром е тог о, при этом ограничив аютс я действ ия про грамм, использ ующих функцион альные клав иш и в своих цел ях. ex поз вол яе т отобразить эти клавиш и в вид е чис ел с помощ ью: :map #1 commands для функциональной клав иш и ном ер 1 и так дал ее (это возм ожн о, пото му что ред актор имеет дост уп к той запис и в базах данн ых terminfo или termcap, где есть информ ац ия об обн аруж енном термин але, и знае т, ка кая Escape-послед овательн ость обычн о соотв етс твуе т опр ед еленной функциональной клав иш е). Как и в случ ае обычных кнопок, по умолчанию отоб ражен ия относ ятся к ком андн ому реж им у, но с помощью команды map! функцион альной клав иш е можн о задать два разл ичн ых значен ия: одно для командн ог о реж има, а другое – для реж им а вставк и. Например, при верстке HTML можн о прис воить функциональн ым клав иш ам коды изм енения начер тания шрифта: :map #1 i<I>^[ :map! #1 <I> Если вы нах од ит есь в ком андном реж им е, то перв ая функц иональная клавиш а пер ев едет вас в реж им вставк и, введет симв ол ы <I> и верн ет в командн ый реж им. Есл и польз ователь уже нах одится в реж име встав ки, клав иш а просто добавит HTML-код из трех симв олов. Если послед ов ательн ость содерж ит ^M ( возв рат каретк и), то наж мите CTRL-M. Например, чтобы функциональн ая клавиш а 1 была дост упна для отоб ражен ия, зап ись в термин альной базе данн ых для вашег о тер мин ал а должна содерж ать прим ерно след ующ ее опр еделен ие для k1: k1=^A@^M В свою очередь, опред ел ение: ^A@^M должно появл ятьс я в выв од е при наж атии этой кнопки. 1 На сов ременн ой клавиат уре PC им соотв етс твую т функциональн ые клави ши F1–F12. – Прим. нау ч. ред.
134 Глава 7. Продвинутое редактирование Чтобы увид еть значен ие функцион альной клав иш и, воспольз уйт есь команд ой od (octal dump) с опц ие й -c (показ ывать каждый симв ол). Те перь после наж ат ия этой функц иональн ой клавиш и введите ENTER, а зат ем CTRL-D, чтоб ы ком анд а od вывела информ ац ию. Например: $ od -c ^[[[A ^D 0000000 033 [ [ A \n 0000005 Здесь функц иональн ая клав иш а пос ылае т компьютеру Escape, две ле вых квадр атных скобк и и A.Отображения для других специальных клавиш Мног ие клавиат ур ы сод ерж ат специа льные кнопк и, дубл ир ующ ие ко манд ы vi, так ие как HOME, END, PAGE UP и PAGE DOWN. Если описа ние термин ала в terminfo или termcap являе тс я полным, то vi сможет рас познать эти клавиши. Одн ако есл и это не так, то можн о использовать команду map, чтобы сделать их дост упн ым и в vi. Обычн о эти клавиши посылают комп ьют ер у Escape-последовательность – симв ол Escap e, за котор ым след уе т строк а из одног о или нес кольких симв олов. Чтоб ы предотврат ить обр аб отку Escape в ex, нужно наж ать ^V перед специа ль ной клав иш ей в ком анде отображ ения. Нап рим ер, чтоб ы кнопк е HOME на клавиатуре IBM PC поставить в соответс тв ие подх одящий эквив а лент из vi, можно опр ед елить следующ ее отоб ражение1: :map CTRL-V HOME 1G На экран е это будет выг ляд еть так: :map ^[[H 1G Похож ие команд ы отображ ен ия выг ляд ят след ующим образом: :map CTRL-V END G покажет :map ^[[Y G :map CTRL-V PAGE UP ^F покаж ет :map ^[[V ^F :map CTRL-V PAGE DOWN ^B покажет :map ^[[U ^B Возможно, вам зах очется поместить эти отображ ен ия в файл .exrc. Об ратите вним ан ие, что если спец иальн ая клавиш а выраб ат ывае т длин ную экр ан ирующ ую пос ледов ательность (содержащ ую нес колько неп е чатаемых симв ол ов), ^V защ итит от интерп ретац ии тольк о первый Esca pe-симв ол, и отображ ен ие не будет работ ать. Вместо того чтоб ы прос то наж имать ^V, а затем нужн ую клавиш у, вам придется отыс кать полн ую Escape-послед ов ательность (возможно, в руковод стве по вашем у терми налу) и ввести ее вручн ую, исп ользуя ^V там, где это необходимо для защ иты Escape-симв олов от интерпретац ии. 1 Скор ее след овал о бы напис ать :map ^[[H ^, поскольку авт орс кий вариа нт ко манд ы пер ен ос ит курсор в нач ал о файла, а не строки. – Прим. нау ч. ред.
Сохранение команд 135 Есл и вы польз уетесь различн ым и типам и терминалов (наприм ер, конс о лью на PC и xterm), то не надо ожид ать, что отображ ен ия, подобные пред ставленным выше, всег да буд ут раб отать. Для таких случае в Vim предос тавляет перен осим ый способ для описан ия таких отоб раж ен ий клав иш: :map <Home> 1G Введите шесть симв ол ов: < H o m e > (Vim)Отображение нескольких клавиш ввода Отоб раж ение наж ат ий на нес колько клавиш не огран ичивае тс я функ циональн ыми кнопк ам и. Можн о также отоб ражать последов ательно сти нажат ий обычн ых клав иш. Это пом ож ет при ввод е опред ел енных тип ов текс та, нап рим ер XML или HTML. Опир аясь на Джерри Пик а (Jerry Peek), соа вт ор а изданной O’Reilly кни ги Learning the Unix Operating System, привод им нек отор ые из команд :map, облегч ающ ие ввод разметки XML. (Строки, начин ающиеся с двой ной кав ычки, явл яютс я комм ентариям и. Позже об этом будет расс ка зано в раздел е «Комм ент арии в скриптах ex» на стр. 142.) \" ADR: need this :set noremap \" bold: map! =b </emphasis>^[F<i<emphasis role=\"bold\"> map =B i<emphasis role=\"bold\">^[ map =b a</emphasis>^[ \" Move to end of next tag: map! =e ^[f>a map =e f> \" footnote (tacks opening tag directly after cursor in text-input mode): map! =f <footnote>^M<para>^M</para>^M</footnote>^[kO \" Italics (\"emphasis\"): map! =i </emphasis>^[F<i<emphasis> map =I i<emphasis>^[ map =i a</emphasis>^[ \" paragraphs: map! =p ^[jo<para>^M</para>^[O map =P O<para>^[ map =p o</para>^[ \" less-than: map! *l < ... Если пользоватьс я этим и командами, то для ввода сноски вам нужн о пе рейт и в реж им вставки и набрать =f. При этом vi поставит открыв ающ ие и закрывающ ие теги и пом естит курсор между ним и в реж име вставк и: All the world's a stage.<footnote> <para> </para> </footnote>
136 Глава 7. Продвинутое редактирование Стоит ли гов орить, что при работе над книг ой подобн ые макр ос ы оказа лись чрезвыч айн о пол езн ы.@-функции Именов анн ые буфер ы пред оставляю т еще один спос об создан ия «мак рос ов» – сложн ых послед оват ельнос тей команд, кот ор ые можно вып ол нять всег о нес кольким и наж ат иями клав иш. Если в текс те нап ис ать команд у (это может быть пос ледовательность vi или ком анд а ex, перед которой стоит двоеточ ие), а зат ем удалить ее в именов анный буф ер, то сод ержим ое этог о буф ер а можн о выполнить с помощ ью команды @. Нап рим ер, в новой строке введ ит е следующ ее: cwgadfly CTRL-V ESC На экране это будет выг лядеть так: cwgadfly^[ Снов а нажмите ESC для выхода из реж им а вставки и удал ите строку в буф ер g, введя \"gdd. Теперь всякий раз при пом ещ ен ии курсора в нача ло слова и ввод е @g это слов о будет зам енено на gadfly. Поскольку @ интерпретир уется как команда vi, точка (.) повторит всю послед ов ат ельн ость, даже есл и в буфер е содерж итс я команда ex. Соче тан ие @@ повтор ит пос ледн юю @, а u или U можн о исп ользовать для отм е ны дейс тв ия @. Это был простой пример. @-функц ии пол езны, поскольку их можн о примен ять для самых необычн ых ком анд. Особ енно это удобн о при од новрем енн ом ред акт ировании нес кольк их файл ов, так как ком анды со держ атс я в свои х именованных буф ерах и их можн о вызывать из люб о го редакт ир уем ого файл а. @-функции также полезн ы в сочетан ии с ко манд ами глоб альной замены, про кот ор ые расс казывалось в главе 6.Выполнение содержимого буферов в ex В реж име ex такж е можно выполн ить текст, сохраненный в буф ер е. В этом случае необх одим о ввести команд у ex, удал ить ее в имен ов ан ный буфер, пос ле чег о использ ов ать команду @ из приглашения с двое точие м. Нап рим ер, введ ем следующие строк и: ORA publishes great books. ORA is my favorite publisher. 1,$s/ORA/O'Reilly Media/g Помест ив курс ор в последнюю строк у, удалит е ее в буф ер g командой \"gdd, затем пос тавьте курсор на первую строку (kk) и выполн ите сод ер жащ иеся в буфере ком анд ы из командной строк и с двоеточие м (:@g ENTER). На экр ан е вы должны увид еть следующ ее:
Использование скриптов ex 137 O'Reilly Media publishes great books. O'Reilly Media is my favorite publisher. В некот ор ых версиях vi симв ол * в командной строке ex трактуе тся так же, как и @. Кроме тог о, есл и после ком анд @ или * стои т *, то ком анд а бер етс я из буфера (неи менованн ого) по умолчанию.Использование скриптов ex Отдельные команд ы ex, так ие как отображ ения, аббрев иатуры и проч ие, можн о исп ольз овать тольк о из vi. Есл и эти ком анд ы сох ран ить в файле .exrc, они будут авт ом ат ичес ки выполняться при запуск е ред актор а. Файл, содержащ ий вып олняем ые команд ы, наз ываетс я скриптом. Команд ы, сод ерж ащиеся в обычн ом скрипте .exrc, нельз я использов ать вне vi, но можно сохран ять в скрипт другие ком анды ex, а затем приме нять его к одн ому или нес кольк им файл ам. Во внешних скрипт ах в ос новном использ ую тс я команд ы подстан овки. При созд ании текс тов ых файлов скрипты ex могут использов аться при пров ерке прав ильности использ уемых терм ин ов и даже орфог рафии по всем у набор у док умент ов. Предполож им, вы выполнили UNIX-ком ан ду spell с двумя файл ам и, и она выдала следующ ий спис ок опеч аток: $ spell sect1 sect2 chmod ditroff myfile thier writeable Как часто бывае т, проверк а орф ограф ии выя вил а несколько технич е ских термин ов и спец иальн ых случ аев, которые не смогла расп ознать. Однак о она нашла и две нас тоящих ошибк и в нап исан ии. Поскольку мы провер ил и два файл а сраз у, нам неизв естно, в как ом из них содерж атс я эти ошибки и где они расположены. Хот я есть способ ы их опр едел ить, да и для двух ошиб ок в двух файл ах такая зад ача необ рем енительна, но легк о предс тавить, наскольк о возраст ет объем рабо ты у бедн ог о корр ект ор а или наб орщ ик а при проверк е больш ого кол и чества файлов. Чтобы обл егчить задач у, можно нап ис ать скрипт ex со следующим и ко мандам и: %s/thier/their/g %s/writeable/writable/g wq Пусть мы сох ранил и эти строки в файл exscript. Этот скрипт можно за пустить из vi с помощ ью команд ы: :so exscript
138 Глава 7. Продвинутое редактирование Его также можно примен ить к файл у прям о в ком андн ой строк е и отр е дакт ир овать файл ы sect1 и sect2 след ующ им обр аз ом: $ ex -s sect1 < exscript $ ex -s sect2 < exscript Ключ -s, след ующ ий за выз ов ом ex, – это POSIX-способ прик азать ре дакт ор у под авлять обычный выв од на терм ин ал1. Есл и бы скрипт был больше, чем в этом прос том пример е, то мы бы уже сэкон ом ил и нек оторое время. Одн ак о вы может е спросить, можн о ли как-то изб еж ать повторен ия этого проц есс а для каждог о из ред акт и руем ых файл ов. Кон ечн о да, мы мож ем напис ать скрипт обол очк и, ко тор ый не тольк о включает, но и обобщ ае т вызов ex, так что его можно использ овать для люб ого числ а файлов.Циклы в скриптах командной строки Вы, нав ерное, уже знаете, что оболочка – это не только интерпретат ор командной строк и, но и язык прог рамм ир ов ан ия. Чтобы выз вать ex с нес кольким и файлами, мы исп ольз уе м простую ком анд у оболочк и, наз ываемую циклом for. Он позвол яе т выполнять пос лед ов ательность ком анд для каждог о арг ум ент а скрипта. (Возм ожн о, цикл for является наибол ее часто исп ользуем ым куском код а для нач инающих осв аив ать прог рамм ир ов ание в оболочк е. Его стоит нау читься использ ов ать, да же есл и вы не собираетесь пис ать другие скрипт ы.) Цикл for имеет след ующ ий синт аксис: for variable in list do command(s) done Например: for file in $* do ex - $file < exscript done (Отступ в команде можн о не делать; у нас он пок аз ан для удобств а чте ния.) После создания этог о скрипта сохран им его в файле с имен ем correct и сдел аем его исп олняемым ком андой chmod (есл и вы не знак ом ы с командой chmod и дейс твиями, нео бх одим ыми для ее поп адания в пу ти пои ска UNIX, почит айте книг у Learning the UNIX Operating System, опублик ов анную в O’Reilly). Теперь введ ем: $ correct sect1 sect2 1 Обычн о для этой цел и ex использ уе т один очный знак мин ус а. Для обр атной совместим ости поддерж ив аю тся оба способа.
Использование скриптов ex 139Цикл for в correct присвоит пер ем енн ой file кажд ый арг ум ент (каждый файл в списке, опр ед еленном как $*, что озн ачает все арг ум ент ы)и вып олн ит скрипт ex с содержим ым каждой из этих переменных.Пон ять принц ип работы цикл ов for буд ет проще, если взять прим ерс более очевидным вывод ом. Пос мотрим на скрипт для пер еи мен ов ан ияфайлов:for file in $*do mv $file $file.xdoneПредп ол ожим, что этот скрипт распол ож ен в исп олняем ом файл е с именем move. Мы можем сделать след ующ ее:$ ls Только файлы глав (ch...)ch01 ch02 ch03 move Пров ерим результат ы$ move ch??$ lsch01.x ch02.x ch03.x moveЕсл и под ойт и к дел у творчес ки, то можн о по-друг ом у пер еп исать скрипт,переимен ов ыв ающий файлы:for nn in $*do mv ch$nn sect$nndoneВ так ом скрипте следует указывать в командн ой строк е не имен а, а номер а файл ов:$ lsch01 ch02 ch03 move$ move 01 02 03$ lssect01 sect02 sect03 moveЦиклу for не обяз ательн о треб уется $* (с люб ыми аргум ент ами) в качестве списка знач ен ий. Можно указ ать список в явн ом виде. Например:for variable in a b c dприс ваивает variable знач ения a, b, c и d по очереди. Такж е можно подставл ять выв од другой ком анд ы.Например:for variable in `grep -l \"Alcuin\" *`присвоит variable по очеред и имя каждого файла, в кот ор ом grep найд етстрок у Alcuin. (grep -l вывод ит имен а тех файлов, сод ержим ое кот орыхотв еч ает шабл он у, без выв ода сам их строк, где есть совп аден ие.)Есл и спис ок не указан:for variable
140 Глава 7. Продвинутое редактирование пер ем енной variable будет присвое н кажд ый из аргументов командной строки, как был о в наш ем первом пример е. Вообщ е говор я, это равн о сильн о не так ой ком анд е: for variable in $* а так ой: for variable in \"$@\" Пос леднее выражение имеет нем ного другое значен ие. Симв ол $* рас крыв аетс я в $1, $2, $3 и т. д., а последовательность из четырех симв олов \"$@\" – в \"$1\", \"$2\", \"$3\" и т. д. Кав ычки защ ищ ают от послед ующ ей инт ер прет ации спец иальн ых симв ол ов1. Давайт е верн емся к основн ой идее и наш ем у первон ач альному скрипту: for file in $* do ex - $file < exscript done Использ ован ие двух скриптов – скрипт а оболочк и и ком анды ex – мо жет показ аться нем ного безвкусным. Ведь факт ичес ки оболочк а сама дает способ включить скрипт ред актир ов ания в скрипт оболочк и.Документы heredoc В скриптах оболочки операт ор << означает взять в качес тве ввода коман ды след ующ ие далее строки вплоть до указ анн ог о марк ер а. (Част о это называю т док ументом heredoc.) С пом ощ ью этого синтаксис а мы мо жем включить в correct собственные ком анды редактир ования следую щим обр аз ом: for file in $* do ex - $file << end-of-script g/thier/s//their/g g/writeable/s//writable/g wq end-of-script done Строка-марк ер end-of-script совершенн о прои зв ол ен. Единс твенное тре бование сос тоит в том, что это должен быть набор симв ол ов, не сод ерж а щихс я во ввод е, чтоб ы оболочка могл а распоз нать кон ец документа heredoc. Такж е его нужно пом естить на нач ало строки. По сог лашению мног ие польз оват ел и указывают кон ец документа heredoc строкой EOF или E_O_F, обоз начающей конец файла. 1 Например, есл и знач ен ие какой-либо из пер ем енных $1, $2, $3 (имя файла- арг умент а в прим ер е выш е) сод ержит пробел, то в цикле по \"$@\" оно буд ет представл ено одн им значением (что правильно), а в цикл е по $* – нес коль кими разными знач ениям и (что неправильн о). – Прим. науч. ред.
Использование скриптов ex 141 Каждый из предс тавленных спос об ов имеет свои дост оинства и недос татки. Есл и вы хот ит е продел ать сер ию однок ратных прав ок и готовы пер еп исывать скрипт кажд ый раз, то док умент heredoc дае т эффект ив ное решение этой зад ач и. Одн ако бол ее гибк ий способ состоит в запис и ком анд редакт ир ов ан ия в отдельном от скрипта обол очки файл е. Наприм ер, можно дог овор ить ся, что вы всег да разм ещаете команды редакт ир ов ания в файле с име нем exscript. В этом случае скрипт correct нужн о нап ис ать всего один раз. Его можно хран ить в спец иа льн ом «утил итн ом» каталоге (кот ор ый сод ержится в пути пои ск а) и использ ов ать в люб ое время.Сортировка текстовых блоков: пример скрипта ex Предп олож им, вам нужно расположить в алфав итн ом порядке опред е ления глосс ария, содерж ащ иес я в размеченном troff-файле. Кажд ый терм ин нач ин аетс я с макроса .IP. Вдобавок, каждый пункт заключен в пар е макрос ов .KS/.KE (чтоб ы каждый термин выс туп ал в блоке со сво им опр едел ением, то есть чтобы они не оказ ались на разных стран и цах). Файл глоссария имеет прим ерн о след ующий вид: .KS .IP \"TTY_ARGV\" 2n The command, specified as an argument vector, that the TTY subwindow executes. .KE .KS .IP \"ICON_IMAGE\" 2n Sets or gets the remote image for icon's image. .KE .KS .IP \"XV_LABEL\" 2n Specifies a frame's header or an icon's label. .KE .KS .IP \"SERVER_SYNC\" 2n Synchronizes with the server once. Does not set synchronous mode. .KE Если прогнать его строк и чер ез UNIX-ком анду sort, то можно прив ест и файл в алф авитн ый порядок. Однак о нам не нужно сортир овать все строки подряд. Отсортир ованы должны быть тольк о терм ин ы глосса рия, а кажд ое определ ение должно ост аться нет рон ут ым и след ов ать за соо тв етс тв ующ им термин ом. Оказывае тся, каждый текстов ый блок можн о рассматр ив ать как целое, есл и объединить блок в одной строке. Вот перв ая верс ия нашег о скрипта ex: g/^\.KS/,/^\.KE/j %!sort
142 Глава 7. Продвинутое редактирование Каждый пункт глосс ария расп оложен между макр осами .KS и .KE. Ко манд а ex j объе дин яе т строк и (ее экв ив ал ент в vi наз ываетс я J), поэ том у перв ая команда объе дин яе т кажд ую запись глоссар ия в одну «строк у». След ующая ком анд а отсортирует файл, и на выходе пол учитс я что-то врод е этого: .KS .IP \"ICON_IMAGE\" 2n Sets or gets ... image. .KE .KS .IP \"SERVER_SYNC\" 2n Synchronizes with ... mode. .KE .KS .IP \"TTY_ARGV\" 2n The command, ... executes. .KE .KS .IP \"XV_LABEL\" 2n Specifies a ... icon's label. .KE Сейчас строк и отсорт ир ованы по зап ис ям. К сож ален ию, макр ос ы и текст в них перемеш ал ись (мног от оч ия […] обозначаю т проп ущ енный текст). Теперь над о как-то встав ить пер еносы, чтоб ы «разъед ин ить» строки. Это можно сдел ать, изм енив скрипт ex след ующим обр аз ом: пе ред объе динен ием нужн о пометить точк и объединения, а затем заме нить эти метк и на перевод строки. Расш иренный скрипт ex имее т вид: g/^\.KS/,/^\.KE/-1s/$/@@/ g/^\.KS/,/^\.KE/j %!sort %s/@@ /^M/g Первые три команд ы дадут след ующий результ ат: .KS@@ .IP \"ICON_IMAGE\" 2nn@@ Sets or gets ... image. @@ .KE .KS@@ .IP \"SERVER_SYNC\" 2nn@@ Synchronizes with ... mode. @@ .KE .KS@@ .IP \"TTY_ARGV\" 2nn@@ The ... vector, @@ that ... .@@ .KE .KS@@ .IP \"XV_LABEL\" 2nn@@ Specifies a ... icon's label. @@ .KE Обратите вним ание на дополн ительный пробел после @@. Эти проб елы поя вляю тся от ком анды j, поскольк у она преобразует каждый пер евод строк и в проб ел. Первая команда помеч ает первон ачальн ые перен ос ы строк симв олам и @@. Кон ец блок а (после .KE) помечать не надо, поэтому в перв ой последо ват ельности стои т команда -1, перем ещающая курс ор от конца блока вверх на одн у строку. Четв ертая команд а восс тан авл ив ает пер еносы строк, зам еняя метк и (и один проб ел) на новые строк и. Пос ле этог о файл будет рассортир ован по блок ам.Комментарии в скриптах ex Возможн о, вы буд ет е использ ов ать этот скрипт нео дн ок ратно в разн ых ситуациях. В случ ае сложн ых скриптов, таких как в наш ем примере, раз умн о добавл ять комм ентарии, чтобы другим пользов ателям (или да же вам) было легч е его реконстр уиров ать. В скрипт ах ex все, что следу ет за двойной кавычкой, буд ет игн орир оватьс я во время выполнения, поэ том у двойн ая кав ычка отмечае т начало комм ент ар ия. Комм ент арии можно писать в отдельн ых строк ах. Они также мог ут располаг аться в конц е люб ой ком анд ы, не считающей кав ычки свое й частью. (Нап ри
Редактирование исходного кода программы 143 мер, кав ычка имеет знач ен ие в командах отображен ия и обол очки. По добные строк и не могут заканчиваться комм ент арием.) Кроме исп ользован ия комм ент арие в можно указывать полное имя ко манд ы, что в vi обычно не делается из-за экон омии врем ен и. Након ец, после добавлен ия проб елов наш ex-скрипт стан ет гор азд о бол ее удобо читаемым: \" Mark lines between each KS/KE block global /^\.KS/,/^\.KE/-1 s /$/@@/ \" Now join the blocks into one line global /^\.KS/,/^\.KE/ join \" Sort each block--now really one line each %!sort \" Restore the joined lines to original blocks % s /@@ /^M/g Удив ит ельн о, но команда substitute в ex не работает, хотя полн ые имена друг их команд работ аю т.За пределами ex Если изл оженн ый мат ериа л проб удил ваш апп ет ит к бол ее продвину тому редактир ов анию, то необх од им о знать, что в UNIX есть гораздо более мощные ред актор ы по сравнен ию с ex, так ие как потоков ый ре дакт ор sed и язык обр аб отк и данн ых awk. Такж е сущ ес твует чрезв ыч ай но поп улярн ый язык программир ован ия Perl. Есл и хотите узн ать боль ше об этих программ ах, обрат ит есь к книг ам O’Reilly: sed & awk, Effective awk Programming, Learning Perl1 и Programming Perl2.Редактирование исходного кода программы Все рассмотренн ые выш е функц ии не отлич али обычный текст от про граммн ог о код а. Однак о сущ ес твует ряд доп олн ит ельн ых функций, ко тор ые будут интер есны именн о программ истам. Так овым и являю тс я контроль отс туп ов, поиск начал а и конц а проц ед ур ы и использование ctags. Дальнейш ее изложение осн ован о на документ ац ии, пред ост авл енной Mortice Kern Systems для их прек расной реализ ации vi для систем DOS и Windows, доступн ой в вид е части MKS Toolkit или отд ельн ой про граммы MKS Vi. Воспроизводитс я с разреш ен ия Mortice Kern Systems.1 Рэнд ал Шварц, Том Феникс и Брайан Д. Фой «Изуч аем Perl», 5-е издание. – Пер. с англ. – Симв ол-Плюс, 2009.2 Ларри Уолл, Том Кристианс ен, Джон Орвант «Программирование на Perl», 3-е издание. – Пер. с англ. – Симв ол-Плюс, 2002.
144 Глава 7. Продвинутое редактированиеКонтроль за отступами Прог раммн ый код нес колько отлич ае тся от обычного текста. Один из асп ектов касаетс я использ ов ания отс туп ов в код е, где они показ ывают логическую структур у программ ы, то есть способ объе динен ия строк в блок и. vi дает возможность авт оматически конт рол иров ать отс тупы. Чтоб ы исп ользовать это, введит е ком анду: :set autoindent Теперь при установк е отс туп а в строке пробелами или табуляц ией та кие же отс тупы уст ановятс я во всех пос лед ующ их строк ах. После на жат ия на ENTER в конц е перв ой строки с отс тупом курсор переместит ся на нов ую строку и автом ат ич ески отступит на то же расстоян ие, что и в пред ыд ущей. Есл и вы прог рамм ист, то сможете сэкон омить мног о времени на уста новке отступ ов, особенно если у вас есть несколько уровней отступов. При ввод е текс та с включ енн ой опц ией autoindent нажат ие CTRL-T в на чале строк и перев едет курсор на след ующ ий уровень отс туп а, а CTRL-D верн ет его обр атн о. Отм етим, что CTRL-T и CTRL-D должны ввод иться в реж им е вставки, в отличие от многих друг их ком анд, которые набираю тся в командном реж им е. Есть два друг их вариа нт а примен ен ия ком анд ы CTRL-D1: ^ ^D Если ввес ти ^ ^D (^ CTRL-D), то vi пер ем естит курсор назад на нач ало строки, но тольк о для текущ ей строк и. След ующ ая строка начн ется на текущ ем уст ановленном авт омат ически уровн е отс тупа. Это мо жет быть пол езно при вводе ком анд преп роц есс ор а C в программ ах на C/C++. 0 ^D При нажатии 0 ^D vi пер ем естит курс ор обр атно на начало строк и. Вдобав ок к этому текущ ий уров ень отс туп а станет нулев ым, и сле дующ ая строк а будет уже без отс туп а2. Попробуйте опц ию autoindent при ввод е программн ог о код а. Она упро стит раб от у по упор яд очив ан ию отс туп ов. А в нек оторых случаях пом о жет избеж ать ошибо к, наприм ер в программ е на C, где требуе тся одна закрывающ ая фиг урн ая скобка (}) для кажд ог о возв рат а на предыду щий уров ень отс туп а. При устан овк е отступов в программе такж е мог ут быть полезными ко манд ы >> и <<. По умолчан ию >> смещае т строку на восемь проб ел ов 1 В elvis это раб отать не будет. 2 В докум ент ация nvi 1.79 эти две команды переп ут аны, но программа вед ет себ я именн о так, как мы опис ал и.
Редактирование исходного кода программы 145вправо (то есть добавляет к отступ у эти восемь проб ел ов), а << – на восемь проб ел ов влев о. Наприм ер, пер ем ест ив курсор на нач ал о строкии набрав >>, вы увидите, как строка сместитс я вправо. Есл и ввести <<, тострока вернетс я на прежнее место.Можно смес тить нес кольк о строк, указ ав их колич еств о перед >> или <<.Нап ример, поместите курсор на первую строку больш ог о абзаца и введит е 5>>. Пос ле этог о перв ые пять строк в этом абзаце сдвинутс я вправ о.По умолчанию велич ина сдвиг а равн а восьм и проб елам (влев о иливправ о). Это знач ение можн о измен ить след ующ ей команд ой: :set shiftwidth=4Вы увид ите, что цел есообр азно уст ан ов ить shiftwidth равным ширинетабуляции.При уст ановк е отс туп ов vi пытае тся умн ич ать. Как прав ило, при наличии текста с отс туп ом из восьм и пробелов он встав ит в файл симв олытабул яц ии, потому что обычно таб уляция заменяе тся вос ем ью пробелами. Это принят о в UNIX, однак о легко зам етить, что при ввод е табуляции и печ ати файла на принт ер е UNIX заменит ее на восемь пробелов.При жел ании можн о изменить спос об предс тавл ен ия таб уляц ии на экране, помен яв опц ию tabstop. Наприм ер, если у вас больш ой уровеньвложенн ос ти блоков, можно взять четыр е симв ола для таб ул яции, чтобы строк и помещ ались на строк е. Так ую замен у прои звед ет след ующаякоманд а: :set tabstop=4 Мен ять ширину таб ул яц ии не реком ендуе тся. Хотя vi и буд ет ото браж ать файл при люб ом значении tabstop, в ост альн ых програм мах UNIX знак и таб ул яц ии будут1 зам ен ятьс я на восемь пробелов. Хуж е того: смесь проб ел ов, таб уляций и нео бычн ых поз иц ий табу ляц ии сделае т ваш файл сов ершенн о нечитаем ым в друг их прог рам мах, таких как программ а постраничн ого вывода more, или при рас печ атк е. Восьмисимв ольн ая табуляция – это одн а из данн ос тей UNIX, и вам придется с этим смириться.Иног да отступы не раб отаю т как над о, потом у что симв ол таб уляц ии напроверк у оказываетс я нескольким и проб ел ам и. Как правило, на экр ане таб уляция и проб ел отображ аю тс я один аков о, и их не различить.Однако можн о выполнить следующую команду: :set list1 По крайн ей мер е, могут: в некот ор ых прилож ениях UNIX, особ енн о совре менн ых, шир ину таб ул яции такж е можно регулиров ать. Но в люб ом случ ае изм ен ен ие значен ия tabstop в vi вылье тся в лишн юю работу. – Прим. нау ч. ред.
146 Глава 7. Продвинутое редактирование При этом отображ ение смен итс я так им образом, что табуляц ия будет показана в виде управл яющ его симв ола ^I, а конец строки – как $. В этом случае можн о расп ознать реа льн ые пробел ы и увидеть лишн ие в конц е строки. Врем енн ым эквив алент ом этого является команд а :l. Например, пос лед овательн ость: :5,20 l отоб разит символы таб ул яц ии и конц а строк и в строках с 5-й по 20-ю.Специальная команда поиска Симв олы (, [, { и < могут быть открыв ающими скобками. Ког да курс ор находится на одном из этих симв ол ов, нажатие клавиши % пер ем ест ит его с отк рытой скобк и вперед на соответс тв ующ ую зак рывающую: ), ], } или > с учет ом обычног о правил а для влож енн ых скобок1. Нап ример, если пос тавить курс ор на перв ую ( в выр аж ен ии: if ( cos(a[i]) == sin(b[i]+c[i]) ) { printf(\"cos and sin equal!\n\"); } и нажать %, то курс ор перепрыгн ет на скобку в конц е этой строки. Это закрыв ающ ая скобка, соо тв етс твующая отк рывающ ей, на которой сто ял курс ор. Аналогично, есл и курс ор стоит на одном из симв олов зак рывающ их скоб ок, то наж ат ие % перем естит его наз ад на соотв етс тв ующую откры вающую скобку. Наприм ер, поставьт е курсор на зак рывающую скобк у после строк и с printf и нажмит е %. vi достаточн о умен и может сам найт и симв ол скобк и. Есл и курсор сто ит не на симв оле скобк и, то при вводе % ред акт ор буд ет искать впер ед по тек ущей строк е до перв ого попавшегося символа отк рыв ающей или за крывающ ей скобки и пер ем естит курс ор на соо тветствующую ей скоб ку! Наприм ер, есл и в пред ыд ущем примере курсор в первой строке сто ит на символе >, то % отыщет открыв ающую круглую скобк у и пер емес тит курс ор на закрывающую. Симв ол поиска % позволяе т не только быс тр о пер ем ещаться вперед и на зад по программ е, но и пров ерять вложенн ость скобок в прог раммн ом код е. Нап рим ер, есл и постав ить курсор на перв ую { в начал е функции C, то ввод % пер емест ит курсор на ту }, котор ая, по идее, зав ершае т функц ию. Есл и это не так, значит, где-то содерж ится ошибк а. Ког да со отв етств ующ ая } не найден а, vi выдаст звуковой сигнал. 1 Из всех протестир ованных версий соотв етс тв ие < и > при исп ольз ов ании % наб люд ал ось тольк о в nvi. В vile (и Vim. – Прим. науч. ред.) можн о зад ать опц ию, где опред еляе тся, как ие пар ы символов будут соо тв етствов ать друг друг у при нажат ии %.
Редактирование исходного кода программы 147 Друг ой способ иск ать скобк и, соо тветств ующ ие друг дружке, сос тои т во включен ии след ующей опц ии: :set showmatch Включ ен ие showmatch (или ее аббрев иатуры sm) отл ичае тс я от % тем, что раб отае т в реж име вставки. При вводе ) или }1 курсор на коротк ое вре мя пер емест ится на соотв етс твующую ( или {, а затем вернетс я на ис ходн ую позиц ию. Если соответств ие не будет найд ено, вы усл ыш ит е звук ов ой сигнал. Если соотв етствующая скобк а не поп адает на теку щий экр ан, vi прод олжит раб оту без звуков ых оповещ ений. Vim 7.0 и его бол ее поздн ие версии могут подс веч ив ать соо тв етс твующие друг другу скобки, используя загруж аемый по умолч анию плагин matchparen.Использование тегов Обычно исходный код больш их программ на C или C++ разбит на не скольк о файл ов. Иногда очень сложно отс лед ить, какой из них сод ер жит опис ан ие нужн ой функц ии. Чтоб ы упр ос тить дел о, ком анд а UNIX ctags может исп ользов аться совместно с командой :tag из vi. UNIX-верс ии ctags подд ержив ают язык и C и, чащ е всего, Pascal и Fortran 77. Иног да они даж е подд ерж иваю т язык ассемблер а. C++, как прав ило, не поддерживаетс я. Доступн ы другие версии, которые мог ут выр абат ыв ать файл ы tags для C++ и друг их язык ов и тип ов файлов. За более подр обной информ ацие й обр ат ит есь к разд елу «Улучш енные теги» на стр. 154. Сначал а нужн о выз вать ком анд у ctags в командн ой строке UNIX. Ее цель – созд ать инф ормацио нн ый файл, который в дальнейшем будет использ ов атьс я в vi для определения, в каком файл е как ие функции со держатс я. По умолчан ию этот файл называе тс я tags. В vi команд а сле дующег о вида: :!ctags file.c создаст в тек ущем кат алоге файл с имен ем tags, содержащ ий информ а цию о функц иях, опред еленных в file.c. Следующ ая команд а :!ctags *.c созд аст файл tags, описыв ающий все файлы исходного код а C в тек у щем кат алог е. Теперь предп оложим, что файл tags содерж ит инф ормац ию обо всех файл ах исходного код а, из котор ых соб р ана программ а на C. Также до пуст им, что нужн о найти и отр едактиров ать функцию из этой програм мы, но вы не знаете, где расп ол агае тс я эта функция. Ком анд а в vi: :tag name 1 В elvis, Vim и vile showmatch также пок аз ывае т соо тв етс твие для квадр ат ных скоб ок [ и ].
148 Глава 7. Продвинутое редактирование ищет в файле tags файл, сод ержащий опр едел ение функц ии name. За тем эта ком анда считывае т этот файл и помещае т курс ор на строк у с оп редел ен ием name. При этом необязат ельн о знать, как ой файл вы ред ак тир уете. Нужно лишь реш ить, какую функцию следуе т изм ен ить. Возможнос тями тег ов можн о пользов атьс я и в командн ом режим е vi. Пом ест ите курсор на идентифик атор, кот ор ый вы хот ите отыскать, и введ ит е ^]. vi произв едет поиск по тег ам и пер ем ест ит вас в файл, где этот идентиф ик ат ор опр ед ел ен. Будьте остор ожны с положен ием курсо- ра – vi считает «слов ом» то, что начин ается с текущ ей поз иц ии курс о ра, а не все слов о, где стоит курс ор. Если вы пыт ает есь исп ользов ать ком анд у :tag для считыв ания фай ла, но не сохран ил и текущ ий файл со врем ени его пос ледн ег о изм е нен ия, vi не позвол ит перейт и на нов ый файл. Нужно либо сох ра нить тек ущ ий файл ком анд ой :w и тольк о после этог о вызвать :tag, либ о вып олнить следующую команду: :tag! name кот ор ая пересил ит неж елание vi отбрасывать измен ен ия. Верс ия vi для Solaris тож е поддерж ивает стеки тег ов, одн ако эта воз можн ость не отражена в док ументации к Solaris. Поскольк у мног ие, ес ли не больш инс тво, версии vi не подд ержив аю т стек и тегов, мы пер е мест или обс уж ден ие этой функц ии в раздел «Стек и тег ов» на стр. 157, где подр обн ее познакомим вас с ним и.
8 Представляем клоны vi Глава 8.Знакомьтесь: Даррелл, Даррелл и ДарреллСущ ес твует нес кольк о свободн о распростран яем ых модифик ац ий редактор а vi. Прилож ение D дае т ссылку на веб-сайт, где пер ечисл ены всеего известн ые разнов идн ости, а в част и II подробно расс казываетс яо Vim. Часть III касае тся трех других поп ул ярн ых мод ифик ац ий vi:• nvi версия 1.79 Кейта Бост ича (Keith Bostic) (глава 16)• elvis верс ия 2.2.0 Стив а Кирк ендалл а (Steve Kirkendall) (глава 17)• vile верс ия 9.6.4 Кевин а Буттн ер а (Kevin Buettner), Тома Дик и (Tom Dic key), Пол а Фокса (Paul Fox) и Кларк а Морган а (Clark Morgan) (глав а 18)Все они были написан ы либ о из-за огр анич ений на своб одн ое расп рос транение исходн ог о кода vi, что дел ало нев озможным перен ос ред акторав не-UNIX окруж ение и изучение его код а, либо из-за тог о, что vi (илидругой клон!) для UNIX не имел треб уемой функциональн ос ти. Нап ример, vi для UNIX част о имеет пред ел макс им альной длины строк ии в нем нельзя редакт иров ать бин арн ые файл ы. (Глав ы, посвященныесоо тветс твующ им программ ам, расс каж ут больше об их ист ории.)В кажд ой программе есть множ ес тво расширений по сравнению с vi дляUNIX. Зач астую одн и и те же доп олн ен ия, возм ожн о, реал из ов анныепо-разному, есть у нес кольких мод иф ик аций. Чтоб ы не повторять в каждой главе описание одн ой и той же общей для всех прог рамм функции,мы вывел и их обс ужд ен ие сюд а. Может е рассматрив ать эту главу какрассказ о функцион альн ости мод ификац ий редакт ора. При этом глава,пос вященн ая кажд ом у клон у, рассказыв ае т, как они работаю т.Темы этой глав ы представл ен ы дал ее в том же пор ядке, но бол ее подробн о в части II, посвящ енн ой Vim, и горазд о бол ее компактно – в главах част и III. В данн ой главе мы расс мотрим следующие тем ы:
150 Глава 8. Представляем клоны vi Мног оо конн ое ред актиров ан ие Это возможн ость разд елить экр ан (термин ал а) на несколько «окон» и/или использ ов ать их в граф ическом окружении. При этом в окнах можно ред акт ир овать разные файл ы или держать разн ые виды одн о го файл а. Возм ожн о, это сам ое главн ое улучшен ие ориг инальн ого vi. Граф ичес кие инт ерфейс ы Все клон ы, за иск лючен ие м nvi, могут быть скомп ил иров ан ы с под держкой интерфейса X Window. Если в вашей сист еме работае т X, то использован ие GUI-версии мож ет быть предп очтительнее разд ел е ния экр ан а xterm (или друг ого эмул ятор а терм ин ал а). Как правил о, GUI-версии обесп еч ен ы и другим и пол езн ым и функц иям и, так им и как пол ос ы прокрутк и и разн ые шрифты. Такж е мог ут поддерж и ваться GUI из других опер ац ионн ых систем. Расш иренн ые регул ярные выраж ен ия Все мод иф икац ии vi позвол яю т иск ать текст при пом ощ и рег ул яр ных выр аж ений, кот орые пох ожи или совп адаю т с используемым и в команде egrep UNIX. Улучшенн ые тег и Как уже описыв алось в разд ел е «Исп ольз ов ан ие тег ов» на стр. 147, при построении базы данн ых для пои ск а в файл ах можн о использо вать программу ctags. Модиф икации vi также поз вол яют созд ав ать «стек и тег ов» (tag stack), пос лед оват ельн о сох ран яя ваше текущее мес тополож ение во время пои ска по тегам. Впоследс твии можн о вер нуться к сох ран енн ом у месту. Пос ледов ат ельн ость местопол ожений сохран яе тс я в порядке «перв ым пришел, пос ледним ушел» (LIFO), форм ир уя стек пол ож ен ий. Некотор ые автор ы мод ификаций vi и авт ор по крайней мер е одн ой разн овидн ос ти ctags приш ли к сог лашению, определяющ ему стан дартн ую форму улучш енн ой версии формат а ctags. В час тн ос ти, сей час проще использ овать функц иональн ость тегов в программ ах, на пис анн ых на C++, где разр ешена перег рузка имен функций. Улучшенн ые возможности ред актирования Во всех мод иф ик ациях vi есть возм ожность редактир ован ия команд ной строки ex, функция «беск он ечн ой отм ены», строк и прои зв оль ной длин ы и сод ержимого (подд ержка люб ых 8-разрядных симв о лов), инк рем ентный пои ск, опц ия прок рутк и экрана слева нап раво вмес то пер енос а при чтении длинн ых строк, индик ат оры реж има и друг ие функции. Пом ощь программисту Некоторые редакторы предост авляют возм ожн ость не выходить из прог рамм ы при вып олнен ии тип ичн ого цикла разр аботк и ПО «ре дакт ирование-компил яц ия-отл адк а».
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 512
Pages: