Редакторът Vim Увод • Програмиране на C и C++ • Писане на български и други езици • Препратки Текстовият редактор Vim е един от най-широко използваните в света, особено сред програмистите. Използва се за писане и редактиране на текстове от всякакъв вид: програми, научни публикации, уебстраници, художествена проза, електронна поща. Работи по идентичен начин в цял ред операционни системи. На пръв поглед странен в някои отношения, той се оказва изумително ефективен и универсален инструмент. Доброто му опознаване изисква известни усилия – както при всяка функционално богата система – но в случая с Vim тези усилия винаги са щедро възнаградени. Работата с Vim дава усещане за удовлетворение, защото почти винаги е възможно да се постигне точно този резултат и този начин на работа, който изглежда най-естествен и ефективен от гледна точка на дадена цел. И още нещо: колкото и дълго да си служи човек с Vim, винаги остава място за някоя приятна изненада, като научаване на нещо ново или откриване на нов начин да се изпълни определена задача. Тук обаче няма да описвам подробно възможностите на редактора, а ще дам само някои кратки сведения за използването му, достатъчни за начално запознанство и използване на основните възможности за боравене с текст и с файлове като цяло. Следващата част е посветена на това. По-нататък се описва използването на Vim като проста интегрирана среда за програмиране. Накрая се дават сведения за писане на български чрез Vim. Увод в използването на VimНай-важната отличителна особеност на Vim е тази, че той работи в няколко различни режима. Основните са два: текстов и команден. В текстов режим клавиатурата служи за писане на текст – вмъкване сред стария или писане върху него (замяна), а в команден (наричан още нормален) – за задаване на команди. Някои команди са изведени в менюта и по този начин могат да се изпълнят винаги, дори в текстов режим. Терминът „нормален“ подсказва, че на този режим се гледа като на основен, преобладаващ за работещия с редактора. Това може да изглежда странно, но само на пръв поглед. Да смятаме командите, т.е. действията с текста, а не самото му набиране за основно означава, че слагаме ударението върху редактирането – преместване по текста, вмъкване, изтриване или замяна на части в него и др. И наистина това е естествено! Ако основното беше набирането на текст (последователно, без промени), за него не е нужна програма-редактор: достатъчно е само да копираме идващото от клавиатурата във файл. Непосредствено след стартиране Vim попада в нормален режим. Някои команди се изпълняват изцяло в такъв режим, а други водят до преминаване в текстов. За преминаване от текстов режим в нормален натискаме клавиша Esc. Видът на курсора показва в какъв режим се намира редакторът: правоъгълен блок за нормален режим, вертикална чертица за текстов режим с вмъкване, и хоризонтална чертица под реда за текстов режим със замяна. Командите биват два вида: „нормални“ и „двуточкови“. Първите се задават с един или няколко знака. Вторите са като правило по-дълги – имената им се задават с думи, започват със знака : (двоеточие) и някои имат аргументи и уточнители („опции“). Като напишем (в нормален режим) :, курсорът се поставя в командния ред, в долния край на работния прозорец на Vim, където дописваме дадената „двуточкова“ команда и я изпълняваме, натискайки Enter. Това действие може да бъде прекъснато с помощта на Esc. Следват някои най-употребявани команди в групи по предназначение. (Умишлено не споменавам тези за търсене и за търсене и замяна по шаблон. Те, разбира се, също са важни, но за изясняване на действието им е нужно много повече от споменаване.)
Командите Командите Командата Командите за преместване, освен сами по себе си, се използват и като „адреси“ в някои команди за промяна, копиране и изтриване. Например Още по-голямо разнообразие се получава, като се комбинират тези команди и с повторител. Например Търсене в рамките на ред (командите Други примери за комбинирани команди следват по-долу. С помощта на Vim като „интегрирана среда“ за C и C++Дори и в своя „суров вид“ Vim предоставя възможност да компилираме и изпълним програма на C или C++ (а и други езици) непосредствено от редактора. Това обаче изисква известна ръчна работа, която, макар и неголяма по обем, може да бъде досадна, когато се изпълнява многократно. Освен това, понякога тези действия се оказват затруднителни за не много сведущи в особеностите му потребители на редактора. Затова архивът включва като интегрирана в редактора малка програма-приставка (plug-in) на скриптовия език на самия редактор, която написах именно за да се избегнат с нейна помощ споменатите неудобства. Тя автоматизира компилирането и изпълняването на еднофайлови програми на C и C++, както и някои съпътстващи действия, като по този начин придава на Vim свойства на интегрирана среда за програмиране. Съществуват разнообразни други скриптови програми, с голям брой функции, вкл. работа с многофайлови програми, проследяване на цитирания между файлове, работа в колектив и какво ли още не. Те превръщат Vim в наистина пълноценна интегрирана среда за професионално програмиране, но са и значително по-сложни за използване. Описваното тук, от своя страна, е съвсем леко за овладяване и по-добре съобразено именно с нуждите на индивидуалното програмиране, и то на програми, състоящи се от един файл, и особено този вид програмиране, който е характерен за състезанията. Приставката присвоява някои необходими действия на определени клавиши, а образува и командно меню от същите действия. Менюто се нарича C/C++ и в него успоредно с командите, за напомняне са изписани и съответните им клавиши. За да може да се изпълни която и да е от командите, свързани с компилиране или изпълнение на програма, в текущо отворената страница на редактора трябва да има точно един файл с програма на C или C++. (Vim може да работи с множество страници, като във всяка има един или повече отворени прозорци за редактиране, в които се разполагат файлове. Всеки файл може да заема един или повече прозорци.) Ако в страницата на редактора липсва програмен файл или има повече от един, при опит за компилиране или изпълнение се появява съобщение за грешка. Като казваме „програма на C или C++“, разбираме файл с разширение на името .c, .cc, .c++, .cpp или .cxx: първото е за C, а останалите са приетите разширения на C++. Безименните файлове не се броят, независимо от това дали съдържат програма. Въпреки че в страницата може да има само една програма, допуска се тя да заема няколко прозореца. Възможно е, разбира се, да имаме и произволно много „непрограмни“ файлове – например такива с входни данни или файлове, които са резултат от изпълнението на програмата, файлове .h, справочни и др. Съдържанието на другите страници, ако има отворени такива, няма връзка с това на текущата. По този начин можем да имаме различни програми, с които работим в различни страници. Когато компилираме програма (Compile and Link или F7) се случва следното. Намира се прозорец с програмата; ако текущият не е такъв, текущ става един от „програмните“ прозорци. Ако файлът с програмата има незаписани промени, прави се запис (save). Програмата се компилира със съответния компилатор (C или C++) и ако при това няма грешки се свързва: образува се изпълним файл. Прозорецът за съобщения за грешки се отваря ако такива има, а ако не и е бил отворен – затваря се. Щракане с мишката върху грешка в прозореца за съобщения закарва курсора на съответното място в програмата. Командата (Build and) Run или F5 намира програмния файл както по-горе, компилира и свързва ако е нужно и след това изпълнява програмата. „Когато е нужно“ означава, че изпълним файл няма или той е по-стар от този с текста на програмата (което може да се случи и поради автоматичното записване на последния когато е променян, както бе описано по-горе). Разбира се, ако при компилирането възникнат грешки, постъпва се както по-горе, а програмата не се стартира. Run on a Selection (F6) е малко по-особена команда. При нея стандартният вход се пренасочва към „визуално избрана“ част от текста, каквато трябва да има в текущия прозорец на редактора. Трябва да имаме предвид, че в случая за избрани се смятат винаги цял ред или редове, дори когато избраното съдържа само части от тях. При последната команда програмата не се компилира и свързва. Ако това е нужно, трябва да го направим с F7, както по-горе. В менюто C/C++ има и две команди, които не са пряко свързани с програмирането, но изпълняват твърде полезни съпътстващи действия. Те могат да се изпълняват и без да има отворен файл с програма, или когато има повече от един такъв, т.е. винаги. List a Directory (Ctrl-D) образува в редактора прозорец със съдържание директорията на текущия файл. Ако „текущият файл“ е точно такъв директо̀рен прозорец, създава се негово копие. Директо̀рните прозорци на Vim имат особени функции, подобни на Explorer в Windows или др. под. програма: в такъв прозорец можем да отворим, изтрием, преименуваме или създадем файл, или да сменим показваната директория. Когато отваряме файл, неговото съдържание заменя директорията в прозореца. Run a Shell (Ctrl-S) отваря в редактора конзолен прозорец, като в него текуща директория е тази на текущия файл във Vim. В прозореца се изпълняват команди на операционната система и други програми. Когато изпълнението на командния интерпретатор завърши (с командата Последните две команди, използвани поотделно или заедно, са удобен инструмент за преместване по съдържанието на диска и изпълняване на действия в различни директории. Например, като отворим конзолен прозорец в директорията на програмен файл, можем да компилираме, свързваме или изпълняваме дадената програма по начини, които не са предвидени в останалите команди. Ако искаме да отворим в редактора файл, избран от директорен прозорец, като запазим и прозореца с директорията, можем с Ctrl-D да дублираме директорията в нов прозорец, а в него да изберем и отворим нужния файл. Писане на български (а също на руски, английски и др.) с VimЗа писане с азбуки, различни от латиницата, както и на технически, математически и други специални знаци и за други подобни цели Vim разполага с т. нар. „клавиатурни таблици“ (КТ, англ. keymaps). Чрез тях на отделни знаци или редици от знаци от клавиатурата се съпоставят знаци от Универсалното кодово множество Уникод (Unicode). По този начин всяка такава таблица определя виртуална клавиатура. Използването на КТ прави писането на ро̀ден или друг език независимо от наличието на инсталиран клавиатурен драйвер за такъв език в операционната система, а и от самата операционна система. КТ са и функционално по-полезни от драйверите, защото чрез КТ могат да се определят по-богати виртуални клавиатури. Освен това създаването и евентуално изменянето на КТ е напълно достъпно за всеки потребител на редактора: КТ са обикновени текстови файлове, а не програми. За писане на български език, наред с някои допълнителни възможности, съм разработил две такива таблици, отговарящи на двете широко използвани у нас подреждания на азбуката върху клавиатурата, „БДС“ и фонетично. Тези таблици се разпространяват стандартно с Vim. Макар и по различен начин, двете дават на пишещия еднакви възможности. И двете таблици определят съответствия не само за българската азбука, а и за няколкото букви от руската азбука, които не са в българската, както и за някои препинателни и др. знаци. Те осигуряват възможност и за поставяне на ударения. Всяка от двете таблици позволява да се пише на изцяло правилен в граматично отношение български, руски и английски езици. (Наборът от знаци на стандартната клавиатура не позволява това дори за английския!) В текстов режим на редактора клавиатурата работи или по обичайния начин, възпроизвеждайки това, което е написано на клавишите, или с използване на КТ. Преминаването от едното към другото и обратно става с клавишната комбинация Ctrl-^. Когато клавиатурата е в алтернативен режим, т.е. използва се таблица, текстовият курсор е с друг цвят. Ако в използваната таблица на дадена (обикновено къса, от два или три знака) редица е съпоставен някакъв „превод“, за да получим съответствието тази редица трябва да се изпише с много малко забавяне между частите ѝ; в противен случай получаваме съответствията на отделните клавиши, а не на редицата като цяло. Основната част от определенията и в „БДС“, и във фонетичната КТ отговаря точно на съответните разполагания, затова не се нуждае от пояснения. По-долу са показани направените в двете КТ допълнителни определения: „бързи редици“ от два или три клавиша и съответно извежданите знаци. Например, за да напишем Ы в БДС трябва да използваме „бързата редица“ CX (латиница), което всъщност отговаря на ЪЙ, тъй като в дадения момент пишем на кирилица. Също за Ы при фонетично подреждане ще напишем ЪИ (лат. YI). Ако съответната „бърза редица“ се изпише бавно, получава се именно ЪЙ или ЪИ.
Забележки.
Която и от двете КТ за български език да използваме, ударение (гравис) можем да поставим с помощта на „бързата редица“ Конфигурационният файл Включените допълнително, наред с азбуката, знаци в двете КТ са всички от т.нар. „кодова страница cp1251“ – широко използвано в MS Windows представяне на кирилица. Все повече се използват не кодови страници, а споменатото универсално кодово множество – Уникод, което вмества всички „страници“, азбуки, математическа и техническа писменост и др. Буквите с ударения обаче за съжаление не са в cp1251. Горното не означава, че вместо ударената гласна ѝ можем да използваме съгласната й – нелепа, безотговорна и много неграмотна практика, за съжаление напоследък широко разпространена. Ако по каквато и да е причина не можем да напишем ѝ, много по-приемливо е да поставим вместо него просто и. Представеният в cp1251 текст би трябвало да се „разбира“ без трудности от всяка четяща текст програма у нас. Немалко програми разбират и Уникод, но тъй като той не навсякъде се подразбира, за правилното прочитане на такъв текст от друга програма може да са нужни някои допълнителни действия. Vim е настроен така, че да разпознава сам дали прочитаният от него текст е cp1251 или utf-8 (вид представяне на Уникод) и записва файла по същия начин, както е прочетен. От друга страна, Vim е настроен и, независимо от представянето на файла, да използва utf-8 като свое вътрешно представяне – така че можем да пишем без ограничения на включваните знаци. Ако обаче се опитаме да запишем текст в cp1251 или друга кодова страница, в която този текст не е представим, Vim съобщава за това и не извършва записа. Представянето (кодирането) на файл може да се зададе изрично напр. с Препратки |