Tuesday, March 11, 2008

Vim localization

Давно вже хотів написати про мій досвід використання української мови (та й російської теж) в Vim, і ніяк не міг за це діло взятись. Але врешті-решт я це зробив!

Vim — один з найпопулярніших текстових редакторів. Докладніше про Vim можна почитати на домашній сторінці та на сторінці в wikipedia.

Цей редактор дозволяє значно підвищити швидкість роботи з текстом. На жаль, до недавнього часу, при роботі з кириличними текстами, я піддавав сумніву це твердження. Саме про це й піде мова далі.

Використання кириличної розкладки

Як відомо Vim має декілька режимів роботи (хоча як говорить мій друг Hobbin "Vim має два режими в одному — пищить, а в іншому все псує" :)). Так от, без спеціального налаштування, Vim в нормальному режимі не сприймає команди набрані кириличною розкладкою. Далі наведено два методи для подолання цього неподобства.

Метод I. Використання langmap

Доповнити _vimrc такими рядками (простіше вчинити як я — просто використати _vimrc колеги)

" Cyrillic keys support
:set langmap=ФИСВУАПРШОЛДЬТЩЗЙКІЫЕГМЦЧНЯЖЮЇЪ;ABCDEFGHIJKLMNOPQRSSTUVWXYZ:>}},
фисвуапршолдьтщзйкыіегмцчняжюїъ]];abcdefghijklmnopqrsstuvwxyz\;.\,,\;;


Саме так я жив досить довгий час. Але при наборі команд в режимі командного рядка все одно доводиться переключатися до латинської розкладки. Ця проблема вирішується при використанні методу II.

Метод II. Використання keymap

Виявляється Vim дозволяє підключити зовнішню розкладку клавіатури за допомогою команди set keymap, і перключати розкладки вже всередині самого редактора за допомогою команди <ctrl-6> (в режимі редагування).

В директорії $Vim\vim71\keymap (для Vim версії 7.1) серед інших, я знайшов файл ukrainian-jcuken.vim (by Anatoli Sakhnik) з українською розкладкою звичною для Linux. Але так як я звик до Windows варіанту (та й клавіатури тільки з Windows розкладкою попадались :)), то вирішив створити українську розкладку характерну для Windows. За основу я взяв файл з російським аналогом russian-jcukenwin.vim (by Artem Chuprina), де добавив відповідні українські символи, та добавив апостроф замість букви "ё". Розкладка з апострофом використовується у Windows Vista під назвою ukrainian enhanced. Так і я назвав свою. Сам файл опублікував серед скриптів vim за адресою http://www.vim.org/scripts/script.php?script_id=2165. Якщо така розкладка виявиться корисною іще для когось, то я скористаюсь порадою Анатолія Сахніка і напишу листа до vim_dev з пропозицією добавити її до дистрибутиву Vim. Наразі, судячи з рейтингу -1/1, цей скрипт не викликає захоплення у Vim спільноти :). Для того щоб скористатися розкладкою, просто збережіть файл до директорії $Vim\vimfiles\keymap та розширте _vimrc таким:

" Ukrainian layout support. Use <ctrl-6> (<ctrl-^>) in Insert mode, to toggle layouts.

set keymap=ukrainian-enhanced
" Default - latin layout
set iminsert=0
" Default - latin layout in search mode
set imsearch=0

Для того щоб переключити розкладку, використовуйте <ctrl-^> (<ctrl-6> в Windows).

Навігація по словам

Vim неправильно опрацьовує команди навігації пов'язані з визначенням слова, такі як w — слово вперед, e — перейти до кінця слова, b — слово назад, * — знати в тексті слово під курсором, і т.п. Це стосується тільки версії Vim для Windows. Щоб вилікувати цю хворобу, достатньо добавити в файл конфігурації _vimrc такий рядок:

" Support for words in cyrillic.
" Default for Windows is: @,48-57,_,128-167,224-235
set iskeyword=@,48-57,_,А-Я,а-я,І,і,Ї,ї,Є,є,Ґ,ґ

В першоджерелі використовується рядок базований на символьних кодах:

set iskeyword=@,48-57,_,192-255

, і це мабуть правильно, але, як на мене, там вказано аж надто широкий діапазон кодів, та й використання символьних значень здається більш очевидним. Можливо згодом виникнуть якісь проблеми пов'язані з різними кодуваннями, але поки що перший варіант працює, тому я зупинився на ньому.

Трохи гумору


Використані джерела:

Домашня сторінка Vim
Vim — Википедия
Vim — Викиучебник
Все о Vim: Русский язык в Виме
:help keymap
:help langmap
:help iskeyword

10 comments:

Anonymous said...

Дякую за корисну інформацію.

Спробую припустити, що цей корисний файл з розкладкою не був гідно оцінений тому, що він не працює під Linux. Просто показується багато помилок при спробі використати його.

Варто зберегти файл в кодуванні UTF-8 (це, здається, зроблено) та з Unix line endings.

Після цього файл повинен коректно завантажуватись і в Linux і в Windows. Але в Windows я не первіряв.

Ivan Korneliuk said...

Дуже дякую! Завантажив виправлений файл на http://www.vim.org/scripts/script.php?script_id=2165

Anonymous said...

Ctrl+6 зазвичай використовується для переключенням до останнього буфера.

Please respect defaults :)

Anonymous said...

А сорі, то ж Insert mode :)

Загалом корисна стаття

Unknown said...

Спасибо за плагин! Кстати, можно не заморачиваться с входом/выходом в normal mode при включенной украинской раскладке, для этого на сегодняшний день существует: https://github.com/lyokha/vim-xkbswitch + https://github.com/ierton/xkb-switch (я говорю про Linux)

Плагин автоматически переключает с любой не латинской раскладки при нажатии Esc в insert mode, т.е. не нужно задумываться какая текущая раскладка при переходе в normal mode.

Unknown said...

Дякую за корисний keymap.
В інструкції по інсталяції вказано, що необхідно копіювати до системного vimfiles. Мені здається, що краще копіювати у ~/.vim/keymap/ukrainian-enhanced.vim за двома причинами:
1. не треба sudo
2. це убережа нас від випадку коли системний пакет буде оновлений.

dahn-d said...

thx, став в нагоді Ваш покращений скрипт

dahn-d said...

лише для мене є одна маленька прикрість: на numpad-і кнопка / перекладається в крапку (очевидно чому), так само як і крапка перекладається в букву ю. я часто використовую /, то ж було б класно, якщо метод keymap дозволяє відрізняти клавіші numpad-а

Unknown said...

Дуже корисно, але як бути коли потрібна ще й російська мова? Адже вже зайнято за переключенням на українську

Petro Khoroshyy said...

до останнього коментаря: українська розкладка в лінуксі дозволяе набирати російські літери.

до автора:
гарно, я от ніяк не можу заставити емаксовий евіл-мод розуміти українську.