qnikst / kbdd

keyboard library for per-window keyboard layout
GNU General Public License v2.0
146 stars 16 forks source link

Поддержка режимов ввода vim как отдельных окон, с отслеживанием раскладок. #34

Open ivanbalashov239 opened 9 years ago

ivanbalashov239 commented 9 years ago

feature support for vim modes as different windows with different layouts.

если пользоваться вимом для записей в кирилице, то при выходе из режима ввода нужно сменить раскладку на латиницу, хотелось бы что бы всё менялось автоматом.

qnikst commented 9 years ago

Это достаточно нетривиально. Сейчас это возможно сделать если на смену режима повесить hook: и соотв при переходе в command mode слать через dbus команду переключения на английскую раскладку, а при переключении обратно команду возвращения на предыдущую. В ближайшее время я планирую добавить не только dbus интерфейс и возможно ещё дополнительные команды. Подходит ли такой вариант?

ivanbalashov239 commented 9 years ago

Да, спасибо, наверное то что надо, во всяком случае работать будет. В идеале написать плагин для вима, но это наверное не к вам. Спасибо.

ivanbalashov239 commented 9 years ago

Осмелюсь предложить промежуточный вариант. Что бы не реализовывать всю логику слежки и переключения в конфиге вима, можно посылать через 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

а оповещение об этих переключениях оставить на совести приложения. Такое возможно? не слишком сложно, не выбивается ли из логики работы приложения?

leonidborisenko commented 9 years ago

С применением #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) раскладку.