Привет. На руках: 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) на обновление статуса. Изначально хотел один вим, но так даже лучше - нафиг мне русский (во всяком случае вначале) в консоли? Доволен в общем, а всякие плагины, которые юзал, были какие-то кривые.