LINUX.ORG.RU

Автоматическая смена раскладки клавиатуры на us

 


0

2

Привет. На руках: vim c set keymap=russian-jcukenwin (смена раскладок через CTRL-^, я замепил на ALT-space); системная переключалка через win-D; консольный vim.

Хочется автоматом переключать системную раскладку на us при взятие фокуса вимом.

Повесить хук на FocusGain можно лишь в гуйне. Хочу поделиться своим решением (может не лучшее, а может кто найдёт полезным). Поставил st от suckless (из-за его простоты). Сделал патч

diff -ru a/config.def.h b/config.def.h
--- a/config.def.h	2019-02-09 21:50:41.000000000 +1000
+++ b/config.def.h	2020-02-23 19:45:52.131715335 +1000
@@ -460,3 +460,10 @@
 	" !\"#$%&'()*+,-./0123456789:;<=>?"
 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
 	"`abcdefghijklmnopqrstuvwxyz{|}~";
+
+/*
+ * Will be called every time when ST get focus.
+ */
+#define GET_FOCUS_USER_HANDLER do{ \
+                                   \
+}while(0)
diff -ru a/x.c b/x.c
--- a/x.c	2019-02-09 21:50:41.000000000 +1000
+++ b/x.c	2020-02-23 19:35:41.653736790 +1000
@@ -1624,6 +1624,11 @@
 {
 	XFocusChangeEvent *e = &ev->xfocus;
 
+	if (e->type == FocusIn  &&
+	    (e->mode == NotifyNormal  ||  e->mode == NotifyWhileGrabbed)) {
+	    GET_FOCUS_USER_HANDLER;
+	}
+
 	if (e->mode == NotifyGrab)
 		return;

в config.def.h в get_focus_user_handler() добавил

system("xkb-switch -s us && pkill -RTMIN+2 i3block");

т.е. каждый раз при получении фокуса st меняется раскладка на us и шлётся сигнал идикатору раскладок (стоит i3wm + i3blocks) на обновление статуса. Изначально хотел один вим, но так даже лучше - нафиг мне русский (во всяком случае вначале) в консоли? Доволен в общем, а всякие плагины, которые юзал, были какие-то кривые.

★★

Последнее исправление: pavlick (всего исправлений: 1)

Можно даже дальше пойти - запоиминать раскладку при получении фокуса/менять на us/возвращать раскладку при потере фокуса.

pavlick ★★
() автор топика
Ответ на: комментарий от anonymous

Только стоило велосипед сделать, как обнаружились варианты )). Хоть кто-то бы упомянул раньше (читал не одну статью на тему раскладок в виме).

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

Не работает. Alt игнорируется и вим воспринимает только пробел. У тебя нет других опций в конфиге, которые позволяют маппить alt?

hopheynananey
()
Ответ на: комментарий от hopheynananey

Больше ничего, вот весь конфиг (остальное хуки на типы файлов)

let mapleader = ","

call plug#begin(stdpath('data') . '/plugged')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'morhetz/gruvbox'
call plug#end()

set keymap=russian-jcukenwin
set iminsert=0
set imsearch=0
set mouse=a
set nowrapscan
let g:gruvbox_italic=1
colorscheme gruvbox
noremap! <M-Space> <C-^>

Наверное зависит от терминала - на urxvt и st у меня alt+space работает. ЗЫ: у тебя тоже neovim, а не vim (может важно)?

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 2)
Ответ на: комментарий от pavlick

ЗЫ: у тебя то же neovim, а не vim (может важно)?

У меня как раз таки vim. Спасибо!

hopheynananey
()

Есть же утилиты, запоминающие раскладку для каждого окна. Даже у меня собственная валяется.

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

Хорошая идея, главное её не забыть.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.