6 июля 2010 в 20:04

Vim и кириллица: парочка приёмов

VIM*
image

Раньше для редактирования обычных русскоязычных текстов, я обычно откладывал Vim в сторонку и прибегал к помощи других редакторов. Причиной этому была парочка очень неприятных косяков:
  1. На каждый чих приходилось сто раз переключать раскладку, чтобы корректно ввести пару команд и вернуться обратно. Например, замена буквы-опечатки в только что написанном слове, выливалось в: switch → добраться до буквы, нажать r → switch → [нужная буква] → switch → A → [пишем дальше]. Ад!
  2. Штатный spell checker букву «ё» не любил и любое слово с её участием предлагал заменить на аналог через «е». А я ё люблю, меня это расстраивало.

И вот, наконец, я нашёл решение обеим проблемам. Сижу сейчас и набираю этот текст в Vim. Любопытно, что оба барьера обходятся штатными средствами, без дополнительных плагинов. Поскольку материалов на английском и на них основанных куда больше чем исконно русских, найти эту информацию мне было не просто. Поэтому хочу поделиться ей с теми кому интересно.

Переключение раскладки


Я много раз встречался с предложением перемапить символы кириллицы на латинские буквы вроде такого:

map й q
map ц w
map у e
map к r
map е t
map н y
" ... и т.д.

Это решение мне не нравилось из-за того, что оно оставляло несколько проблем. Например, нельзя перемаппить пунктуацию, поэтому двоеточие и слэш на русской раскладке в любом случае переезжают на новые места. Также в режиме вставки нельзя воспользоваться комбинациями вроде Ctrl+W или Ctrl+R. Всё это раздражало.

Нужно другое решение и оно нашлось! В .vimrc:

set keymap=russian-jcukenwin
set iminsert=0
set imsearch=0
highlight lCursor guifg=NONE guibg=Cyan

Теперь разъяснения. В Vim есть такая штука, как lmap. Она задаёт преобразование для всех случаев, когда речь идёт о вводе символов, как части текста, но не как части команды. Так lmap учитывается при вставке, вводе паттерна поиска, после команд r и f.

Команда «set keymap=russian-jcukenwin» устанавливает кучу таких lmap, которые соответствуют обычной виндовой йцукен клавиатуре. russian-jcukenwin — это просто имя файла с маппингами. Нужный нам уже есть в стандартной поставке.

После установки keymap можно переключаться между кириллицей и латиницей нажатием Ctrl+^. При этом происходит чего и добивались: команды и шорткаты ни коем образом не страдают при активной русской раскладке. Ура!

Сброс iminsert и imsearch необходим, чтобы самый первый раз вставка и ввод паттерна поиска начались с латиницы. По сути, Ctrl+^ переключает эти значения между 0 и 1.

Последняя строка обеспечивает изменение цвета курсора на голубенький, когда включена альтернативная раскладка. То есть кириллица в нашем случае. Очень удобно.

Буква Ё


Предложения не умничать и печатать через «е» или добавлять слова через «ё» в словарь дополнений по ходу работы мне так же не понравились. Нужно было другое решение и оно было под ногами!

:setlocal spell spelllang=ru_yo,en_us

…вместо везде пропагандируемого

:setlocal spell spelllang=ru_ru,en_us

…просит Vim использовать словарь со словами через «ё». А это именно то, что нужно. После этой команды ]s и [s больше не спотыкаются об каждую «ё».

Всё, теперь остальные редакторы не нужны. Всем спасибо. Надеюсь, окажется полезным.
+93
10690
159
nailxx 48,5

Комментарии (91)

+6
Helg, #
Спасибо тебе, добрый человек. Меня так долго огорчала эта проблема…
0
iNight, #
Огромное спасибо! Vim я начал использовать совсем недавно, и честно говоря не думал, что вообще есть решение этой проблемы с раскладкой. Частенько для правки русского текста приходилось использовать mcedit, с буквой ё ещё не сталкивался, но думаю, раз это тут упомянуто, то проблема действительно серьёзная.

По поводу :setlocal spell spelllang=ru_yo,en_us
Это тоже в .vimrc писать?

И ещё вопрос, у меня в ~ есть только .viminfo, .vimrc надо создать?
0
nailxx, #
Welcome!

Не не. Если видете что-то, что с двоеточия начинается, имеется в виду команда, которая в буфере набирается. Всё это можно и в .vimrc можно написать (только без ведущего двоеточия), тогда оно будет выполнено один раз при старте vim. Тут нужно по ситуации смотреть что куда.

Конкретно здесь команда означает «установить локально, только для этого буффера (setlocal) переменную spell в 1 (spell без всего) и переменную spelllang в «ru_yo,en_us». spelllang определяет набор языков, по которым будет проверяться текст, а выставление spell просто включает проверку. Аналогично :setlocal nospell выключает проверку. Поскольку используется локальная установка, большого толку в .vimrc от неё не будет.

Я для себя в .vimrc написал
:set spelllang=ru_yo,en_us

А включаю/выключаю проверку просто через :set spell и :set nospell

~/.vimrc да, нужно создать или свистнуть где-нибудь. Погуглите «vimrc» — найдёте варианты от минимализма до Вавилонов.
–1
Paul, #
В дополнение к вышесказанному: .viminfo хранит историю и постоянно заменяется самим Вимом, туда писать ничего не надо. Подробнее в :help viminfo.
0
Averrin, #
Видел это решение, не помню, почему меня не устроило. Обхожусь mapами и вот такой самоделкой:
nmap Ж :!setxkbmap us:!setxkbmap us,ru:
0
nailxx, #
А можете рассказать как это работает?
0
Averrin, #
по кнопке Ж (двоеточие) утилитка setxkbmap (линуксовая) выставляет английскую раскладку (сначала удаляя русскую. а то не переключается, а потом снова ее добавляя). Топорно, но универсальное решение. Возможно, что-то подобное можно и под винду.
0
sandello, #
Угу, а настройки раскладки xkb сохраняются (всякие variant и options)? Или все будет «похерено»?
0
Averrin, #
да вроде сохраняются — у меня проблем не было. Но можно прямо сюда дописать, если принципиально, она должна их понимать.
0
xsen, #
Вдохновившись Вашей идей написал себе в ~/.gvimrc вот что:

imap :!setxkbmap us:!setxkbmap us,ru
nmap :!setxkbmap us:!setxkbmap us,ru

Теперь просто при нажатии ESC включается английская раскладка :)
+18
Cord, #
vim — охуенный редактор
+2
azzis, #
Коротко — но ёмко!
0
banderlog, #
grp:lwin_switch
в hal или xorg.conf

на время нажатия LWin переключает раскладку в любом приложении

но мжт так удобнее, надо попробовать
0
sandello, #
В современных линуксах раскладку проще настраивать средствами DE. Раньше было просто — написал то, что нужно в xorg.conf и все работает. Теперь определение и настройка клавиатуры делается средствами HAL. Что бы банально настроить её под себя — приходится искать настроечные скрипты и править их. Работает до первого обновления.
0
damnerd, #
В современных линуксах HAL уже не используется www.archlinux.org/news/502/ :)
Да и DE далеко не у всех есть.
0
naryl, #
А можно что-нибудь вроде

setxkbmap -option grp:caps_toggle,grp_led:caps,compose:r_alt -layout us,ru -variant ",winkeys"

Записать в свой .xsession, .xinitrc, .Xclients и т.д. (зависит от дистрибутива) и не будет зависеть ни от HAL-udev, ни от DE.
0
banderlog, #
попробовал. нефига не удобнее.
+1
Jenyay, #
А нельзя вместо Ctrl+^ как-нибудь использовать привычные комбинации для переключения раскладок?
0
nailxx, #
По-простому, видимо, нет. Дело в том, что привычные переключалки вроде Alt+Shift или Caps Lock состоят только из клавиш-модификаторов и поэтому перехватываются X'ами ещё на подлёте к Vim. Я краем глаза видел хак, который заключался в написании обёрточного скрипта для запуска GVim, который обязывает X игнорировать стандартное поведение и транслировать нажатие Caps Lock именно для Vim в конкретный код символа, который в свою очередь уже мапится в Vim. Короче, не было у меня сегодня столько времени :)
0
Delfino, #
я на протяжении года использую клавишу «LWin» переключения «while pressed», а «RWin» для обычного переключения (если припрет). Это позволило не думать о проблеме горячих сочетаний в линуксовых приложениях при включенной русской раскладке.
+2
MakeInstall, #
Люблю vim :)
Друзья меня называют извращенцем…
+1
sandello, #
друзья используют notepad?
/>
+3
sandello, #
Почему картинка не вставилась??? wiki.tei-c.org/images/7/72/0xbabaf000l.png
0
MakeInstall, #
Да
–9
sam_reaper, #
полезно, но много нынешних Лину/Юни -ксоидов больше привыкли к Емаксу, хотя радует поддержка некоторых вкусностей Вима в нем
+2
shifty, #
Подскажите пожалуйста, как сделать выбор в сторону таких редакторов — Emacs или Vim? Понятно, что это немного сложный выбор, и тут первым ответом напрашивается «кому что удобней».

Почему «нынешние» лину/юни-ксоиды больше привыкли к Emacs?
–11
sam_reaper, #
Емакс сильный графический редактор в отличие от более консольного Вима
+8
nailxx, #
Мммм… нужно будет изучить этот аспект, а то я всё Фотошоп да Гимп
НЛО прилетело и опубликовало эту надпись здесь
+3
nedden, #
Я вообще не понимаю как я ранее это не понял.
Недавно перешел на vim.
Плюсы:
1) Работа происходит только от клавиатуры (лечим туннельный синдром, уменьшаем количество бесполезных мышкодвижений = экономим время)
2) Много скриптов для vim ( куча поддерживаемых языков программирования, подсветка, дебаг, автокомплит, справка, итд)
3) Унифицированная среда для любой системы — скопировал каталог со своими настройками и вуаля — работаешь в привычной среде везде — на удаленном сервере, на чужой машине, под любой OS.
4) Не ест ресурсы.

Минусы:
На мой взгляд их нет, нужно немного привыкнуть.

Теперь вся работа у меня происходит в связке — vim, mc, tig ( для git ), firefox + vimperator
0
ukko, #
О! Вот за tig спасибо! gitk иногда передраконивает постоянно использовать :)
0
Sliver, #
да и по ssh он работает
+1
zer0access, #
Оба редактора достаточно сложны в освоении, что впоследствии сполна окупается. Мой выбор пал в сторону vim, поскольку часто приходилось редактировать конфиги через SSH, а на серверах был как раз vim. Однажды мне надоело бестолково тыкаться по редактору и я решил основательно изучить vim, о чём ни капли не жалею.

В емаксе, помнится, играл в какой-то забавный текстовый квест :)
0
ukko, #
Вам следует только набрать в консоли vimtutor
0
Paul, #
Чтобы выбрать — пройдите для начала тутор по обоим редакторам.

Vim — это очень мощный, но всё же текстовый редактор, Emacs уже ближе к IDE. Соответственно Emacs потяжелее, дольше стартует и всё из этого вытекающее. Но из него вроде и не выходят, в нём живут :) А Vim это редактор, очень хороший редактор.
0
naryl, #
vim — это редактор, да. А emacs — это программная лисп-система, с языком ориентированным на работу с текстом.

Народ на elisp'е скрипты вместо перла пишет.
+4
nailxx, #
По-моему больше привыкших к gEdit, jEdit, Eclipse, Code Blocks, KDevelop, которые при упоминании vim или emacs говорят: «Ой фуууу… Им же по 30 лет, там даже текст по ctrl+c не копируется, о чём тут говорить»
+1
hazg, #
Очень тяжкий труд, пересесть на вим. Мозг надо поменять, согласиться с абсолютно тупыми правилами, тупить, полчаса думать, как блок кода «затабить» (я не говорю о первой попытки выйти из него ))))) )

Собственно, все хорошее легко не дается. Я получил с вима:
1) подсветку всего и вся
2) возможность настроить ВСЕ как я хочу
3) никакой абонентской платы
4) стремный и при ближайшем рассмотрении замечательный скриптовый-язык если мне мало настроек
5) и в виде главного бонуса — редактирования на любом своем хостинге, из любого места, любого кода\текста
\верстки из терминала.
6) Фактически 3 кратную скорость написания кода (лет десять этим занимаюсь, как говорить усе попробовал)

Особо не жалею (о чем?), изучаю дальше)))
+1
qmax, #
никакой абонентской платы?
а какже дети Уганды?
+2
John_Minority, #
set shortmess+=I
" И больше не будет детей Уганды
0
f0b0s, #
я кстати не знаю благодаря какому куску из накопированных конфигов это, но в виндах в gvim у меня работает CTRL+C в режиме вставки. В линуксе раньше работало, после переустановки нет (линукс на сервере, не так существенно, там консоль больше).
0
T0nus, #
source $VIMRUNTIME/mswin.vim
behave mswin
В комплекте с ним идёт скрипт, который помогает виму вести себя в соответствии с виндовыми привычками.
0
naryl, #
Emacs содержит свой IME, что делает настройку хоткеев очень простой и лёгкой, и он даже не конфликтует с viper-mode и vimpulse :3

Если когда-нибудь допилят vimpulse, можно будет о vim'е совсем забыть, а пока в emacs'е редактора нет, предпочитаю vim.
+1
naryl, #
Кому-то не нравится емаксовый IME? Или были проблемы с vimpulse? Скажите за что минус — вместе решим Вашу проблему.
+1
ginonly, #
Спасибо огромное! Ей богу пытаюсь использовать Vim для работы, так как Eclipse и прочие pdt-based java IDE очень тормозные. Но начинает задалбывать уже это постоянное копание в vimrc. Пытают сделать из него полноценную web development IDE, с автокомплитом, браузером классов и функций и прочими фичами… но пока медленно продвигается(
+1
nailxx, #
Pida? А на открытие и перечитывание vimrc можно шорткат в пару кнопок настроить :)
0
ginonly, #
Опа, не видел, интересный проект… спасибо, посмотрю)
0
qmax, #
это разве работает в с кодировкой локали utf8?
0
Angel2S2, #
Работает :)
+2
damnerd, #
Только сегодня с утра решил эту проблему. :) Достаточно в vimrc добавить (писать в одну строчку):

set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯЖ;ABCDEFGHIJKLMNOPQRSTUVWXYZ:,
фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz


После этого можно переключать раскладку штатными средствами (X11 или DE, что уж кто использует).

Читать :help Russian<CR>.
0
nailxx, #
Ценное дополнение, спасибо.
Попробовал… понял, что проблема с пунктуацией остаётся, i_Ctrl+W не работает. Беру на заметку, но остаюсь при своём :)
+1
damnerd, #
Да, я толком ещё не распробовал, в основном код по-английски пишу. Ну и повторюсь, только сегодня озаботился. Так что, может, в итоге воспользуюсь Вашим способом и буду премного благодарен. А пока просто плюсики. ;)
0
ukko, #
С локалью в utf-8 пробовали?
0
damnerd, #
Именно с ней и пробовали.
0
Paul, #
Круто, раньше не работало с UTF-8, значит починили наконец-то.
0
hoxnox, #
Буквально позавчера сменил langmap на keymap. Самой веской причиной явилась необходимость использовать виндовский vim на работе и nix-овый дома. Возникали проблемы с переносом конфига туда и обратно, вследствии разных дефолтных кодировок и кодировок самого .vimrc (сбивались сочетания клавишь при смене онных). Жизнь с keymap стала намного проще. Сейчас вот смену языка на caps забиндю… или на win-key как тут советуют и совсем будет шоколадно!
–2
Symsym, #
Шаманство какое-то, несколько раз пытался начинать настраивать vim, но терпения не хватало, так и пользуюсь минимальными стандартными комбинациями клавиш.
+2
Skammer, #
Это не шаманство, это наркотик 8)
0
BlackTheMad, #
Вот эта пара строк сильно экономит время на копание в .vimrc
" ## Edit .vimrc ##
map ,v :vsp $MYVIMRC<CR>
map ,V :source $MYVIMRC<CR>

Первая маппит на ,v открытие .vimrc в вертикальном окошке, а вторая просит VIM пересчитать файл.

А остальные ваши проблемы вполне себе разрешимы с помощью таких плагинов, как taglist, fuzzy_finder, snipmate и т.д.
+1
damnerd, #
Ещё проще, само пересчитывает vimrc при изменении оного:

autocmd! bufwritepost ~/.vimrc execute "normal! :source ~/.vimrc"

+1
Skammer, #
Не при изменении, а после записи.
0
damnerd, #
Ну собственно, он изменяется после записи. :)

А вообще да, Вы корректнее выразились, спасибо за поправку.
0
hoxnox, #
Не у всех конфиг в home:
autocmd! bufwritepost $VIM/.vimrc source $VIM/.vimrc
0
Ockonal, #
Действительно полезно, спасибо.
–1
metrofun, #
Спасибо работает, но почему при переключание ctrl+^ выскакивает «E21:No alternate file»
+2
metrofun, #
Блин, ну вы реально суперстар, как раз оценил все приимущества обновки )))) Потому, что у меня три локали в системе, а когда програмирую нужны только русский и английский и в добавок теперь VIM пишет какая локаль выбрана, блин супер круто, спасибо ещё раз )
0
offline15, #
как решили проблему? У меня такая же ошибка.
0
nailxx, #
Нажимайте в режиме вставки, не в command mode
0
metrofun, #
Именно, так и решил )
0
vawerv, #
Столкнулся с проблемой, по непонятной причине изменение цвета курсора (highlight lCursor guifg=NONE guibg=Cyan) не работает при запуске. Заводится, только если вбить вручную, причем без guifg=NONE. В чем может быть дело?
0
damnerd, #
Может быть, colorscheme подгружается после, а там эта подсветка сбрасывается?
0
vawerv, #
Отключение темы помогает, но дело в том, что она грузится раньше чем цвет курсора
0
damnerd, #
Попробуйте поискать в теме lCursor. Если есть, удалить, если нет, добавить. :)
0
vawerv, #
спасибо, помогло
+1
Paul, #
:verbose :hi lCursor покажет где именно последний раз устанавливалось значение.
0
vawerv, #
и вам тоже
+1
mikhailian, #
Переключать раскладку в vim какой-то мутной комбинацией клавиш вроде Ctrl+^ — это насилие над разумом, я предпочитаю работать с map ё ` и так далее, тридцать два раза.
+1
f0b0s, #
у меня во всех ОС переключение по капс локу. Мизинец сам нажимает, я даже и не замечаю)
0
Angel2S2, #
Да, капс лок удобная штука. Я даже PuntoSwitcher на виндовые машины поставил, чтобы можно было по капсу переключаться.
0
cbx, #
Чтобы под виндой переключаться по CapsLock есть суперминималистичная утилита lswitch: haali.su/winutils/
0
Angel2S2, #
Ого. Не знал, спасибо :)
–2
mrjj, #
И вновь продолжается бой…
:)
+3
Angel2S2, #
Тоже использую такой вариант переключения раскладки. Только мне удобнее когда меняется цвет статусной строки и переключение по Ctrl + F.

В ~/.vimrc у меня это оформлено так:
set keymap=russian-jcukenwin    " настраиваем переключение раскладок клавиатуры по C-^
set iminsert=0                  " раскладка по умолчанию для ввода - английская
set imsearch=0                  " раскладка по умолчанию для поиска - английская

" переключение на русскую/английскую раскладку по ^f (Ctrl + F)
cmap <silent> <C-F> <C-^>
imap <silent> <C-F> <C-^>X<Esc>:call MyKeyMapHighlight()<CR>a<C-H>
nmap <silent> <C-F> a<C-^><Esc>:call MyKeyMapHighlight()<CR>
vmap <silent> <C-F> <Esc>a<C-^><Esc>:call MyKeyMapHighlight()<CR>gv

" Переключение раскладок и индикация выбранной в данный момент раскладки -->
" При английской раскладке статусная строка текущего окна будет синего цвета, а при русской - красного
function MyKeyMapHighlight()
	if &iminsert == 0
		hi StatusLine ctermfg=DarkBlue guifg=DarkBlue
    else
        hi StatusLine ctermfg=DarkRed guifg=DarkRed
    endif
endfunction
" Вызываем функцию, чтобы она установила цвета при запуске Vim'a
call MyKeyMapHighlight()
" При изменении активного окна будет выполняться обновление индикации текущей раскладки
au WinEnter * :call MyKeyMapHighlight()
" <--

0
Glow, #
Первая проблема решена уже сотни раз, но, всё равно. Также спасибо за защиту буквы «ё».
0
banderlog, #
навеяло. когда-то мы, еще виндузятники, стали изучать linux. как-то раз ннам дали задание: зайти в vim написать что угодно, сохранить в файл и выйти из него.
никто не справился.
PS: про команду man еще никто не знал тогда
+1
hoxnox, #
А кому-нибудь интересна возможность полной выключки на русском языке с переносами и без них? Я как-то писал статью, но она умерла в песочнице. Могу повторить в бог о великом vim, ну или на почту выслать, если интересно только единицам…
0
tmp0000, #
Думаю, некоторым будет интересно.
0
kiruri, #
С vim так — нашел какой-то tip, как улучшить работу — делаешь, радуешься. По ссылкам из этого tip или по комментариям находишь другие рецепты улучшений. И снова улучшаешь работу. Рекурсия улучшений.

Автор, спасибо.
0
Dukobpa3, #
Или я тупой или что-то не то делаю)
Вимом пользуюсь день четвертый отсилы если не считать тех нескольких скромных попыток, в которые он или пищал или всё портил, после чего забрасывался.

Вобщем вин7 ультимейтх64.
Вим поставил, в стандартной поставке этого самого кеймап-йцукенвина не было. Скачал отсюда.
"Поправим командную строку при русской раскладке
set keymap=russian-jcukenwin " вкрутить файл, пока хз куда всунуть его
set iminsert=0 " какая-то хрень для мапинга/унмапинга
set imsearch=0 " same

" меняет цвет курсора если эта самая хрень включена
highlight lCursor guifg=NONE guibg=Cyan

Вот вырезка из .vimrc
ЧЯДНТ?
0
Dukobpa3, #
Вообще мне больше нравится вариант автоматического переключения на англ при нажатии ескейпа, но я не знаю как в винде это сделать командной строкой, нагуглить не удалось, может кто подскажет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.