Александър Иванов
cream в режим „expert“
glatcyt.vim — един полезен макрос за vim на пайтън
Оф! Въобразяваш си, че пишеш на кирилица, но си забравил да превключиш клавиатурата и всъщност въвеждаш латински букви. Аз понякога успявам да въведа до два-три реда така. Много е досадно!
Още повече, че се прави и обратната грешка — мислиш, че пишеш на латиница, а си включил кирилската клавиатура.
Предлагам тук една програмка — макрос за vim/gvim/cream, — която дава възможност след като маркираш грешно въведения с латиница или с кирилица текст, да натиснеш клавиша F12 и да оправиш работата.
Замислих я като учебна програма — да ви покажа как може да се включи програмка на друг интерпретаторен език (в случая — пайтън) в сценарий (програмка) на Vimscript. Ма тя си работи добре и аз вече доста време я използвам.
Такива програмки се пишат още от досово време и не е сложно да се направят, ако клавишите на латинската и кирилската ви клавиатура са в едно-еднозначно съответствие. Ама в някои кирилски клавиатурни подредби са включени латинските букви X, V и I, за да се изписват римски цифри — това, разбира се, ще довежда до грешка при транслитерирането на римските цифри и е една от причините в Unicode да са включени римските цифри на отделна страница (от U+2160 до U+2188).
За да работи макросът, първо, vim/gvim трябва да е компилиран с поддръжка на пайтън, ама всички съвременни версии са така. После, разбира се, трябва да е наличен и Python.
За да проверите как стоят нещата, стартирайте cream и в командния ред напишете:
:py print "Здрасти!"
Опитайте и
:py3 print "Здрасти!"
Новите версии на vim/gvim/gream са компилирани с поддръжка на Python 3.x.
Да, ако всичко е наред, може да изпълнявате такива едноредови програмки чрез интерпретатора на пайтън. В линукс вероятно няма да имате никакви проблеми. В Windows не е точно така, дори ако сте инсталирали вече интерпретатора на пайтън.
Причината е, че редакторът в Windows използва „вградена“ (embedded) версия на интерпретатора, тоест, използва библиотека с динамично свързване python26.dll — свалете я и я запишете в C:\WINDOWS\system32.
Сега това работи. В бъдеще могат да компилират редактора vim/gvim за Windows с по-нова версия на пайтън. Може да проверите версията, като изпълните в cream командата :version — гледайте последния раздел Compilation: там трябва да има -DDYNAMIC_PYTHON_DLL= и в кавички името на необходимата библиотека.
Много ми се искаше макросът да разпознава настройката за кодировка на системата. И в линукс това е осъществимо. Но се оказа, че в библиотеката с динамично свързване към пайтън за Windows модулът locale не е включен и разпознаването не работи. Това било известен проблем.
Затова представям два варианта на макрокомандата — за линукс (кодировка UTF-8 или cp1251) и за Windows (кодировка cp1251). Може да си изтеглите подходящия вариант от glotta.
За да се използва макросът, разбира се, трябва да се изпълни в линукс:
:so glatcyr.vim
и в Windows:
:so glatcyr_win.vim
Ако програмката ви харесва, сигурно ще поискате да се зарежда автоматично, щом стартирате cream.
В Windows просто запишете файла glatcyr_win.vim в директорията plugin на vim — най-вероятно тя е C:\Program files\vim\vim73\plugin.
В линукс има повече варианти. Една от възможностите е да намерите файла cream-user.vim (в Debian и в Ubuntu той е в /etc/cream/) и да добавите в него:
if filereadable("/home/user/glatcyr.vim") source /home/user/glatcyr.vim endif
Естествено, пътят до файла при вас ще е друг — редактирайте го.
Ако искате да използвате макроса и във vim/gvim, запишете същите команди във файла /etc/vim/vimrc. Разбира се, за да пишете в /etc/cream/cream-user.vim и в /etc/vim/vimrc, трябва да приемете правата на свръхпотребител (root).
За да проверите дали се зарежда правилно файлът, изпълнете в cream командата:
:verbose map <F12>
(Не се пише <F12>, а се натиска клавишът F12.)
Може да промените клавиша, с който се стартира програмата, ако не ви харесва F12. Това се прави на първия ред, където е командата :map. Във vim има цяла, доста сложна система за mapping, тоест за препрограмиране на клавиши и клавишни комбинации. В раздела 28. Още информация аз съм включил препратки по тази тема, където това май е обяснено по-добре, отколкото в помощната информация на vim.
Отворете сега макроса като текст с cream, разгледайте го, за да имат смисъл следващите ми обяснения.
Програмката glatcyr.vim е малка — в нея даже моите обяснения са повече от програмния текст. Но тя показва как може да се включи програмен текст от друг интерпретаторен език (пайтън) във Vimscript.
Вече показах как с командата :py/:py3 (или :python/:python3) може да изпълнявате програмен код на пайтън както в директния режим на работа с интерпретатора. Но най-хубавото все пак е възможността за интеграция на пайтън (или на друг интерпретаторен език) с Vimscript. За да стане това „собствена“ команда на vim, трябва да се обяви функция на Vimscript и вътре в нея да се вгради „чуждият“ код. Редът
python << ENDPY
сигнализира на Vimscript, че започва код на пайтън; той продължава до реда, на който има само ENDPY. Впрочем ENDPY не е задължителна дума — това е просто низ, който си избира програмиращият, та може да срещнете и други варианти: END, EOF, EOL, PYTHONEND и пр. Впрочем тази техника (да се вмъква в програмния текст на един интерпретаторен език програмен текст от друг интерпретаторен език) работи в много случаи, включително в bash — командния интерпретатор на линукската конзола. Не е лошо.
В кода на пайтън могат да се импортират модули, като модулът vim осъществява интерфейс с „обектите“ на vim и е, така да се каже, задължителен — тук аз съм използвал методите vim.eval(), за да прихвана регистъра „a“, и vim.command(), за да запиша резултата обратно в регистъра.
Изглежда, че във Vimscript не е толкова лесно да се прихване само маркираният текст; най-просто решение е да се прекара той през някой регистър за временно съхраняване. Тук старото съдържание на регистъра се запазва в локалната памет s:a_save и се възстановява в края на програмката. Така че тя не променя съдържанието на никой регистър.
В питонската част на макроса се използва същата техника — в паметта old_text се запазва оригиналът на маркирания текст и при грешка се възстановява.
Обърнете внимание на паметта BDS в инициализиращата част на питонския текст — може да я използвате като превключвател между клавиатурната подредба по БДС (True) и тъй наречената „фонетична“ подредба (False).
При необходимост може да редактирате съдържанието на стринговите памети inStr и outStr. Принципът на работа на програмата е прост — символът от входния текст се търси в inStr, а в създавания транслитериран текст се вписва символът от същата позиция в outStr. Само не забравяйте, че кавичката и падащата наляво чертица (backslash) трябва да се екранират.
Вариантът за линукс glatcyr.vim е малко по-сложен, защото се опитва автоматично да определя кодировката чрез метода locale.getdefaultlocale(), а това предполага и четири двойки стрингове за транслитерация.