Open ivanbalashov239 opened 9 years ago
Это достаточно нетривиально. Сейчас это возможно сделать если на смену режима повесить hook: и соотв при переходе в command mode слать через dbus команду переключения на английскую раскладку, а при переключении обратно команду возвращения на предыдущую. В ближайшее время я планирую добавить не только dbus интерфейс и возможно ещё дополнительные команды. Подходит ли такой вариант?
Да, спасибо, наверное то что надо, во всяком случае работать будет. В идеале написать плагин для вима, но это наверное не к вам. Спасибо.
Осмелюсь предложить промежуточный вариант. Что бы не реализовывать всю логику слежки и переключения в конфиге вима, можно посылать через dbus сообщение о том что открыто приложение которое нужно считать самостоятельным, но дочерним для активного в данный момент. Как то так:
qdbus ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.setmode vimInsertMode
qdbus ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.setmode vimNormalMode
а оповещение об этих переключениях оставить на совести приложения. Такое возможно? не слишком сложно, не выбивается ли из логики работы приложения?
С применением #35 у меня работает вот такой Vim-скрипт (можно поместить в .vimrc
):
set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯЖ;ABCDEFGHIJKLMNOPQRSTUVWXYZ:,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz
augroup kbdd
autocmd!
autocmd InsertLeave * call s:KbddSetEnLayout()
autocmd InsertEnter * call s:KbddSetRememberedInsertModeLayout()
augroup END
let s:kbdd_insert_mode_layout = 0
function! s:KbddSetEnLayout()
silent! let l:current_layout = systemlist('/usr/bin/dbus-send'
\.' --session'
\.' --print-reply=literal'
\.' --dest=ru.gentoo.KbddService'
\.' /ru/gentoo/KbddService'
\.' ru.gentoo.kbdd.getCurrentLayout'
\)
if v:shell_error == 0
" First output string is expected to be alike "uint32 0".
let s:kbdd_insert_mode_layout = l:current_layout[0][-1:]
endif
silent! !/usr/bin/dbus-send
\ --session
\ --dest=ru.gentoo.KbddService
\ /ru/gentoo/KbddService
\ ru.gentoo.kbdd.set_layout uint32:0
endfunction
function! s:KbddSetRememberedInsertModeLayout()
execute 'silent! !/usr/bin/dbus-send'
\.' --session'
\.' --dest=ru.gentoo.KbddService'
\.' /ru/gentoo/KbddService'
\.' ru.gentoo.kbdd.set_layout uint32:'.s:kbdd_insert_mode_layout
endfunction
set langmap
необязателен, но т.к. переключение раскладки при выходе из Insert-режима происходит не мгновенно и уже после выхода из режима, без set langmap
приходится дожидаться этого переключения.
Скрипт хоть и рабочий, но по сути лишь прототип плагина, т.к. ненастраиваемый и делает некоторые неизменяемые предположения. Так, необходимо, чтобы английская раскладка было первой (т.е. под номером 0
).
Если переключение раскладок пользователем производится в обход kbdd
, то без #35 приходится добавлять "излишние" переключения раскладок самим kbdd
. Например в функции s:KbddSetEnLayout()
перед переключением раскладки на 0
(set_layout(0)
), необходимо сначала переключить на какую-либо иную (отличную от 0
) раскладку.
feature support for vim modes as different windows with different layouts.
если пользоваться вимом для записей в кирилице, то при выходе из режима ввода нужно сменить раскладку на латиницу, хотелось бы что бы всё менялось автоматом.