Настройка полос прокрутки, меню и панелей инструментов 257 часто используют такие окна, но они пол езны даже для опытных поль зователей Vim. Особенно хор оша их спос обн ость взаим одейств овать с буфером обмен а Windows предс казуем ым обр азом.Настройка полос прокрутки, менюи панелей инструментов В gvim прис утс твуют обычные виджеты GUI, так ие как пол ос ы про крутки, мен ю и панел и инструмент ов. Как и в большинс тве сов рем ен ных графических прил ож ений, эти виджеты можно настраив ать. По умолчанию окно gvim содержит нес кольк о меню и панель инстр у мент ов нав ерху (рис. 13.5). Рис. 13.5. Верхн яя часть окн а gvimПолосы прокрутки Полос ы прокрутк и, поз вол яющ ие быс тр о пер ем ещаться по файл у вверх и вниз либ о влево и вправо, не явл яются обяз ат ельными. Их можно отоб ражать или скрыв ать с пом ощ ью опции guioptions, как опис ан о в конц е этой глав ы в разд еле «Опции GUI и обзор ком анд» на стр. 269. Поскольку стандартным действ ием в Vim являе тс я показ всего текста в файл е (с пер еносом строк в окне при необх одим ос ти), следуе т зам е тить, что в нас трое нн ом обычн ым обр аз ом сеанс е gvim гор изонтальн ая пол оса прокрутки совершенн о беспол езн а. Левая и прав ая пол ос ы прокрутки включаю тся/выключаются пут ем включен ия/вык лючения флаг ов r или l в опции guioptions. l гар антир у ет, что левая пол оса всег да вид им а, а r – что всегда видна правая пол ос а прок рутки. Проп исные вариа нт ы L и R указ ываю т ред акт ору пок аз ывать лев ую или правую пол ос ы, тольк о ког да окн о раздел ено верт икально. Горизонтальная полос а прокрутки управл яетс я включение м/иск люче ние м b из опц ии guioptions. Ну и, конечн о, можн о прок руч ив ать прав ую и левую пол осы одновре менно! Точн ее, прокрутк а любой из них прив од ит к тому, что и другая перемещае тс я в том же нап равл ении. Держать пол осы прок рутки на обеих стор он ах окн а очень удобн о. В зав исимос ти от того, где нах од итс я указ ат ель мыши, вы прос то щелкаете и перет аскив аете ближ айш ую полосу прокрутки.
258 Глава 13. Графический Vim (gvim) Многие опции, включ ая guioptions, зад аю т много пар ам етр ов, по этому по умолчан ию они могут включать множеств о флагов. Буд у щие версии gvim могут добав ить свои, нов ые флаг и. След овательно, в команд е :set guioptions важно использ ов ать синтакс ис += и -=, да бы избежать удаления нужных устан овок. Например, :set guiopti ons+=l доб ав ит в gvim опцию «пол ос а прок рутки всегда слева» и оста вит остальн ые компон енты строк и guioptions нетронутым и.Меню Меню gvim полн остью настраиваем ое. В этом разд ел е мы рассмотр им ха рактеристик и мен ю по умолч анию, пок аз анн ого на рис. 13.5, и пок а жем спос об управл ения его форм ат ом. На рис. 13.6 показан прим ер использ ов ан ия мен ю. Здесь мы выбрали пункт Global Settings из мен ю Edit. Рис. 13.6. Расп олож ен ие меню Edit каскадом
Настройка полос прокрутки, меню и панелей инструментов 259Инт ер есн о зам ет ить, что эти опции мен ю служат просто обертками дляком анд Vim. Фактич ески вы сам и может е создав ать и нас траив атьпункты мен ю. Вскоре мы расс кажем об этом. Зам ет им, что если обращ ать вним ан ие на мен ю, содерж ащее справа сочетания клав иш и ком анды, то можн о со временем выучить ко манды Vim. Наприм ер, из рис. 13.6 видн о, что хоть для новичк а удобно найти знаком ую ком анду отмен ы Undo в мен ю Edit – там же, где она наход ится и в других попул ярных программах, – но горазд о быс трее будет использов ать клавишу u, указанную в мен ю.Как видно из рис. 13.6, вверх у кажд ог о меню наход итс я пункт ирнаялин ии, сод ерж ащ ая пиктограмму ножн иц. Щелч ок по этой линии «отрез ает» меню, после чего поя вляется своб одн о плавающ ее окно, в котором доступны все пункт ы подмен ю без обращения к строк е мен ю. Есл ищелкнуть по пункт ирн ой линии над пунктом меню Toggle Pattern Highlight, пок азанном на рис. 13.6, то вы увид ит е что-то напод обие рис. 13.7.Плавающ ее окн о можн о поместить в любое мес то раб оч ег о стола.Все ком анды этог о подменю стан овятся мгновенно дост упн ыми по одном у щелчк у мыш ью по окн у этого подмен ю. Кажд ом у пункт у мен юназначена клавиш а. Если пункт мен ю являе тс я подм ен ю, то он представл ен как кнопка со знаком «больш е» (кот орый выгляд ят как стрелка вправо) в правой части кнопк и. Нажат ие этой кнопки раск рыв аетподмен ю.Рис. 13.7. Отр ыв ан ие меню
260 Глава 13. Графический Vim (gvim) Основная настройка меню gvim сох ран яе т опр ед елен ия меню в файле с именем $VIMRUNTIME/menu.vim. Опр едел ение пункт ов мен ю очень пох ож е на отоб раж ен ие клав иш. Как был о видно в разделе «Использ ов ан ие ком анды отображ ения map» на стр. 126, клавиш а мож ет отоб ражаться как: :map <F12> :set syntax=html<CR> Мен ю орган из уе тс я сходн ым образом. Предп ол ожим, что вмес то назначен ия уст ановки синт аксиса html кла виш е F12 нам для этой зад ач и нуж ен спец иа льный пункт «HTML» в ме ню File. Воспользуемся командой :amenu: :amenu File.HTML :set syntax=html<CR> Четыре симв ол а <CR> след ует вводить как пок аз ано, так как это часть команды. Теперь пос мотрим на меню File. Мы увид им нов ый пункт HTML, как пок аз ано на рис. 13.8. Исп ользование amenu вмес то menu гарантирует, что этот пункт буд ет дост уп ен во всех режим ах (ком андном, реж име встав ки и норм альном реж им е). Рис. 13.8. Пункт меню HTML в мен ю File Команд а menu доб авл яе т пункт в мен ю тольк о для командн ого режи ма. В норм альном реж име и режим е вставки он доступен не буд ет.
Настройка полос прокрутки, меню и панелей инструментов 261Распол ожен ие пункт а меню зад аетс я ряд ом его многоуровн ев ых элемент ов, раздел енных точк ам и (.). В наш ем пример е File.HTML добавл яе тпункт «HTML» в мен ю File. Пос ледн ий элемент в этом ряду – тот, кот орый вы хот ите добавить. Мы добавл яли элем ент ы к сущес тв ующ ем уменю, но вскоре будет видно, что создание целого каск адн ого ряд а новых мен ю нич уть не сложн ее.Провер им раб от оспос обн ость нов ог о пункт а мен ю. Доп уст им, мы начали редакт иров ать файл, распознанный Vim как файл XML, как можн оузнать из строк и состоян ия на рис. 13.9. Мы нас троил и ее так, чтоб ыVim и gvim отображали текущий синтакс ис в ее самой правой части (см.подразд ел «Инт ер есный трюк» на стр. 232).После выз ова нов ого пункта мен ю HTML строк а состоян ия Vim подтверж дае т, что этот пункт сраб от ал, так что теп ерь уст ановл ен синтаксис HTML (рис. 13.10).Рис. 13.9. Строка состояния, пок аз ыв ающ ая устан овл енныйсинтаксис XML пер ед действие м нового пункт а мен юРис. 13.10. Строка сос тояния, пок азывающ ая синт акс ис HTMLпосле дейс тв ия новог о пункта менюОбр атит е вним ан ие, что добавл енный пункт меню HTML не имеет сокращ ения или ком анд ы справ а от него. Сейч ас мы перед ел ае м это так,чтоб ы этот пункт сод ержал подобное дополнен ие.Во-перв ых, удал ит е сущ ествующий пункт: :aunmenu File.HTML Если вы добавляли пункт для командн ого реж им а, то есть пользо вались ком анд ой menu, то его можно удал ить с помощ ью unmenu.После этог о доб ав им новый пункт мен ю HTML, отоб ражающий ком анду, связ анную с этим пунктом: :amenu File.HTML<TAB>syntax=html<CR> :set syntax=html<CR>
262 Глава 13. Графический Vim (gvim) Теп ерь, после спец иф икации пункта меню, след ует <TAB> (набирать надо бук вальн о это) и syntax=html<CR>. Вообще говоря, чтоб ы отобраз ить текст справа от пункта меню, поместите его после строки <TAB> и закончите ввод соч етан ием <CR>. Получ енное в рез ульт ат е меню File пок аз ан о на рис. 13.11. Рис. 13.11. Пункт меню HTML, в кот ор ом отоб ражена соотв етствующ ая команд а Есл и вам нужны проб елы в тексте опис ания пункт а меню (или в на зван ии меню), их нужно предв арять обратной кос ой черт ой (\), ина че Vim восприм ет все, что стои т пос ле первог о проб ела, как опр ед е лен ие дейс тв ия мен ю. В пред ыд ущ ем прим ер е, если бы мы зах от ели в кач естве текста опис ан ия иметь :set syntax=html вместо простог о syntax=html, то команд а :amenu имел а бы следующий вид: :amenu File.HTML<TAB>set\ syntax=html<CR> :set syntax=html<CR> В большинстве случаев лучше не менять определ ен ия имеющ ихс я пунк тов мен ю, а вмес то этог о создавать отдельные нез авис им ые элемент ы. Это требуе т определен ия новог о меню в корневом уровне, но подобное действие не сложн ее, чем добавл ение пункт а к сущес тв ующ ему мен ю. Прод олжая наш пример, создад им нов ое меню под наз ван ие м MyMenu и до бавим в него пункт HTML. Для нач ала удал им пункт HTML из мен ю File: :aunmenu File.HTML Зат ем введ ем команду: :amenu MyMenu.HTML<TAB>syntax=html :set syntax=html<CR>
Настройка полос прокрутки, меню и панелей инструментов 263Рисунок 13.12 пок азывае т, как буд ет выглядеть строка меню после выполн ения этой ком анды.Рис. 13.12. Строк а меню с добавленн ым пунктом MyMenuКом анды мен ю пред оставляют искусный контроль над распол ож ен ие ммен ю и их пов ед ением, наприм ер они след ят за тем, указывают ли команды на действ ие. Можно также управлять вид им остью меню. В следующ ем разд ел е мы расс мотрим эти возм ожнос ти.Дальнейшая настройка менюТеперь, когда мы знаем спос обы прос тог о изм ен ения и расширения меню gvim, рассмотрим друг ие прим еры настройки и управл ения.В пред ыдущем прим ере мы не указ ал и, где именно нужн о разместитьнов ый пункт MyMenu, поэтом у gvim сам пом ест ил его межд у пунктам иWindow и Help. gvim поз воляе т зад авать позиц ию с пом ощ ью такого понят ия, как приоритет, который являе тс я прос то числом, присвое нным кажд ому пункт у мен ю и опр ед ел яющ им зан им аем ое этим пунктом мес то в строке меню. К сожал ен ию, многие пользов ат ел и рассматриваю т прио ритет сов ершенно не так, как опр едел ен о в gvim. Чтобы понять его суть, взглян ите снов а на пор ядок след ован ия пунктов мен ю нарис. 13.5 и сравнит е с прио ритетом пунктов меню gvim, уст ановл еннымпо умолч ан ию и прив ед енным в табл. 13.1.Табл иц а 13.1. Приоритеты меню, стоящие в gvim по умолч аниюМен ю Прио рит етFile 10Edit 20Tools 40Syntax 50Buffers 60Window 70Help 9999Многие пользоват ели считают, что File имеет бол ее высокий приорит ет,чем Help (из-за чего File располож ен лев ее Help), но на сам ом деле приоритет Help выш е. Так что рассматрив айте знач ен ие прио рит ет а какуказан ие, насколько прав ее буд ет расп оложен этот пункт мен ю.
264 Глава 13. Графический Vim (gvim) Прио рит ет мен ю можн о опр едел ить, если припис ать его чис ловое знач е ние к команд е menu. Если знач ение не устан овлен о, приоритету присваи вае тс я значение, равн ое 500. Именн о поэ том у MyMenu в прош лом при мер е оказал ось между Window (приорит ет 70) и Help (приорит ет 9999). Предполож им, что нужн о помест ить новый пункт меню межд у File и Edit. MyMenu след уе т присвоить приоритет больш е 10, но меньше 20. Следующ ая команд а устан овит значение прио ритета равным 15, после чег о будет достигнут нужн ый эфф ект: :15amenu MyMenu.HTML<TAB>syntax=html :set syntax=html<CR> Коль скоро мен ю появилось, его полож ен ие заф иксировано для все го сеа нса редакт иров ания и не мен яе тся в результ ат е действ ия дру гих команд, зат раг ивающ их это меню. Нап ример, есл и вы доб ав ит е новый пункт, прип ис ав к команде преф икс, уст анавливающ ий но вый прио рит ет, то пол ожен ие мен ю от этого не измен ится. Чтоб ы внес ти еще больше нер азб ерих и в приоритет ы и поз иции меню, доб ав им, что полож ен ие пункт ов мен ю внутри мен ю тоже можно зад а вать с пом ощью прио ритета. Пункты мен ю с бол ее выс ок им приорите том расп олаг аются ниж е, чем пункты с меньш им прио ритет ом, но син такс ис для пунктов меню отл ичае тся от исп ользуемого при опред еле нии места мен ю. Расшир им один из наш их старых пример ов, прис вои в очень большой прио ритет (9999) для пункта меню HTML, чтобы он появился в сам ом низ у мен ю File: :amenu File.HTML .9999 <TAB>syntax=html<CR> :set syntax=html<CR> Зачем нужна точка перед 9999? Здесь нужно указ ать два прио рит ет а, отдел енн ых друг от друга точками: один – для File, а другой – для HTML. Прио рит ет для File мы ост ав им пустым, пос кольк у это меню уже существуе т и его приоритет нельзя изм енить. Воо бще гов ор я, приоритеты для пункт ов мен ю расп ол ож ен ы между на зван ие м мен ю для этого пункта и опред ел ен ием пункт а. Для каждог о уровн я в иерарх ии мен ю следуе т указ ать приорит ет или пос тавить точ ку, указывая этим, что он ост аетс я без измен ения. Так им обр аз ом, если вы доб авляет е пункт, расп ол ож енн ый глуб око в иер архии мен ю, нап ри мер Edit→Global Settings→Context lines→Display, и хот ите прис вои ть пос леднему пункт у (Display) прио рит ет 30, то его нужно указать как ...30. Размещ ение с приорит ет ом выг лядит так: Edit.Global\ Settings.Context\ lines.Display ...30 Как и в случ ае с приоритетами мен ю, приоритеты пункт ов меню стано вятс я фикс ир ованн ым и после их задания. Након ец, вы может е управлять «пром ежутк ами» в меню с помощью раздел ител ей мен ю в gvim. Использ уйте те же опред ел ения, что и для
Настройка полос прокрутки, меню и панелей инструментов 265добавления обычног о пункта меню, но вместо названия команды «...»пос тавьте минус (-) до и после нег о1.Соберем все вместеТеп ерь мы знаем, как создав ать, пом ещ ать и настраивать меню. Сделаем наш пример пос тоя нн ой час тью окруж ен ия gvim, пом естив расс мотренные ком анды в файл .gvimrc. Пос ледоват ельность строк должн а выглядеть прим ерно так: \" add HTML menu between File and Edit menus 15amenu MyMenu.XML<TAB>syntax=xml :set syntax=xml<CR> amenu .600 MyMenu.-Sep- : amenu .650 MyMenu.HTML<TAB>syntax=html :set syntax=html<CR> amenu .700 MyMenu.XHTML<TAB>syntax=xhtml :set syntax=xhtml<CR>Теперь у нас есть высокок лассн ое собс тв енное меню, дающее быс тр ыйдоступ к трем част о исп ольз уем ым команд ам. В этом примере нужн оотметить нес колько важных момент ов:• Первая ком анда () исп ольз уе т префикс 15, предлагая gvim приме- нять приоритет, равный 15. Для нен ас трое нного окр уж ен ия этот префикс пом естит меню межд у меню File и Edit.• Послед ующ ие команды (, и ) не опр ед ел яют прио ритет, по скольку буд уч и един ожды заданн ым, он не может приним ать дру гие знач ен ия.• После перв ой ком анд ы мы исп ольз ов ал и синт акс ис прио ритета под мен ю (, и ), чтобы удостовериться в прав ильн ом порядк е кажд о го нов ог о пункт а. Обр ат ит е вним ан ие, что первое опр едел ен ие нач и наетс я с .600. Это гар ант ирует, что пункт меню помещ ается пос ле первого определенного нам и пункта, так как мы не зад ав ал и его прио ритет, а присвоили значен ие по умолч анию, равн ое 500.Для более удобного доступ а щелкнит е по лин ии «с ножн иц ами», чтобыпоя вил ось собств енное плавающ ее мен ю, как показ ано на рис. 13.13.Рис. 13.13. Польз оват ельс кое плавающее «отор ванное» мен ю1 Пример из встрое нной справки Vim: :menu Example.-Sep- :. – Прим. науч. ред.
266 Глава 13. Графический Vim (gvim)Панели инструментов Пан ели инструментов – это длинн ые полосы значков для быстрого дос тупа к функц ия м программ ы. Например, в Windows пан ель инс тру ментов gvim расп ол ож ена вверху окна. В табл. 13.2 показ ан ы значки пан ел и инструм ент ов и их значения. Табл ица 13.2. Значки панел и инс тр ум ентов gvim и их знач ения Значок Описание Значок Опис ан ие Диал ог открыт ия файл а Найти след ующее вхожден ие шабл она поиска Сохран ить текущ ий файл Найт и предыдущее вхожд е ние шаблон а поиска Сохранить все файлы Загрузить ранее сох ран ен ный сеа нс Расп еч ат ать буфер Сох ран ить текущ ий сеанс ред акт ир ов ания Отм ен ить пос леднюю Выб рать скрипт Vim для за ком анду пуска Занов о вып олн ить послед Соб рать текущий проект ко нее дейс твие манд ой make Выр езать выдел енную Сген ер иров ать тег и для тек у часть текс та в буф ер обм ен а щего дер ева кат ал огов Скопировать выд елен ие Пер ейти на тег под курсор ом в буфер обм ен а Встав ить буфер обмен а Открыть справк у в буф ер Найти и зам енить Поиск в справк е Есл и эти значки вам не знак омы или не понятн ы, можно отобразить в пан ел и инс тр ум ентов как значки, так и текст. Выз овите ком анду: :set toolbar=\"text,icons\" Как принят о во мног их прод винутых функция х, Vim требуе т нал и чия включ енной пан ел и инс трумент ов на этап е компил яц ии, чтоб ы в случае отсутс тв ия необх од имости ее можно было вык люч ить, сэко номив память. Панель инс трум ентов не появится, пока в gvim не бу дет включ ен а одн а из следующих опц ий: +GUI_GTK, +GUI_Athena, +GUI_ Motif или +GUI_Photon. В главе 9 рассказ ан о, как перек омпилир ов ать Vim и в результат е созд ать ссылк у на исполн яем ый файл gvim. Изменение пан ели инстр умент ов очень похоже на изменен ие меню. В сущнос ти, для этого исп ользуется та же самая ком анд а :menu, но с рас ширенным синт аксисом для опред елен ия график и. Хот я есть алго
Настройка полос прокрутки, меню и панелей инструментов 267ритм, помогающий gvim нах од ить связанн ый с каждой ком анд ой значок, мы реком енд уе м указать его явно.gvim расс матр ивает пан ель инструмент ов как одн омерн ое меню. Крометого, анал ог ично управлению пол ож ение м нового меню отн осительноимеющихс я пунктов, можно управлять полож ен ием кнопок на пан елиинструм ент ов, прип исыв ая к ком анд е menu число, опр едел яющ ее приорит ет поз иции. В отл ич ие от мен ю, новую панель инс трумент ов создать нельз я. Все опр едел ен ия нов ых пункт ов пан ел и инс тр ум ентов появл яю тс я на одн ой пан ел и. Синтаксис доб авл ения новой кнопки на панель инстр умент ов следующий: :amenu icon=/some/icon/image.bmp ToolBar.NewToolBarSelection Actionгде /some/icon/image.bmp – путь к файл у, содержащему кнопк у пан елиили рис ун ок (обычно это знач ок), кот ор ый буд ет отоб ражатьс я на панели, NewToolBarSelection – нов ый пункт для кнопки пан ели инструм ентов, а Action зад ает действие, вып олняем ое при наж атии кнопк и.Например, опр еделим новый элемент панели инструм ент ов, кот ор ыйпри наж ат ии или выдел ении выв од ит окно DOS в Windows. Полагая,что пер еменная PATH в Windows зад ан а правильно (так и должно быть),опр ед ел им элем ент для запуска окн а DOS из gvim, выполняя следующую ком анд у (т. е. то, что обозначено как Action): :!cmdДля кнопк и нов ог о элемент а или изоб ражения мы используем знач ок,сод ерж ащийс я в нашей системе в $HOME/dos.bmp и пок азывающ ий приглаш ен ие ком андн ой строки DOS, как видно на рис. 13.14.Рис. 13.14. Знач ок DOSВыполн ит е команд у: :amenu icon=\"c:$HOME/dos.bmp\" ToolBar.DOSWindow :!cmd<CR>Она создаст пункт панели инс трум ент ов и добав ит наш значок в ее конец. Пан ель инс трумент ов должна приобрес ти вид, как на рис. 13.15.Новый знач ок поя вится крайним справа.Рис. 13.15. Пан ель с доб авленной ком андой DOS
268 Глава 13. Графический Vim (gvim)Всплывающие подсказки gvim поз вол яет опр еделить всплывающ ие подсказк и как для пунктов меню, так и для значк ов пан ел и инструм ентов. Подсказки для пункт ов мен ю поя вл яю тс я в област и командной строк и редактор а при выдел е нии пункт а мен ю мыш ью. Всплывающ ие подсказк и для панели инст рументов отоб ражаются при нах ож ден ии указат ел я мыши над значк ом панел и. Нап рим ер, на рис. 13.16 показ ано, как подс казка всплывае т при навед ен ии мыш и на кнопк у Find Previous в пан ел и инс трументов. Рис. 13.16. Всплывающ ая подс казк а для значка Find Previous Команд а :tmenu опр ед еляет всплыв ающие подс казки как для меню, так и для пан ели инс тр ум ентов. Она имеет следующ ий синт акс ис: :tmenu TopMenu.NextLevelMenu.MenuItem tool tip text где TopMenu.NextLevelMenu.MenuItem определ яет меню каскад ом от верхнег о уровн я до пункта меню, для кот орого зад аетс я всплыв ающая подсказк а. Наприм ер, для пункта Open из мен ю File она буд ет опр ед е лятьс я командой: :tmenu File.Open Open a file При опр ед ел ен ии пункт а панели инс тр ументов используйте ToolBar в ка честв е «мен ю» сам ого выс оког о уровн я (для панели инструментов ре ального мен ю верхнего уровня не сущес твуе т). Опред ел им всплыв ающую подс казк у для значка пан ел и инструм ентов DOS из пред ыд ущего раздел а. Введ ите ком анд у: :tmenu ToolBar.DOSWindow Open up a DOS window Теперь всякий раз при удерж ан ии мыш и над недавно созд анн ой кно почк ой вы увид ит е всплывающую подсказку, как пок азан о на рис. 13.17. Рис. 13.17. Панель с нов ой команд ой DOS и нов ая всплывающ ая подсказка
gvim в Microsoft Windows 269gvim в Microsoft Windows Ред актор gvim станов ится все бол ее попул ярн ым сред и пользоват ел ей Windows. Старожил ы vi и Vim увид ят, что верс ия для Windows прев ос ходна. Кроме тог о, она, скорее всего, явл яетс я сам ой свежей для всех операц ио нн ых систем. Программ а-устан овщ ик авт омат ич ески и аккур атн о инт егрирует Vim в окр уж ение Windows. Есл и нет, обрат итесь за справк ой к фай лу gui-w32.txt в каталоге с исп олняем ым файл ом Vim, где пропис а ны инструкц ии для прог рамм ы regedit. Поскольк у это требуе т ре дактир ования реес тр а Windows, не стоит этого дел ать, если при этом вы чувствуете малейший дискомф орт. Лучше обрат ит есь за по мощ ью к бол ее компет ентн ом у в данн ом воп росе польз овател ю. Это обычная, но нетрив иальная проц ед ура. Пользователи Windows со стаж ем знакомы с буф ером обм ена – обл астью пам яти, где сод ерж ится текст и другая информац ия, которую можно ис пользов ать при опер ация х копир ования, вырезания и вставки. Vim под держ ивае т взаим од ейств ие с буф ером Windows. Просто выд елите текст в виз уа льном реж им е и выб ер ите пункт меню Copy или Cut, после чег о текст из Vim буд ет пер енес ен в буфер обмен а Windows. Пос ле этого вы смож ет е встав ить его в другие приложения Windows.gvim в X Window System Пользоват ели, знаком ые с окр уж ением X, мог ут опред елять и исполь зовать многие легко нас траив аем ые функц ии X. Наприм ер, можно за давать ресурсы при пом ощи станд артн ых опред ел ений класса, обычно содержащихся в файле .Xdefaults. Обр ат ите внимание, что эти станд артные ресурс ы X будут полезн ы ми тольк о для GUI-верс ий Motif или Athena. Очевидн о, верс ия Win dows не поймет ресурсы X. Менее очевидно, что они не восприн има ютс я ни в KDE, ни в GNOME. Полное описание X, а такж е проц есса его конфиг ур ац ии и настройки скрупул езн о зад ок умент иров ано и не рассматр ив ае тс я в этой книге. Для краткого (или не очень краткого) введен ия в X мы реком ендуе м со ответствующее руковод ство (man).Опции GUI и обзор команд В табл. 13.3 соб ран ы команды и опц ии, спец иа льн о предназ наченные для gvim. Они доб авл яю тся в Vim, скомп илиров анн ый с поддержкой GUI, и становятся дейс тв енными, если выз вать редакт ор ком анд ой gvim или vim -g.
270 Глава 13. Графический Vim (gvim) Таблица 13.3. Опц ии, спец ифич ес кие для gvim Команда или опц ия Тип Опис ание guicursor опция guifont Настройк и форм ы и мерцан ия кур guifontset опц ия сора guifontwide guiheadroom опция Имен а исп ользуемых однобайтовых guioptions шрифтов guipty опция guitablabel Имена используем ых многобайто guitabtooltip опц ия вых шрифтов toolbar -g опц ия Спис ок имен шрифт ов для символ ов -U gvimrc двойн ой ширин ы опц ия :gui Колич ес тв о пикс ел ов, оставл енных :gui filename... опция для оконн ых рам ок :menu :menu menupath опц ия Узн ать, как ие опц ии и комп оненты :menu menupath action исп ользуютс я :menu n menupath action опция Использ ов ать псевд отерм инал для ключ команд команды «:!» ной строк и ключ ком анд Польз оват ельс кая метка для кореш ной строки ков вкладок команд а Польз ов ательская всплывающ ая подс казк а для кор ешков вкладок команд а Пункт ы, отображаемые в панели команда инстр ум ентов команд а Запуск GUI (также допускае т и дру ком анд а гие опц ии) команд а Исп ользовать при зап уске GUI файл инициализ ации gvimrc либо файл с пох ожим именем Зап уск GUI (только в UNIX-под об ных систем ах) Запуск GUI вместе с ред акт ирова ние м указанных файлов Пер ечисл ить все меню Пер еч исл ить мен ю, которые нач и наютс я с menupath Добавить меню menupath, чтобы произвес ти действие action Доб авить мен ю menupath с прио ри тет ом позиц ии n
Опции GUI и обзор команд 271Ком анд а или опц ия Тип Опис ание Доб ав ить пункт пан ел и инструмен:menu ToolBar.toolbarname ком анд а тов toolbarname, чтоб ы произв ес тиaction дейс твие action Создать всплывающую подсказк у:tmenu menupath text команд а для пункта меню menupath с текс том text:unmenu menupath ком анд а Удал ить мен ю menupath
14Улучшения Vim для программистовГлава 14.Редактир ование текстов – не единств енная обл асть примен ен ия Vim.Хор ош им прог рамм истам треб ую тся мощн ые средс тва, гар антирующие эфф ект ивн ую проф ессион альную раб оту. Хорош ая программ а-редактор – тольк о начало, и одн ого его нед остат очно. Мног ие соврем енныесред ы прог рамм иров ан ия пыт аютс я обеспеч ить всестор онние реш ен ия,одн ак о в дейс тит ельности нео бх одим лишь мощн ый редактор с грам отными дополн ен иями.Инс тр умент ы прог раммир ования пред оставляют доп олнительные функции, начин ая от подсветки синтакс ис а, авт омат ич еских отс тупов, форматир ов ания, авт озав ершен ия ключ ев ых слов и т. д. до полн офункц иональн ой инт егриров анной среды разр аб отк и (IDE) с изощ ренн ой интеграц ие й, сос тавл яющей полн ую экос ис тему разр аб отки. Такие IDEмогут быть дор ог остоящ ими (нап ример, Visual Studio) или свободн о расп рос траняем ыми (Eclipse), но их треб ован ия к диск овому пространс тв уи памят и очень выс оки, они имею т крут ую кривую обучен ия и безмерные зап росы рес урсов.У прог рамм ис тов разные цели и треб ов ан ия к техн ол ог ия м. Небольшиезад ачи легко решаю тс я простыми ред актор ам и, возможн ости которыхчуть больше, чем простая правк а текста. Тяж елые, мног окомп онентн ые,мног оп латформ енные и треб ующие целог о штата программис тов зад ач ипочти наверн як а потреб ую т «тяж ел ой артиллерии», обеспечив аем ойIDE. Однак о, основыв аясь на свое м обш ирном опыт е, мног ие умудренные пользов ат ел и знают, что IDE дает едв а ли больш е, чем доп олнит ельную сложность, при этом не повыш ая вероя тн ость реш ения задач и.Vim предл аг ает прек расн ый компромисс межд у прос тым и редакт орам ии мон олитным и IDE. Некотор ые его возможности до недавн ег о временисущес твов али только в дор огих сред ах разр аботки. Он поз воляе т быстр ои просто решать зад ач и прог рамм ир ован ия без пер егрузк и и сложн ос тиобуч ения, присущих IDE.
Свертка и контуры (режим контуров) 273 Многие опц ии, функц ии и ком анды спец иально разр абот ан ы для об легчен ия раб оты программиста – от сворачив ания строк программ ы в одн у строк у до расцветки синт аксис а и авт омат ичес кого формат ир о вания. Vim обесп ечивает спец иал истов множес твом утилит, ценн ость кот ор ых постигае тс я тольк о при их использов ании. С одн ой стороны, он предост авл яет в некотором роде «мини-IDE» под название м Quickfix, а с другой – сод ерж ит удобн ые функц ии для разноо бр азных зад ач про грамм иров ания. В этой глав е мы предс тавим след ующ ие темы: • Свертка • Автоматич ес кие и умн ые отс туп ы • Автозавершение ключ ев ых слов и слов из словар я • Тег и и расш иренные теги • Подсветк а синтакс иса • Авторская (ваш а собств енная) подсветк а синт аксис а • Quickfix, «мини-IDE» в VimСвертка и контуры (режим контуров) Свертк а (fold) позволяе т опр ед ел ять, как ие част и файл а ост авлять ви димыми. Нап рим ер, в блоке код а можн о спрятать все, что нах од ится внутр и фигурн ых скобок, или скрыть все комм ент арии. Свертка – двухэ тапный процесс. Сначал а нужн о опр ед елить содерж им ое свор ачи ваем ого блок а с использ ованием одн ого из мет од ов свертки (про них мы расскаж ем позже). Зат ем при вызове ком анд ы свертки Vim пряч ет обоз нач енный текст и став ит на его место одн острочн ый зап олн итель. Рисунок 14.1 пок аз ывает, как выгляд ит свертк а в Vim. Заполнит ель свертки поз воляе т управлять строками, кот орые он скрывает.Рис. 14.1. Прим ер сверток в Vim
274 Глава 14. Улучшения Vim для программистов В этом примере строк а 11 скрыт а в двухстрочной свертке, нач иная со строки 10. Восьм ис трочн ая свертка, нач ин ающ аяся со строк и 15, скры вает строки с 16 по 22. Четырехстрочн ая свертка, нач ин ающаяс я на строке 26, скрывае т строк и с 27 по 29. Теорет ичес ки не сущ ествуе т пред ела для колич еств а создаваем ых свер ток. Вы такж е мож ете создавать вложенн ые свертк и (свертки внутр и сверт ок). Создан ие и отображение сверток в Vim управл яетс я нес кольк им и оп циями. Такж е, если вы нас озд авали множес тв о сверток, Vim пред оста вит вам ком анд ы, обл егчающ ие работ у с ним и: :mkview и :loadview. Они служат для сох ранения сверток межд у сеанс ами работы1, чтоб ы не при шлось создавать их снова. Изуч ение сверт ок треб ует некотор ого времен и, одн ако, осв оив их, вы по лучаете мощный инс тр умент управления отображ ен ием кода. Не стои т недоо цен ив ать его преимущес тва. Правильн ая и читаемая прог рамм а треб ует надежного диз айн а на нес кольк их уровнях, а хорошее про грамм ир ование част о треб уе т умен ия «увидеть лес за деревьями», дру гим и словами, игн ориров ать нек отор ые детал и реализации, чтоб ы ви деть полную структуру файла. Для опытн ых пользов ат ел ей Vim пред оставляет шесть различных спо собов определен ия, создания и управл ения свертк ами. Эта гибк ость по зволяе т создав ать свертки и управл ять ими в разл ичн ых контекс тах. Важн о то, что после создания свертк и отк рыв аю тся, закрываются и оди нак ов о реагирую т на все команд ы, входящ ие в комп лект раб оты со свертк ам и. Ниж е приведен ы шесть мет од ов созд ан ия сверток: manual Опред еляет охв ат свертки с пом ощ ью стандартн ых конс тр укций Vim, нап ример ком анд пер ем ещен ия. indent Свертки и уровн и сверток соответс тв уют уровням отступ а текс та и значен ию параметр а shiftwidth. expr Свертку опр еделяю т регулярн ые выр ажен ия. syntax Свертк и соо тв етств уют сем ант ик е языка файл а (нап ример, в про грамме на C свор ачив аю тс я блок и отд ельных функций). diff Свертки опр едел яю тся разл ич иям и между двум я файлами. 1 Свертк и также мог ут сохраняться нар яду с друг ими нас траиваемым и объ ект ам и Vim при вызове команды :mksession; см. главу 15. – Прим. нау ч. ред.
Свертка и контуры (режим контуров) 275 marker Границ ы сверт ок опр едел яю тс я пред опред еленным и (но также и оп ред ел яемым и польз ов ател ем) марк ерам и в файл е. Работа со сверткам и (открытие, закрыт ие, удаление и прочее) одинак о ва для всех методов. Мы рассмотрим ручные свертки и детальн о обсу дим ком анды Vim для работ ы со свертк ами, а также зат ронем отдель ные подр обн ос ти, относящиес я к друг им мет од ам, которые являются сложными, узкоспециа льн ыми и лежат за предел ам и наш его введен ия. Над еемс я, что наш обзор подт олкнет вас к исследован ия м бог атства ос тальных мет одов. Рассмотрим кратк о осн овн ые ком анды свертки и привед ем небольшой пример использ ов ан ия сверток на практик е.Команды свертки Все команд ы свертк и нач инаются с z. В кач естве мнем он ик и для зап о мин ан ия представьт е слож енный (соо тв етствующ им обр азом) лист бу маг и и его сходств о с букв ой «z». Существует примерн о 20 ком анд свертк и, начин ающихся с z. С их по мощью можно создавать и удалять, отк рывать и закрывать (прятать и пок аз ывать прин адлежащий свертке текст) свертк и, а также пере ключ ать их состоян ие (скрыт ая/раскрыт ая). Ниж е дан ы краткие опи сан ия этих ком анд: zA Пер ек люч ает состояние сверт ок, рекурс ивно. zC Закрыв ае т свертк и, рекурс ивн о. zD Удаляе т свертк и, рек урс ивн о. zE Удал яе т все свертки.1 zf Создае т свертк у с текущ ей строк и до той, куд а пер еместит курсор послед ующая ком анд а перем ещ ения. countzF Создае т свертку, охватывающую count строк, начиная с текущ ей. zM Устан авливает опц ию foldlevel равной нул ю.1 В отл ичие от ком анды zD, действ ующ ей на текущую (и вложенн ые в нее) свертку, zE удал яет все свертки в буф ере независим о от пол ож ения курсо ра. – Прим. науч. ред.
276 Глава 14. Улучшения Vim для программистов zN, zn Устанавл ив ает (zN) или сбрас ыв ае т (zn) опц ию foldenable. zO Раскрывае т свертк и, рекурсивн о. za Перек люч ае т сос тоян ие одн ой свертки. zc Зак рыв ает одну свертк у. zd Удал яет одн у свертк у. zi Перек люч ае т значен ие опц ии foldenable. zj, zk Перем ещае т курсор на нач ал о следующей (zj) или на конец преды дущей (zk) свертки. (Обр ат ите вним ан ие на мнемон ик у команд j («jump») и k, а такж е на их сходство с анал огичн ым и ком анд ам и пе рем ещ ен ияв конт екс те сверт ок.) zm, zr Уменьшает (zm) или увел ич ив ае т (zr) на един иц у знач ен ие опц ии foldlevel. zo Открывает одну свертк у. Не следуе т пут ать удаление свертки с ком андой удал ен ия. Исп оль зуйт е ком анду удаления свертки для удал ения определен ия сверт ки. Удален ие свертки не оказыв ае т ник ак ого влияния на текст, со держащийс я в этой свертке. Ком анд ы zA, zC, zD и zO наз ываются рек урсивными, поскольку они дей ствуют на все свертки, вложенн ые в ту, к кот орой вы примен яли эти ко манд ы.Ручное сворачивание Есл и вам знаком ы команд ы перемещен ия в Vim, то вы уже владеете по ловин ой информ ации, нужн ой для эффект ивн ой раб от ы с созд анн ыми вручн ую сверткам и. Нап ример, для сворачив ан ия трех строк введ ите следующее: 3zF 2zfj 3zF вып олн яет ком анду свор ач ивания zF для трех строк, начин ая с те кущей; 2zfj – с тек ущ ей строк и до той, куд а j пер емест ит курсор (в на шем случае – на две строки вниз).
Свертка и контуры (режим контуров) 277Поп роб уе м более сложн ую команд у для прог рамм истов на C. Чтобысвернуть блок код а на C, пом ест ите курс ор на нач альную или кон ечнуюскобки ({ или }) программн ог о блок а и введ ите zf% (помнит е, что % пер емещ ает на вторую соо тветс твующую скобк у).Созд айт е свертку от курсора до нач ала файл а, введя zfgg (gg перем ещае тна нач ало файл а).Свертк и проще пон ять на прим ер ах. Возьмем прос той файл, созд адимсвертки, поупражняе мся с ним и и пос мотрим на рез ульт ат ы. Мы такж еувидим некоторые визуальн ые подсказки (cues) сверток, пред оставл яемые Vim.Снач ал а расс мотр им пример файла с рис. 14.2, сод ерж ащ ег о нек оторые (бесс мысл енн ые) строки кода на C. Изн ач альн о никаких свертокне было.Рис. 14.2. Файл-образец без сверт окНескольк о замеч ан ий по этому рис унк у. Во-первых, на левой сторонеэкрана Vim отображ ает ном ер а строк. Мы реком енд уе м всег да оставлять их вид им ым и (с помощ ью опц ии number), чтобы иметь больш е зрительной информац ии о пол ож ении в файл е, а в данн ой сит уац ии, когдачасть строк пропадает из вида, эта информ ация имее т еще большуюценность. Vim показывае т кол ич еств о неотображ аем ых строк, а ном ераподтверж дают и подк репл яю т эти данн ые.
278 Глава 14. Улучшения Vim для программистов Также обр ат ите вним ание на серые столбцы слев а от ном еров строк. Они зар езервир ованы для дополн ительных виз уальн ых подс казок сверт кам. По мер е изучен ия сверт ок мы увидим виз уальн ые подсказк и, кото рые Vim буд ет вставл ять в эти столбцы. Обр атите вним ание, что на рис. 14.2 курс ор находитс я на строке 18. По мест им ее и две пос ледующие строки в одн у свертку, пос ле чег о введем zf2j. На рис. 14.3 показан результ ат. Рис. 14.3. Три строки, сверн ут ые на строк е 18 Обр атит е вним ан ие, что Vim создает легк о расп ознав аем ый марк ер с со четание м +-- в начале, а текст первой строки свертк и размещен в за полнителе. Кром е тог о, слев а программ а вставил а знак +. Это еще одна визуа льная подсказк а. Теп ерь в том же файл е мы сверн ем следующ ий прог раммн ый блок, на ходящийс я межд у скобок после опер ат ор а if. Пом естит е курсор на лю бую из этих скоб ок и введит е zf%. После этого файл примет вид, пок а занный на рис. 14.4. Рис. 14.4. Программн ый код, свернут ый за оператором if Сейч ас сверн ут о восемь строк кода, три из которых сод ерж атся в ран ее созд анн ой свертк е. Это наз ывается влож енн ой сверткой. Заметим, что ник ак их указан ий на нал ичие вложенн ой свертк и нет. Наш следующий эксперимент – пом ещен ие курс ора на строку 25 и сво рач ив ан ие всех пред ыдущ их строк вплоть до объя вления функц ии fcn
Свертка и контуры (режим контуров) 279включ ительно. На этот раз примен им ком анду пер ем ещ ен ия с поиском.Начнит е ком анду свертки с zf, произведите обр атный поиск к нач алуfcn, исп ользуя ?int fcn (команд а обратн ог о пои ска в Vim), и наж мит еENTER. Экран приобрет ет вид, как на рис. 14.5.Рис. 14.5. Свертка до начала функц ии Есл и вы подс читывает е строк и и созд ает е свертк у, охват ывающую друг ую свертку (наприм ер, 3zf), то все строк и в этой свертк е рас сматр ив аю тся как одна строка. Например, если курс ор нах одитс я на строк е 30, а строк и 31–35 скрыт ы в свертк е на следующей строке экрана (то есть следующая строк а экр ана имеет номер 36), то 3zf соз даст новую свертку, содержащую три строки, как они показан ы на экран е: текс товая строк а 30, пять строк, сод ержащихся в свертке со строк ами 31–35, и текстовая строка 36, отображ аемая ниж е на эк ран е. Неожиданн о? Немног о. Можн о считать, что команд а zf счита ет строки по прав ил у «Что видим, то и свор ач ивае м».Поп робуем другие функц ии. Во-перв ых, открое м все свертки с помощью ком анды zO (после z стои т бук ва O, а не ноль). Мы увидим визуальные подс казк и в левом пол е, как пок азано на рис. 14.6. Кажд ый изстолбц ов в этом поле наз ываетс я foldcolumn.На рисунке перв ая строка кажд ой свертк и отм еч ена знак ом мин ус (-),а все остальные – верт ик альн ой черт ой (|). Самая большая (сам ая внешняя) свертка находится в сам ом левом столбц е, а самая внутренняя –в сам ом правом. Как видн о из рис унк а, строки 5–25 представляют уровень самой низк ой вложенности (в наш ем случае – перв ый), строк и 15–22 – след ующ ий уровень (2), а строк и 18–20 – сам ый высокий уров ень. По умолчан ию эта полезн ая визуа льная метаф ора отк люч ена (не знаем, почему; может быть, потом у что отн им ае т мног о места на эк ран е). Включить и опред елить ее ширин у можн о командой: :set foldcolumns=n где n – колич ес тво использ уем ых столбц ов (максимум 12, мин и мум 0). На рисунк е мы исп ольз овали foldcolumn=5 (внимательн ый чит ат ель зам етит, что на бол ее ранн их рис унк ах foldcolumn был ра вен 3. Мы поменяли значен ие для лучш его зрительног о восп риятия).
280 Глава 14. Улучшения Vim для программистов Рис. 14.6. Все свертки открыт ы Рис. 14.7. Пос ле пов торной свертки строк 18–20 Теперь создайте друг ие свертк и и понаб людайт е за их действ иями. Для нач ала снов а сверн ите самую глуб ок ую свертку, содерж ащую стро ки 18–20, поместив курсор на одн у из строк из диап аз он а и введя zc (за крыть свертку). Рисунок 14.7 прив од ит рез ультат. Увид ел и измен ение в сер ом пол е? Vim поддержив ает виз уа льн ые под сказки, упр ощ ая визуал изацию и управл ение сверткам и. Далее посмотрим, как работ ает в свертк е типичн ая «однос трочная» ко манд а. Пом естит е курсор на свернутую строк у (18) и введ ит е ~~ (смена рег ис тр а у всех симв олов текущей строк и). Не забывайте, что в Vim ко
Свертка и контуры (режим контуров) 281манда ~ явл яетс я объектным оператор ом (если тольк о не включ ена опция compatible), и, след оват ельн о, он долж ен смен ить регистр у всехсимв олов строк и в наш ем пример е. Пос ле этог о отк ройте свертку, введ яzo (ком анда отк рытия свертки). Теп ерь прог рамм а выглядит, как нарис. 14.8. Рис. 14.8. Смен а регис тр а, прим ененн ая к свертке Люб ое дейс твие в свертке влияет на всю свертк у. Нап ример, на рис. 14.7 при пом ещ ен ии курсора на строку 18 – свертк у, скрыв аю щую строк и с 18 по 20, – и ввода dd (удал ение строки) буд ут удален ы все три строк и вместе со свертк ой. Важн о отмет ить, что Vim управляе т всем и командам и ред актир ов а ния так, будт о бы никаких сверток не было, то есть люб ая отм ена анн ул ир уе т всю опер ацию редактирован ия. Наприм ер, если вы вве ли u (отмена) пос ле пред ыд ущ ей правк и, то все три удал енн ые стро ки будут восстан овлен ы. Функция отмены отлич ается от «одно строчн ых» команд, расс мотр енных в этом разд еле, хотя иног да их действ ия кажутся анал огичн ыми. Теп ерь сам ое врем я поз нак омитьс я с виз уальным и подсказкам и поля foldcolumn. Они облегчаю т обз ор свертки, на которую вы соб ир аетесь по дейс твовать. Нап рим ер, команда zc (зак рыт ие свертки) зак рывае т са мую внутр енн юю свертку, содерж ащ ую строку с курсор ом. Велич ин у этой свертки можно узнать по верт ик альн ым черт очкам в foldcolumn. Как тольк о вы освоит есь с этим, так ие дейс тв ия, как отк рыт ие, закры тие и удален ие сверт ок, стан ут для вас ест ес тв енными.Схема Расс мотрим след ующий прос той (и не слишком естес тв енный) файл, где в качеств е отступ ов исп ользуе тся таб ул яц ия: 1. This is Headline ONE with NO indentation and NO fold level. 1.1 This is sub-headline ONE under headline ONE This is a paragraph under the headline. Its fold level is 2. 1.2 This is sub-headline TWO under headline ONE.
282 Глава 14. Улучшения Vim для программистов 2. This is Headline TWO. No indentation, so no folds! 2.1 This is sub-headline ONE under headline TWO. Like the indented paragraph above, this has fold level 2. - Here is a bullet at fold level 3. A paragraph at fold level 4. - Here is the next bullet, again back at fold level 3. And, another set of bullets: - Bullet one. - Bullet two. 2.2 This is heading TWO under Headline TWO. 3. This is Headline THREE. Свертки Vim можно использ ов ать для просмотр а файла в вид е схем ы (outline). Определите метод свор ач ив ан ия как indent: :set foldmethod=indent В наш ем файл е зад ад им shiftwidth (уровень отс туп ов для таб ул яций) равн ым 4. После этого мы смож ем открыв ать и закрыв ать свертк и на основании отступов строк. Для кажд ого shiftwidth (в наш ем случае – кратного четырем столбцам) в строк е с отс туп ом уровень свертк и уве лич иваетс я на 1. Наприм ер, в нашем файл е подзагол овк и имеют от ступ, равный одн ому shiftwidth или четырем столбцам. След оват ельн о, уров ень сворач ив ания равен 1. Строки с отступ ом восемь столбц ов (два shiftwidth) имею т уров ень 2 и т. д. Уровнем вид имых сверт ок можн о управлять с пом ощью команд ы fold level. В кач ес тве аргумента ей пер ед аетс я целое числ о, пос ле чего она отоб ражает тольк о те строки, где уровень свертк и меньш е или равен этому арг ументу. В рассматрив аем ом файле следующей командой мож но указать ред акт ору пок азывать только загол овк и сам ого высок ог о уровня: :set foldlevel=0 Экр ан прио брет ет вид, как на рис. 14.9. Отобразить все вплоть до пункт ов ненумер ованн ых спис ков, включ ая их самих, можно путем устан овки foldlevel, равн ым 2. Все свертк и с уровнем не меньше 2 будут вид им ы, как на рис. 14.10. Использ уя этот метод для проверки файл а, вы сможет е быс тр о развор а чивать и сворач ивать видим ые уровни детал из ации с помощью команд инк ремента (zr) и декрем ента (zm). Рис. 14.9. fold level = 0
Свертка и контуры (режим контуров) 283 Рис. 14.10. fold level = 2Несколько слов о других методах сворачивания У нас нет врем ени на рассмотр ен ие всех остальн ых метод ов свор ач ив а ния, но для возб ужд ения вашег о аппет ит а сдел аем беглый обзор син такс ическог о (syntax) мет од а. Возьмем уже знакомый файл C, но на этот раз позволим Vim решать, что нужн о свернуть на осн овании синт аксиса C. Этот язык имеет слож ные прав ил а сворачив ан ия, одн ако простог о куск а кода в прим ере дос тат очн о для демонс тр ац ии возможностей ред актор а по авт омат изации. Во-перв ых, с помощью команд ы zE (удаление всех сверток) убедимс я, что мы избавились от всех сверт ок. Теперь экр ан пок аз ывае т весь код без визуальн ых марк еров в столбце сверт ок (слева). Ком андой :set foldenable убед ит есь, что свор ачивание включен о (в случае ручн ого свор ач ив ания можн о было этог о не делать, поскольк у foldenable авт ом ат ич ес ки уст а навливаетс я при задан ии foldmethod, равн ым manual). Введ ите команду: :set foldmethod=syntax Свертк и прио бр етут вид, как на рис. 14.11. Vim свернул все программн ые блок и в скобк ах, пос кольку они являют ся логич ески смысловыми блок ами в C. Если выполнить zo в строке 6 этог о прим ера, то Vim раск рое т свертку и отобразит внутр енн юю. Рис. 14.11. После примен ения команд ы set foldmethod=syntax
284 Глава 14. Улучшения Vim для программистов Кажд ый метод сворач иван ия исп ользует разл ичн ые правил а для опр е дел ения сверток. Мы приз ыв аем засуч ить (развернуть?) рук ава и узн ать в документ ац ии Vim больш е об этих мощн ейших средс тв ах. Реж им diff в Vim (котор ый можно включить ком анд ой vimdiff) – это мощн ое соч етание сворачив ан ия, окон и подсветки синт акс иса, кото рый мы обсуд им позже. Как пок аз ано на рис. 14.12, этот режим отобра жает различия в файл ах (обычн о межд у двумя верс иями одн ого файла). Рис. 14.12. Функц ия diff Vim и ее исп ользован ие в свертк ахАвтоматические и умные отступы Vim предлаг ает чрезв ыч айн о сложные и мощн ые методы автоматич е ской расстановки отс тупов в текс те. В общ ем случ ае он ведет себя почт и аналогично vi с включ енной опц ией autoindent, и для опис ан ия таког о повед ения используе тся то же имя. Метод расстан овк и отс туп ов можно выбирать, просто указав его наз ва ние в ком анд е :set: :set cindent В Vim есть след ующ ие мет од ы, пер ечисл енные в порядке возр аст ан ия сложнос ти: autoindent Авт оматич ес кие отступы, похож ие на autoindent в vi. Небольш ие отл и чия зак лючаются в месте пом ещ ения курс ор а при удал ении отступ а. smartindent Чуть мощнее, чем autoindent, но расп ознае т некот орые примитив ы синт акс иса C для опред елен ия уровн ей отступ ов. cindent Как след ует из назван ия, cindent включ ает гораздо больше знан ий о синтакс исе C и ввод ит усложн енную нас тройк у, вых одящ ую за рам ки простых уровней отступа. Нап ример, cindent можно настроить так, чтобы он соответствовал вашим (или вашего босс а) люб им ым
Автоматические и умные отступы 285 стилям прог раммиров ан ия, включ ая (но не огран ичив ая сь) отс тупы фиг урных скоб ок ({}), разм ещение скобок, наличие отс туп ов у обеих скоб ок и даж е способ соо тв етств ия отступа включ енному тексту. indentexpr Поз вол яе т определять пользовательс кие выражен ия, кот орые Vim выч исляе т в контексте кажд ой нач атой новой строк и. Имея так ую функц ию, вы сам и пиш ет е собс тв енные прав ила. За подр обн остями обращайтесь к описан ию скрипт ов и функций в этой книге, а также к докум ент ац ии Vim. Если перв ые три опц ии не давал и дост аточн ой гибкос ти для авт оматич ес ких отступов, то indentexpr, нес ом ненн о, обеспечит ее.Расширения autoindent Vim по сравнению с vi В Vim autoindent ведет себя почт и как в vi, к тому же его можн о сделать сов ершенно аналог ичным, включив опц ию compatible. Одн о из пол езных расширений Vim заключается в его способн ос ти расп ознавать «тип» файла и вставл ять подходящие симв ол ы коммент ария, когда закоммен тир ованный текст перех одит на новую строку. Эта функц ия прекрасно работ ае т как с опц ие й wrapmargin (текст перенос итс я, оставл яя по право му краю кол ич ес тв о столбцов, указ анное в wrapmargin), так и с опц ие й textwidth (текст перен оситс я, ког да число симв олов в строк е превыс ит пок азат ель textwidth). На рис. 14.3 показ ан результ ат в Vim и vi на од ном и том же файл е.Рис. 14.13. Различия межд у autoindent в Vim и в viОбратите вним ан ие, что во втор ом текс тов ом блоке (строка 16 и ниж е)отс утств ует первый симв ол комм ент ария. Кроме того, если уст ановленаопц ия compatible (подр ажание дейс твиям vi), то опция textwidth не бу
286 Глава 14. Улучшения Vim для программистов дет распоз нав аться, поэтом у текст пер еносится на новые строки тольк о по значен ию опц ии wrapmargin.smartindent smartindent – это слегка расшир енн ый autoindent. Метод мож ет оказать ся полезн ым, но если вы программируете на C и использ ует е сложные констр укции, то лучш е польз оваться cindent. smartindent авт оматич ески расс тавл яет отс туп, есл и: • Новая строк а следует за строк ой, сод ержащ ей лев ую фигурн ую скобку. • Новая строк а начин ае тся с ключевог о слова, кот орое пер еч исл ен о в опц ии cinwords. • Созд анн ая новая строк а предшествует строк е, нач ин ающейс я с пра вой фигурн ой скобк и (}), если курсор был пом ещ ен на строк у, сод ер жащ ую скобк у, и польз ователь создал нов ую строку с помощ ью ко манды O (создан ие новой строки выш е текущ ей). • Нов ая строка – это зак рыв ающ ая (или правая) фигурная скобк а (}).cindent Скор ее всего, пользователи Vim, прог раммир ующ ие на подобн ых С язы ках, зах от ят использовать cindent или indentexpr. Хотя indentexpr бол ее мощ ный и гибкий, а такж е лучш е нас траив ае тся, для мног их зад ач программ ирования более практич ен cindent. В нем есть множеств о оп ций для сам ых разн ых нужд программ истов (и под разл ичные корпора тивн ые станд арты). Снач ал а поп робуйте cindent с нас тройками по умол чан ию, а зат ем пом ен яйт е их, есл и они не соо тветствую т ваш им стан дартам. Если опц ия indentexpr зад ана, она отм ен яе т дейс тв ие cindent. Пов еден ие cindent опр еделяетс я тремя опциями: cinkeys Зад ает клавиш и клав иат ур ы, зас тавл яющие Vim занов о рассчитать отс тупы. cinoptions Опр едел яет стиль отступ ов. cinwords Опр ед еляе т ключевые слова, предп ис ывающие Vim доб ав ить допол нит ельн ый отступ к пос ледующим строкам. cindent используе т строк у, зад анн ую cinkeys, как наб ор правил, опр еде ляющих отс тупы. Мы рассмотр им значен ие cinkeys по умолч анию, а за тем изуч им друг ие доступные значения и принц ипы их раб оты.
Автоматические и умные отступы 287Опция cinkeyscinkeys – это список из следующих элементов, разделенных запятыми: 0{,0},0),:,0#,!^X^F,o,O,eНиж е пер ечислены их знач ения, разнесенные по конт екс там, с кратким описанием дейс тв ия каждог о из них:0{ 0 (ноль) уст анавливае т контекст нач ал а строки для следующ его симв ол а, {. То есть если вы ввел и симв ол { первым в строке, Vim пе рес чит ает отс туп для данн ой строки. Не путайте ноль, стоящ ий в этой опции, с действием «использ ов ать здесь нулев ой отс туп», представляющим собой обычн ое дел о при от ступ ах в C. В нашем случае ноль означает, что «если симв ол введ ен в начале строк и, не вын уж д ать его отображ атьс я в нач ал е строк и». Значение отступ а для { по умолчан ию равно нулю: поверх тек ущего отступа новый доб авлятьс я не будет. След ующ ий прим ер пок аз ыва ет типичн ый результ ат: main () { if ( argv[0] == (char *)NULL ) { ...0}, 0) Как и в предыдущем прим ере, эти две уст ановки опр ед еляют кон текст начал а строки. То есть если в нач ал е строк и ввести } или ), то Vim перес чит ает отступ. Зад анн ый по умолчанию отступ для } соо тветс твуе т отс тупу, уст а новл енному для соо тветств ующей отк рыв ающ ей скобки {. Отс туп для ) по умолч анию равн яется одн ому shiftwidth.: Это конт екст для метк и C или для case statement. Есл и : (двоет оч ие) поставлен о в конц е метк и или опер атора case statement, то Vim пер е считае т отс туп. По умолч ан ию для : отс туп ом явл яе тс я столб ец 1 – первый столб ец в файл е. Не пут айт е его с нулевым отступ ом, ког да следующ ая стро ка имее т тот же уровень отступа, что и предыдущая. Ког да отступ равен 1, первый симв ол нов ой строки сдвиг ае тс я влев о к сам ом у пер вом у столбцу.0# Это также конт екст начала строк и. Когда первым симв олом строки явл яе тс я #, Vim перес чит ыв ае т отс туп. Как и в пред ыдущем опр ед елении, по умолч ан ию отступ сдвиг ает всю строк у к первому столбц у. Это соотв етств уе т практ ик е начинать макрос ы (#define...) с перв ого столбца.
288 Глава 14. Улучшения Vim для программистов !^F Спец иа льный симв ол опред ел яет любой пос лед ующ ий симв ол как пер еключ ат ель для пересчета отс туп а текущей строки. В прив еден ном прим ере симв ол-переключатель – ^F (или CTRL-F), то есть при кажд ом нажат ии CTRL-F по умолчан ию Vim буд ет зан ово вычис лять отступ для данн ой строки. o Этот конт екст определ яе т любую создаваемую вам и новую строку либо по нажат ию клав иш и ENTER в режим е вставк и, либо с ис польз ование м команд ы o (новая строка). O Отвечает за создан ие новой строки выш е текущ ей при пом ощ и ко манд ы O (новая строк а выш е текущей). e Контекст для else. Есл и вы нач ин аете строку со слова else, Vim пер е считывает отс туп. Редакт ор не будет распознав ать этот контекст, по ка не будет набрана последняя «e» в слове else. Правил а синтакс иса cinkeys. Каждое опр еделен ие cinkeys сос тоит из нео бязательн ог о префикса (!, * или 0) и клав иш и, для котор ой пер ес чи тыв ае тс я отступ. Преф иксы имею т следующ ие знач ен ия: ! Указыв ает на клав ишу (по умолчанию CTRL-F), зас тавляющ ую Vim пер есчитыв ать отс туп текущей строк и. Можно добавлять доп олни тельн ое опред ел ен ие клавиш и как команд ы (исп ользуя +=), не отме няя предоп ред ел енных команд. Другим и словам и, можн о задав ать нес кольк о клавиш, пересчит ывающих отс туп строк и. Люб ая клав и ша, добавленн ая в опр еделен ие !, будет вып олнять и старую функц ию. * Предписыв ае т Vim перес чит ать отс туп тек ущ ей строк и пер ед тем, как встаить симв ол. 0 Устан авлив ае т конт екст начала строки. Клав иш а, кот ор ую вы про пиш ит е после 0, будет вызывать пер ес чет отс туп а, только если она буд ет первым симв олом в строке. Нужно пон имать отл ич ие в Vim и vi между «перв ым симв ол ом стро ки» и «перв ым столбцом строки». Мы уже знаем, что ввод ^ переме щает курсор на первый симв ол в строк е, но не обязательно на пер вый столбец (по лев ом у краю); то же относится к вставке с I. Точн о так же префикс 0 применяе тся к ввод у симв ол а как первог о в стро ке нез ав исим о от того, выровнен он по лев ом у краю или нет.
Автоматические и умные отступы 289cinkeys исп ольз ует спец иа льн ые наз вания клав иш и дае т возм ожн остьзад ейств ов ать любой из зарез ервированн ых симв олов, нап рим ер, используемых в качес тве префиксов. У спец иа льн ых клавиш есть следующие опц ии:<> Эта форм а исп ольз уе тс я для опр ед еления симв олов буквальн о. Для нек отор ых неп еч атаемых симв ол ов использ уйт е их «побукв енные» представл ения. Наприм ер, с помощ ью <:> можн о опр ед ел ить симв ол «:». Другой пример – неп еч атаемый симв ол «стрелк а вверх», опреде ляем ый как <Up>.^ Каретка (^) использ уе тс я для обознач ения управляющег о симв ола. Нап ример, ^F опред ел яет клав иш у CTRL-F.o, O, e, : Мы уже говор ил и об этих клав иш ах в качес тве значений cinkeys по умолчан ию.=word, =~word Исп ольз уе тс я для опр ед елен ия слова, вызывающего специальное поведение. Есл и симв ол ы, явл яющ иеся нач альн ым текстом в стро ке, соответс твуют word, Vim пер есчит ывает отс туп. Форм а =~word анал ог ичн а =word, тольк о она игнор ирует регистр. К сожалению, терм ин «слов о» (word) исп ольз уетс я здесь неверно. Правильнее говорить, что word предс тавл яет начало слова, так как пер еключение прои сх од ит при совп адении строк и со «слов ом», при чем конец обр азца для сравн ения мож ет не совп адать с конц ом сло ва. Во встроенн ой докум ентац ии Vim привод ится прим ер слов а end, соотв етствующег о как end, так и endif.Опция cinwordscinwords определяет ключ ев ые слова, кот ор ые, буд учи набранным и,включ ают доп олнит ельный отс туп у след ующей строки. По умолч ан июэта опция сод ерж ит: if,else,while,do,for,switchЭти слов а охват ывают стандартн ые ключевые слова в языке програм-мирования C. Эти ключев ые слов а зав исят от рег истр а. При так ой пров ерк е Vim даже игн орир ует опцию ignorecase. Есл и вам нужны вар иа нты с раз личными регистр ам и в ключ ев ых слов ах, придется проп ис ать в строк е cinwords все возм ожн ые комб ин ац ии.
290 Глава 14. Улучшения Vim для программистов Опция cinoptions cinoptions управл яе т расс тановкой Vim отс тупов строк с учет ом конт ек ста C. Данная опция включае т устан овки для управления нес кольким и станд артам и форматир ования кода, наприм ер: • Вел ич ин ой отс тупа программн ог о блок а, зак люченного в фиг урные скобк и. • Необходим остью вставки новой строки перед фиг урн ой скобк ой, стоящей после условн ого операт ора. • Способом выр авнив ан ия прог раммн ых блок ов относ ит ельно обр ам ляющих их скобок. В вариант е по умолчан ию cinoptions определяет 28 устан овок: s,e0,n0,f0,{0,}0,^0,:s,=s,l0,b0,gs,hs,ps,ts,is,+s,c3,C0,/0,(2s,us,U0,w0,W0, m0,j0,)20,*30 Уже сам пер ечень этих вариа нт ов дает представл ение о колич еств е спо соб ов зад ан ия прав ил отс тупов в Vim. Больш ая часть настрое к cinopti ons опр еделяет разл ичия в конт екс тных блоках. В некот орых настрой ках зад ае тс я, нас колько далеко необх одимо скан ир ов ать (сколько строк файл а вверх и вниз нужно пройт и) для уст ан овки правильного контек ста и выч исления отс тупов без ошиб ок. Устан овки, меняющие кол ичество отступ ов для различн ых контекс тов, мог ут увел ич ивать или уменьш ать уровни отс тупов. Кром е того, можно пер ео пред елять кол ич ес тв о столбцов, использ уем ых в отс тупах. На прим ер, уст ан овк а cinoptions=f5 прив од ит к том у, что открывающая фиг урн ая скобк а ({) будет отс туп ать на пять столбц ов, если тольк о она не расп ол аг ается внутр и друг их скоб ок. Другой спос об опр едел ить увел ич ен ие отступов заключае тся в исполь зован ии некот ор ого множител я (он необяз ат ельно должен быть цел ым числ ом) для shiftwidth. Если в пред ыдущ ем примере прип исать в опр е дел ение w (то есть cinoptions=f5w), то открыв ающ ая фигурная скобк а сместитс я на пять shiftwidth. Для изм енения уровня отступов в меньш ую сторону (отр ицательн ый отступ) вставьте знак мин ус (-) пер ед числовым знач ением. Опц ию cinoptions и ее строков ое знач ен ие нужн о менять с особ ой ос тор ожностью. Не забыв айт е, что при исп ользован ии = вы пер ео пре дел ит е всю опцию. Так как cinoptions содерж ит множ ес тв о всев оз можн ых устан ов ок, для ее измен ен ия использ уйт е команд ы: += для добавл ения параметр а, -= для удаления существующег о пар аметра, а для изменен ия сущ ес тв ующего – -=, за которым следует +=. Дал ее след ует кратк ий список опц ий, кот ор ые вам, возм ожн о, зах очет ся пом енять. Это мал ое подм ножес тв о установок в cinoptions. Мног ие чит ат ел и мог ут захот еть исп ольз ов ать друг ие (или даж е все) опции для свои х настрое к.
Автоматические и умные отступы 291>n (по умолчанию s) Люб ая строк а с отс тупом должна быть сдвинута на n столбцов. По умолчан ию стои т s, то есть по умолчанию отступ строки равен одно му shiftwidth.fn, {n f опр едел яет, нас колько дал еко нужн о став ить отс туп у отк рываю щей нев ложенной фигурной скобк и ({). По умолчан ию стои т ноль, то есть скобка выр авн ив ае тся по свое му лог ическом у «собрат у». На пример, фигурн ая скобк а, стоящ ая после строк и с оператор ом while, пом ещается под буквой «w» в слов е while. { ведет себ я аналог ичн о f, но примен яе тся и к вложенным фиг урным скобкам. Здесь знач ен ие по умолчанию соо тветств ует нулев ом у от ступ у. На рис. 14.14 и 14.15 пок аз ан один и тот же текст в Vim, но в первом случае cinoptions=s,f0,{0, а во втором cinoptions=s,fs,{s. В обоих при мерах опц ия shiftwidth имеет значен ие 4 (чет ыре столбц а). Рис. 14.14. cinoptions=s,f0,{0 Рис. 14.15. cinoptions=s,fs,{s}n Эта устан овк а используе тся, чтобы опред ел ить смещ ение закрываю щей фигурной скобки (}) по отношен ию к соо тветствующей отк ры вающ ей. По умолчан ию стои т ноль (то есть скобки выр овн ены отн о сительн о друг друг а).^n Доб авл яет n к тек ущем у отступ у внутри набора скоб ок ({…}), если от крывающая скобк а нах од ится в первом столбце.
292 Глава 14. Улучшения Vim для программистов :n, =n, bn Эти три уст ан овки контрол ир ую т отс туп ы в опер ат орах case. С помо щью : Vim ставит отс туп у меток равным n символов по отн ош ению к соответс твующ ем у опер ат ор у switch. Знач ение по умолчанию – один shiftwidth. Уст ан овк а = определ яе т смещен ие для строк код а от соотв етс тв ующ ей им метки. По умолчан ию опер ат ор ы отступаю т на один shiftwidth. b задает место устан овк и операторов break. Знач ен ие по умолчанию (ноль) выр авнив ает break с ост альными опер ат ор ам и в соответств ую щем блок е case. Люб ое ненул евое значен ие выр авн ив ае т break с соот ветств ующ ей меткой. )n, *n Эти две установк и перед аю т Vim кол ич еств о строк, кот орые нужно скан ир ов ать при поиске нез акрыт ой круглой скобки (20 строк по умолчанию) и нез ак рытых комм ент арие в (по умолчанию 30 строк), соответс твенно. Эти два пар ам етра, предп ол аг аетс я, должны огран ичить объе м ра боты Vim при пои ске совп адений. При работе на сов ременн ых мощ ных комп ью тер ах можно подум ать об увел ич ении этих значений, обеспеч ивая больш ий объе м поиск а соответс твий комм ент ариям и скобк ам. Для нач ал а попроб уйте удв ои ть каждое знач ение до 40 и 60 соо тветс тв енно.indentexpr Будучи определенной, опция indentexpr отмен яет дейс тв ие cindent, так что можете опред елять правил а прос тавлен ия отступов и подстраив ать их под ваш язык программ ир ов ан ия. indentexpr опр ед ел яет выражен ие, вычисляемое кажд ый раз при созд а нии новой строк и в файл е. Это выр ажение опр едел яе т целое числ о, ко торое Vim используе т для задан ия отс тупа нов ой строк и. Кроме того, опц ия indentkeys поз воляет опред елять полезные ключ евые слов а анал огично ключевым слов ам в cinkeys, задающ им строки, пос ле котор ых отступ пересчитывае тс я. Плохая нов ость зак лючае тся в том, что зап ис ать пользов ат ельские пра вил а проставления отс туп ов с нуля – нет рив иа льная задач а для любог о языка. Хорошая же состои т в том, что, скорее всего, эта раб ота уже про делана. Пос мотрит е в кат ал ог $VIMRUNTIME/indent и пров ерьте, есть ли там ваш любимый язык. На сегодняшний день там содержится около 70 файлов с правил ам и отступ ов. В них предс тавлены сам ые поп ул ярные языки программ ир ования, та кие как ada, awk, docbook (файл называетс я docbk), eiffel, fortran, html, java, lisp, pascal, perl, php, python, ruby, scheme, sh, sql и zsh. Есть даж е файл, опр едел енный для xinetd!
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: