Лого на страниците (малко).

Заглавна страница > Четива > Четива за глотометрията > cream в режим „expert“ > glatcyt.vim — един полезен макрос за vim на пайтън

 

Александър Иванов

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(), а това предполага и четири двойки стрингове за транслитерация.

Страница: А. И.
Електронна поща
Дата на публикуване: 15.V.2014
Последна редакция: 27.IV.2023
Съобразено с
html5/css3