Comments 21
Простите мою неосведомленность, но чем nmap первого символа и переключения раскладки лучше nmap всех символов без переключения? И как я понял назад раскладка не переключается? И еще, у Вас буква «Ж» выделяется из ряда маппингов:
Опечатка или скрытый смысл?
А вообще проблема весьма насущная, поддерживаю попытки ее решить.
nmap <unique> Ж :call ChangeLayout(':')<CR>:
Опечатка или скрытый смысл?
А вообще проблема весьма насущная, поддерживаю попытки ее решить.
+1
Тем, что если nmap'ить все символы, то при попытке сделать
Возможно, есть другой вариант вернуть фокус в командную строку, но я Vim script изучил за день до написания этого плагина и более умного способа мне в голову не пришло.
Жцй(:wq)
вы получите кукиш. Если же по нажатию Ж переключить раскладку, то вы получите как раз :wq
и успешно сохранитесь и закроете окно. Этим же объясняется выделяющийся маппинг «Ж» — сайлент отключен, чтобы фокус остался в коммандной строке и вы успешно продолжили ввод команды.Возможно, есть другой вариант вернуть фокус в командную строку, но я Vim script изучил за день до написания этого плагина и более умного способа мне в голову не пришло.
+3
Не проще ли настроить, чтобы раскладка была не глобальной, а привязывалась к текущему окну? В Минте (и наверное в Гноме вообще) это в настройках Keyboard Layout -> Layouts. Наверняка же в MacOS такое тоже есть.
+2
И в макоси есть такая настройка. Наверное это проще, но не для всех. Лично для меня это создает большие неудобства и на порядок выросшее количество переключений раскладки.
+1
О, я совсем о другом думал. Когда в Vim редактируешь русский текст, то работа с «нормальным» режимом — просто мука. Приходится постоянно переключать раскладку туда-сюда. Вот думал ваш скрипт и решает это. Тогда ему не достает возвращения старой раскладки при выходе из нормального режима.
+1
Не проблема! Скоро обновлю код для подобного переключения при установке соответствующей настройки!
0
А правильно настроенные keymap или langmap не помогают?
+1
Я вообще обычно для кириллицы использую «set keymap=russian-jcukenwin», не помню где-то когда-то встретил такое. Язык тогда по Ctrl+^ переключается только внутри вима. И своих заморочек там тоже хватает — если в системе выбрана русская раскладка, то хоткеи в виме соответственно не работают.
А с langmap я перестал дружить еще как с koi8 перешел на utf, помнится она с юникодом не особо нормально себя ведет. Но это давно было, может я чего-то и пропустил, надо поглядеть.
А с langmap я перестал дружить еще как с koi8 перешел на utf, помнится она с юникодом не особо нормально себя ведет. Но это давно было, может я чего-то и пропустил, надо поглядеть.
0
Пофиксил баги, теперь работают последовательности, например: 10w, gg…
Так же сделал ваш фичреквест.
Для переключения раскладки по выходу из insert mode нужно в .vimrc добавить строку:
Так же сделал ваш фичреквест.
Для переключения раскладки по выходу из insert mode нужно в .vimrc добавить строку:
let g:rusmode_autotoggle_insertleave=1
+1
Есть же langmap. см. тут
0
Langmap == проблемы с привязками с левой частью вида
<Plug>ISurround
::inoremap <Plug>Isurround <Nop>
:imap <C-g>S <Plug>Isurround
:set langmap=YI,IY
:execute "normal i\<C-g>S"
:1print
<Plug>ISurround
+1
+ несистемное переключение раскладки и необходимость помнить в каком окне какая раскладка (даже хуже: в каком Vim’е какого эмулятора терминала, у меня обычно первых больше чем последних, но и последних тоже много). Так что расслабьтесь, langmap — это просто ещё одна возможность, которая есть, но которой нет.
0
Я и не напрягался. Вы привели пример, в котором заменяются 2 буквы английского алфавита. Если у вас langmap вроде этого то никаких проблем не будет.
0
Идея интересная, но
В вашем коде нужно либо заменить
Тем, что если nmap'ить все символы, то при попытке сделать Жцй(:wq) вы получите кукиш.
решается таким же набором привязок для командного режима, это не является принципиально неустранимой проблемой старого способа;nmap
в вашем случае не надо использовать (Learn vimscript the hard way, глава 5: Strict mapping). Для такой задачи вообще‐тоnore
обычно вреден, но в вашем коде безnore
хуже.- чтобы сохранить поведение нельзя использовать
normal!
(с восклицательным знаком). - чтобы сохранить поведение многосимвольных команд нельзя использовать
normal
вообще, хоть с, хоть без восклицательного знака; - чтобы не менять символы в двух удалённых друг от друга местах при копировании проще сделать функцию‐помощник и менять их в одном месте.
В вашем коде нужно либо заменить
nmap
на nnoremap
и execute("normal…")
на call feedkeys(a:key, "t")
, либо использовать <expr>
:function s:ChangeLayout(key)
call system('osascript -e "tell application \"System Events\" to key code 49 using command down"')
return a:key
endfunction
nmap <expr> <unique> й <SID>ChangeLayout('q')
+2
Большое спасибо за столь объемный и полезный комментарий, в самое ближайшее время разберусь и внесу в код соответствующие изменения. Не могли бы вы мне, как новчику в Vim script, объяснить подробнее пункты 3 и 4, здесь или в личку?
0
3. Определите привязку, к примеру
4. Попробуйте ввести с вашим кодом составные команды (вроде
nnoremap Y :echom "I am HERE"<CR>
. И попробуйте её использовать с вашим кодом.4. Попробуйте ввести с вашим кодом составные команды (вроде
gg
) или операторы (вроде yy
). Поместить все символы после <CR>
с или без <silent>
является куда как лучшей идеей, чем использовать :normal
в функции: эффект от :normal
на этих командах слабо отличается от того, из‐за чего вы использовали исключительный случай для :
. Разве что убирать <silent>
не обязательно. Замечу что исключительный случай для :
в функции не выполняет ровным счётом никакой полезной работы.0
Ага, вижу баги. Спасибо, пойду почитаю хэлпы и пофикшу! :)
0
Там наверху у меня ссылка на учебник. Основная страница: learnvimscriptthehardway.stevelosh.com/. Ещё можно посмотреть на мою статью с описанием некоторых особенностей vimL. Правда по последней давно (со дня написания, но тогда, разумеется, мне казалось иначе) плачет refactoring.
+2
очень полезно. спасибо! :)
0
Sign up to leave a comment.
Rusmode — решение проблемы с русской раскладкой