Редакторът Vim

Увод • Програмиране на C и C++ • Справки за C и STL • Писане на български и други езици • Игри • Препратки

Текстовият редактор Vim е един от най-широко използваните в света, особено сред програмистите. Използва се за писане и редактиране на текстове от всякакъв вид: програми, научни публикации, уебстраници, художествена проза, електронна поща. Работи по идентичен начин в цял ред операционни системи. На пръв поглед странен в някои отношения, той се оказва изумително ефективен и универсален инструмент. Доброто му опознаване изисква известни усилия – както при всяка функционално богата система – но в случая с Vim тези усилия винаги са щедро възнаградени. Работата с Vim дава усещане за удовлетворение, защото почти винаги е възможно да се постигне точно този резултат и този начин на работа, който изглежда най-естествен и ефективен от гледна точка на дадена цел. И още нещо: колкото и дълго да си служи човек с Vim, винаги остава място за някоя приятна изненада, като научаване на нещо ново или откриване на нов начин да се изпълни определена задача.

Тук обаче няма да описвам подробно възможностите на редактора, а ще дам само някои кратки сведения за използването му, достатъчни за начално запознанство и използване на основните възможности за боравене с текст и с файлове като цяло. Следващата част е посветена на това. По-нататък се описват използването на Vim като проста интегрирана среда за програмиране и достъпът чрез редактора до справки за C и STL. Накрая се дават сведения за писане на български чрез Vim и за игри, реализирани в редактора.

Увод в използването на Vim

Vim може да бъде използван в т.нар. „лесен“ режим (easy Vim или evim). Как да се стартира Vim по този начин описах тук. В този режим характерните за редактора команди са недостъпни, затова пък и няма нужда да се пояснява използването му – то е не много различно от това на Notepad. Затова този, за когото това е достатъчно, може да прескочи тази част и да премине към следващата.

Най-важната отличителна особеност на Vim е тази, че той работи в няколко различни режима. Основните са два: текстов и команден. В текстов режим клавиатурата служи за писане на текст – вмъкване сред стария или писане върху него (замяна), а в команден (наричан още нормален) – за задаване на команди. Някои команди са изведени в менюта и по този начин могат да се изпълнят винаги, дори в текстов режим (това са и единствените команди, достъпни в evim).

Терминът „нормален“ подсказва, че на този режим се гледа като на основен, преобладаващ за работещия с редактора. Това може да изглежда странно, но само на пръв поглед. Да смятаме командите, т.е. действията с текста, а не самото му набиране за основно означава, че слагаме ударението върху редактирането – преместване по текста, вмъкване, изтриване или замяна на части в него и др. И наистина това е естествено! Ако основното беше набирането на текст (последователно, без промени), за него не е нужна програма-редактор: достатъчно е само да копираме идващото от клавиатурата във файл.

Непосредствено след стартиране Vim попада в нормален режим. Някои команди се изпълняват изцяло в такъв режим, а други водят до преминаване в текстов. За преминаване от текстов режим в нормален натискаме клавиша Esc. Видът на курсора показва в какъв режим се намира редакторът: правоъгълен блок за нормален режим, вертикална чертица за текстов режим с вмъкване, и хоризонтална чертица под реда за текстов режим със замяна.

Командите биват два вида: „нормални“ и „двуточкови“. Първите се задават с един или няколко знака. Вторите са като правило по-дълги – имената им се задават с думи, започват със знака : (двоеточие) и някои имат аргументи и уточнители („опции“). Като напишем (в нормален режим) :, курсорът се поставя в командния ред, в долния край на работния прозорец на Vim, където дописваме дадената „двуточкова“ команда и я изпълняваме, натискайки Enter. Това действие може да бъде прекъснато с помощта на Esc.

Следват някои най-употребявани команди в групи по предназначение. (Умишлено не споменавам тези за търсене и за търсене и замяна по шаблон. Те, разбира се, също са важни, но за изясняване на действието им е нужно много повече от споменаване.)


Преместване
h j k l: наляво, надолу, нагоре и надясно (също като със стрелките)
0 (нула) ^ $: начало на ред, начало на текста в ред, край на ред
?gg ?|: на даден ред и на дадено място в реда (? е число – номер)
w e b: начало и край на следваща дума, начало на предишна дума
gg G: начало и край на файл
( ): предишно и следващо изречение
{ }: предишен и следващ абзац (т.е. празен ред)
%: съответна скоба от ( ), [ ], { }, < > или /* */
f? t? F? T?: до следващия знак от даден вид в реда или до преди него и същото назад в реда (? е кой да е знак)
m? '?: поставяне и намиране на етикет (? е коя да е буква)


Добавяне и промяна на текст
i a: добавяне преди и след мястото на курсора
O o: добавяне на нов ред преди и след текущия
r R: замяна на един знак и на поредица от знаци в ред
s: замяна на знак и оставане в текстов режим
~: промяна на малка буква в главна и обратно
c C cc: замяна до определено място, до края на ред и на цял ред


Копиране
y: копиране в подразбиращия се регистър (@) до определено място
"?y: същото в даден регистър (? е коя да е буква и задава регистър)
yy: копиране в подразбиращия се регистър на цял ред
P p: копиране на подразбиращия се регистър преди и след мястото на курсора


Изтриване
x: изтриване на знак на мястото на курсора
d D dd: изтриване до определено място, до края на ред и на цял ред
u Ctrl-R: отмяна и повтаряне на промяна

 

Командите :e, :sp и :vs отварят файл съответно на мястото на текущия или в нов прозорец чрез хоризонтално или вертикално разделяне на текущия. Командата :new отваря нов прозорец с безименен файл.

Командите :w и :q съответно записват текущия файл и го освобождават от редактора. Това може да става и заедно: :wq.

Командата :help, или само :he, показва справочника за редактора (множество файлове с общ размер като на средноголяма книга), а също други справочници, ако има интегрирани такива (вж. по-следващия раздел). Най-често тази команда се задава с аргумент, съответен на дадена тема, напр. :he motion. Справочникът на Vim е хипертекстов: в него може да се преминава към друга тема или да се връщаме оттам като в уеббраузър. Съответните места за преход в текста се показват с особен цвят. За преминаване към нова тема може да се използва Ctrl-], а за връщане – Ctrl-T или Ctrl-O.

Командите за преместване, освен сами по себе си, се използват и като „адреси“ в някои команди за промяна, копиране и изтриване. Например y4l копира 4 знака от мястото на курсора напред в подразбиращия се регистър.

Още по-голямо разнообразие се получава, като се комбинират тези команди и с повторител. Например 5x е команда за изтриване на 5 знака напред.

Търсене в рамките на ред (командите f, F, t и T) може да бъде повторено с ; в същата посока или , в обратната. При това и тук е приложим повторител за кратност. Командата . (точка) пък повтаря последната промяна, възможно също с повторител за кратност.

Други примери за комбинирани команди следват по-долу.
xp – размяна на знак с този след него
ddp – размяна на ред с този след него
5dd – изтрий 5 реда напред
d0 – изтрий до началото на реда
d^ – изтрий до началото на текста в реда
d2} – изтрий напред до втория поред празен ред
c2e – промени до края на втората дума напред
"hyt[ – копирай от курсора до преди първия знак [ в регистър h
"h7p – копирай регистър h 7-кратно след мястото на курсора
3C – замени текущия, следващия и по-следващия редове
f,x – намери най-близката напред в реда запетая и я изтрий
df, – изтрий вкл. до най-близката напред в реда запетая
3. – направи горното още 3 пъти
dt, – изтрий до най-близката напред в реда запетая, но без нея
4; – след горната команда: намери 4-та следваща напред в реда запетая

С помощта на Ctrl-N в текстов режим на редактора се активира системата за автоматично допълване. Ако текущо писаният текст е начало на дума, която вече се среща другаде в този или друг отворен в редактора файл, тази дума автоматично се доизписва. Ако има повече от една такива думи, показва се меню за избор.

Vim като „интегрирана среда“ за C и C++

Дори и в своя „суров вид“ Vim предоставя възможност да компилираме и изпълним програма на C или C++ (а и други езици) непосредствено от редактора. Това обаче изисква известна ръчна работа, която, макар и неголяма по обем, може да бъде досадна, когато се изпълнява многократно. Освен това, понякога тези действия се оказват затруднителни за не много сведущи в особеностите му потребители на редактора. Затова архивът [2] включва като интегрирана в редактора малка програма-приставка (plug-in) на скриптовия език на самия редактор, която написах именно за да се избегнат с нейна помощ споменатите неудобства. Тя автоматизира във възможно най-голяма степен компилирането и изпълняването на еднофайлови програми на C и C++, както и някои съпътстващи действия, като по този начин придава на Vim свойства на интегрирана среда за програмиране.

Съществуват разнообразни други скриптови програми, с голям брой функции, вкл. работа с многофайлови програми, проследяване на цитирания между файлове, работа в колектив и какво ли още не. Те превръщат Vim в наистина пълноценна интегрирана среда за професионално програмиране, но са и значително по-сложни за използване. Описваното тук, от своя страна, е съвсем леко за овладяване и по-добре съобразено именно с нуждите на индивидуалното програмиране, и то на програми, състоящи се от един файл, и особено този вид програмиране, който е характерен за състезанията.

Приставката присвоява някои необходими действия на определени клавиши, а образува и командно меню от същите действия. Менюто се нарича C/C++ и в него успоредно с командите, за напомняне са изписани и съответните им клавиши. Като всяко друго меню на Vim, то може да се „откъсне“, щракайки върху пунктирния ред най-отгоре, за да стои постоянно отворено.

За да може да се изпълни която и да е от командите, свързани с компилиране или изпълнение на програма, в текущо отворената страница на редактора трябва да има точно един файл с програма на C или C++. (Vim може да работи с множество страници, като във всяка има един или повече отворени прозорци за редактиране, в които се разполагат файлове. Всеки файл може да заема един или повече прозорци.) Ако в страницата на редактора липсва програмен файл или има повече от един, при опит за компилиране или изпълнение се появява съобщение за грешка.

Като казваме „програма на C или C++“, разбираме файл с разширение на името .c, .cc, .c++, .cpp или .cxx: първото е за C, а останалите са приетите разширения на C++. Безименните файлове не се броят, независимо от това дали съдържат програма. Въпреки че в страницата може да има само една програма, допуска се тя да заема няколко прозореца. Възможно е, разбира се, да имаме и произволно много „непрограмни“ файлове – например такива с входни данни или файлове, които са резултат от изпълнението на програмата, файлове .h, справочни и др.

Съдържанието на другите страници, ако има отворени такива, няма връзка с това на текущата. По този начин можем да имаме различни програми, с които работим в различни страници.

Когато компилираме програма (Compile and Link или F7) се случва следното. Намира се прозорец с програмата; ако текущият не е такъв, текущ става един от „програмните“ прозорци. Ако файлът с програмата има незаписани промени, прави се запис (save). Програмата се компилира със съответния компилатор (C или C++) и ако при това няма грешки се свързва: образува се изпълним файл. Прозорецът за съобщения за грешки се отваря ако такива има, а ако не и е бил отворен – затваря се. Щракане с мишката върху грешка в прозореца за съобщения закарва курсора на съответното място в програмата.

Командата (Build and) Run или F5 намира програмния файл както по-горе, компилира и свързва ако е нужно и след това изпълнява програмата. „Когато е нужно“ означава, че изпълним файл няма или той е по-стар от този с текста на програмата (което може да се случи и поради автоматичното записване на последния когато е променян, както бе описано по-горе). Разбира се, ако при компилирането възникнат грешки, постъпва се както по-горе, а програмата не се стартира.

Другите четири команди, водещи до изпълнение на програмата – тези, които са назначени на клавиши от Alt-1 до Alt-4 (вж. менюто) – пренасочват стандартния вход, изход или и двете към файлове с имена съответно in и out, намиращи се в същата директория, където е и програмата. Когато се използва in, разбира се той трябва да е предварително създаден, в противен случай се извежда съобщение за грешка. Обикновено е удобно да държим in и out отворени в редактора: така най-непосредствено можем да правим промени в in, да пускаме програмата и да видим резултата в out. По-долу се вижда екран на Vim с програма в един прозорец, файлове in и out, с които работи програмата в два други прозореца вдясно на първия и справочен файл в прозорец под тях. Също отдясно се вижда изнесен екземпляр от менюто C/C++ с командите за работа с програми (такъв може да стои където и да е върху екрана на компютъра).

Run on a Selection (Alt-4) е малко по-особена команда. При нея стандартният вход се пренасочва към „визуално избрана“ част от текста, каквато трябва да има в текущия прозорец на редактора. Трябва да имаме предвид, че в случая за избрани се смятат винаги цял ред или редове, дори когато избраното съдържа само части от тях.

При споменатите четири команди програмата не се компилира и свързва. Ако това е нужно, трябва да го направим с F7, както по-горе.

В менюто C/C++ има и две команди, които не са пряко свързани с програмирането, но изпълняват твърде полезни съпътстващи действия. Те могат да се изпълняват и без да има отворен файл с програма, или когато има повече от един такъв, т.е. винаги.

List a Directory (Ctrl-D) образува в редактора прозорец със съдържание директорията на текущия файл. Ако „текущият файл“ е точно такъв директо̀рен прозорец, създава се негово копие. Директо̀рните прозорци на Vim имат особени функции, подобни на Explorer в Windows или др. под. В такъв прозорец можем да отворим, изтрием, преименуваме или създадем файл, или да сменим показваната директория (папка). Когато отваряме файл, неговото съдържание заменя директорията в прозореца.

Run a Shell (Ctrl-S) отваря в Windows конзолен (DOS) прозорец, като в него текуща директория е тази на текущия файл във Vim. Докато така създаденият конзолен прозорец съществува, с редактора не може да се работи: той „чака“.

Тези две команди, използвани поотделно или заедно, са удобен инструмент за преместване по съдържанието на диска и изпълняване на действия в различни директории. Например, като отворим конзолен прозорец в директорията на програмен файл, можем да компилираме, свързваме или изпълняваме дадената програма по начини, които не са предвидени в останалите команди. Друг пример: ако искаме да отворим в редактора файл, избран от директорен прозорец, като запазим и прозореца с директорията, можем с Ctrl-D да дублираме директорията в нов прозорец, а в него да изберем и отворим нужния файл.

Справки за C и STL чрез Vim

В помощ на програмиращите на C и C++ към справочната система на Vim в комплектa [2] съм добавил два справочника: по C и стандартната му библиотека и по STL. И двата документа са добре известни в друг вид: първото е извлечено от документацията на компилатора gcc, а второто е авторското (Степанов и др.) описание на STL от фирмата SGI, което е добре познато във формат HTML.

Като интегрирани в справочната (help) система на Vim, тези четива са удобни с две допълнителни свойства: възможността за автоматизирано търсене по дадена дума и улесняване на търсенето във всеки справочник изобщо, тъй като всеки от тях се намира в по един (текстов) файл. Когато такъв файл бъде отворен успоредно с програмата, той прави по-удобно и автоматичното допълване на имена (с Ctrl-N) в нея, тъй като за целта Vim търси във всички текущо отворени файлове.

Ето основните команди за използване на двата справочника:

\cc  съдържание на справочника по C и библиотечните му функции

\cr  справка за оператор или функция на C, върху който или която е курсорът

\cw  справка за изрично посочен (изписва се допълнително) оператор или функция на C

\tc  съдържание на справочника по STL

\tr  справка за тип или метод от STL, върху който е курсорът

\te  пример за използване на тип или метод от STL, върху който е курсорът

\tw  справка за изрично посочен (изписва се допълнително) тип или метод от STL

Писане на български (а също на руски, английски и др.) с Vim

За писане с азбуки, различни от латиницата, както и на технически, математически и други специални знаци и за други подобни цели Vim разполага с т. нар. „клавиатурни таблици“ (КТ, англ. keymaps). Чрез тях на отделни знаци или редици от знаци от клавиатурата се съпоставят знаци от Универсалното кодово множество Уникод (Unicode). По този начин всяка такава таблица определя виртуална клавиатура. Използването на КТ прави писането на ро̀ден или друг език независимо от наличието на инсталиран клавиатурен драйвер за такъв език в операционната система, а и от самата операционна система. КТ са и функционално по-полезни от драйверите, защото чрез КТ могат да се определят по-богати виртуални клавиатури. Освен това създаването и евентуално изменянето на КТ е напълно достъпно за всеки потребител на редактора: КТ са обикновени текстови файлове, а не програми.

За писане на български език, наред с някои допълнителни възможности, съм разработил две такива таблици, отговарящи на двете широко използвани у нас подреждания на азбуката върху клавиатурата, „БДС“ и фонетично. Понастоящем те се разпространяват стандартно с Vim. Макар и по различен начин, двете таблици дават на пишещия еднакви възможности. И двете таблици определят съответствия не само за българската азбука, а и за няколкото букви от руската азбука, които не са в българската, както и за някои препинателни и др. знаци. Те осигуряват възможност и за поставяне на ударения. Всяка от двете таблици позволява да се пише на изцяло правилен в граматично отношение български, руски и английски езици. (Наборът от знаци на стандартната клавиатура не позволява това дори за английския!)

В текстов режим на редактора клавиатурата работи или по обичайния начин, възпроизвеждайки това, което е написано на клавишите, или с използване на КТ. Преминаването от едното към другото и обратно става с клавишната комбинация Ctrl-^. Когато клавиатурата е в алтернативен режим, т.е. използва се таблица, текстовият курсор е с друг цвят. Ако в използваната таблица на дадена (обикновено къса, от два или три знака) редица е съпоставен някакъв „превод“, за да получим съответствието тази редица трябва да се изпише с много малко забавяне между частите ѝ; в противен случай получаваме съответствията на отделните клавиши, а не на редицата като цяло.

Основната част от определенията и в „БДС“, и във фонетичната КТ отговаря точно на съответните разполагания, затова не се нуждае от пояснения. По-долу са показани направените в двете КТ допълнителни определения: „бързи редици“ от два или три клавиша и съответно извежданите знаци. Например, за да напишем Ы в БДС трябва да използваме „бързата редица“ CX (латиница), което всъщност отговаря на ЪЙ, тъй като в дадения момент пишем на кирилица. Също за Ы при фонетично подреждане ще напишем ЪИ (лат. YI). Ако съответната „бърза редица“ се изпише бавно, получава се именно ЪЙ или ЪИ.

За подредба БДС
знак: Ё ё Ы « » · ± ° ¬ ¤
клавиши: E:: e:: CX ,, `` '' `. '. << >> -- --- .. ** ,. +- ^o ~~ @@ $$ %% +| ++ ||
За фонетична подредба
знак: Ё ё Ы ы Э э « » § · ± ° ¬ ¤
клавиши: E:: e:: YI yi YE ye ,, `` '' `. '. << >> !! ## -- --- .. ** ,. +- ^o ~~ @@ $$ %% +| ++ ||

Забележки.

  • В руската азбука има точно три букви, всяка като главна и малка, които нашата азбука няма: Ё ё, Ы ы и Э э. В подредбата „БДС“, кой знае защо, са предвидени Ё, ё и Ы, а другите три отсъстват. Клавиатурната таблица за Vim поправя този пропуск.
  • Подредбата „БДС“ включва и използваните у нас и другаде в Европа, но не в Обединените Щати (което е правилният превод на United States) § и . Никое от изброените не присъства във фонетичното подреждане – то съдържа само българската азбука. Съответната на фонетичното подреждане КТ за Vim задава свои, „нестандартни“ съответствия за тези букви и знаци.
  • Останалите знаци са за поставяне на кавички, тирета, многоточие, обозначения за валута и пр. Например кавичките в българския език се пишат „така“, а в някои случаи се използват т.нар. горни запетаи (’…’). Следва да различаваме тире () от чертица или малко тире (-); второто е представено непосредствено на клавиатурата, а първото, чрез коя да е от двете КТ, задаваме с --. Кавичките в руския език са « и »). В английския граматически правилните двойки кавички са ‘ ’ и “ ” (обърнете внимание, че никой от тези четири знака не присъства непосредствено на клавиатурата и че " не е знак за кавички в никой език). Също в английския се използва и дългото тире, което, както е ясно от по-горе, във Vim можем да напишем с ---. Споменатите знаци се използват и в някои други езици.

Която и от двете КТ за български език да използваме, ударение можем да поставим с помощта на „бързата редица“ ^`, която набираме непосредствено след (в текста, не във времето) съответната гласна. За пълнота присъства и ударението в руския език (дясно) – то се поставя с помощта на редицата ^'.

Конфигурационният файл _vimrc задава фонетичната таблица като подразбираща се. Можем да изберем „БДС“ за такава, като преместим коментарния знак " в този файл от …bds на …phonetic. С помощта на командите
            :set keymap=bulgarian-bds  и
            :set keymap=bulgarian-phonetic,
можем да избираме коя таблица да ползваме и по време на работа с редактора.

Включените допълнително, наред с азбуката, знаци в двете КТ са всички от т.нар. „кодова страница cp1251, която у нас е засега най-широко използваното представяне на кирилица. (Предполага се в бъдеще все повече да се използват не кодови страници, а споменатото универсално кодово множество – Уникод, което вмества всички „страници“, азбуки, математическа и техническа писменост и др.) Буквите с ударения обаче за съжаление не са в cp1251.

(Горното не означава, че вместо ударената гласна ѝ можем да използваме съгласната й – нелепа, безотговорна и много неграмотна практика, за съжаление напоследък широко разпространена. Ако не можем да използваме ѝ, заради несъвместимост с cp1251 или друга причина, много по-приемливо е да поставим на негово място просто и.)

Представеният в cp1251 текст би трябвало да се „разбира“ без трудности от всяка четяща текст програма у нас. Немалко програми разбират и Уникод, но тъй като (засега) той не се подразбира, за правилното прочитане на такъв текст от друга програма може да са нужни някои допълнителни действия. Vim, във вида, в който съм го подготвил в [2], е настроен така че да разпознава сам дали прочитаният от него текст е cp1251 или utf-8 (вид представяне на Уникод) и записва файла по същия начин както е прочетен. Новосъздаваните файлове пък се записват по подразбиране в cp1251. От друга страна, Vim е настроен и, независимо от представянето на файла, да използва utf-8 като свое вътрешно представяне – така че можем да пишем без ограничения на включваните знаци. Ако обаче се опитаме да запишем текст в cp1251 или друга кодова страница, в която този текст не е представим, Vim съобщава за това и не извършва записа.

Представянето (кодирането) на файл може да се зададе изрично напр. с
            :set fenc=utf-8  или
            :set fenc=cp1251
(fenc е съкр. от file encoding).

Игри

Някои популярни игри са реализирани като програми на скриптовия език на Vim и могат да се играят в редактора. В моя комплект съм включил Tetris и Sokoban.

За да стартирате Tetris, трябва да напишете като „бърза редица“ \tet. За Sokoban използвайте командата :Sokoban. И в двата случая нататък е ясно … :)

Препратки

  1. Главна страница на редактора Vim
  2. Архив на Vim за Windows, „опакован“ с приставки и подходящо конфигуриран за програмиране на C и C++

—Б.Б.