понедельник, 15 июня 2009 г.

Переключения раскладки в Windows

На работе стоит Windows, дома - Linux, а на сладкое везде Emacs. Необходимость помнить, где я, и в зависимости от этого жать разные кнопки для переключения раскладки клавиатуры попортила мне немало нервов. Руки упорно срабатывали быстрее головы и успевали наколотить половину предложения прежде, чем я замечал ошибку. В конце-концов мне это надоело. Раз я один, значит и прывычка должна быть одна. Надо было сделать так, чтобы вне зависимоси от среды: Windows, Linux консоль, Linux X сессия, Emacs; переключение раскладок работало одинаково.
Мне повезло. Для Windows тема оказалась популярной. Почти сразу попалась программа lswitch.exe. Размером около 3KiB, все что она умела - это переходить на следующую раскладку при нажати клавиши, код которой задавался в единственным параметром командной строки. Казалось бы, то что нужно. Запуск lswitch прочно засел в автозагрузке:
c:\opt\bin\lswitch.exe 20
Стандартная переключалка была выключена, чтобы не смущала.
Казалось-бы то, что нужно, но оказалось, что казалось... Переключалка в целом работала, но некоторые окна её упорно игнорировали. Так себя вела Miranda. Какая уж тут радость общения, когда кроме как на английском писать ничего невозможно?! В попытках избавитсья от этого досадного глюка, пожалуй, единственное чего я не успел сделать, так это запустить драйвер клавиатуры под отладчиком (не знал как). Когда наконец выяснил, что команда на переключение раскладки всеже поступает, но игнорируется, друг гугль наконец подсказал решение. Виновником оказалась поддержка каких-то экзотических языков, которую за собой притащил IE7. После установки в реестре параметра в реестре и традиционной перезагрузки машины, переключение раскладки заработало во всех окнах.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IMM] "LoadIMM"=dword:00000000
Оставался последний рубеж - Emacs. Редактор имеет собственный механизм переключения языков ввода и этот механизм не очень дружит с системным переключателем. После включения русского языка, я конечно мог набирать тексты, но терял все горячие клавиши. Например, при попытке записать текущий буфер, вместо C-x C-s у меня получалось C-ч C-ы, на что Emacs откликался недоуменным взглядом из минибуфера.
Помог пост Дмитрия Галинского. Поскольку раскладка теперь переключалась по capslock, нажатие которой доходило до Emacs, все что надо было сделать вернуть системную раскладку и переключить язык средствами редактора. В файл ~/.emacs был добавлен код:
;; Unified language switching hack for Windows and Emacs
;;   http://dima-exe.ru/2007/4/win32-emacs-and-change-language
;;
;; Run lswitch.exe 20 on windows startup.
;; Define default-input-method variable in your .emacs.
;; Use CAPSLOCK to switch input language.

(setq default-input-method "russian-computer")
(defvar safe-language-change-flag nil)

(defun safe-language-change ()
(interactive)
(setq safe-language-change-flag (not safe-language-change-flag))
(when safe-language-change-flag
 (toggle-input-method)
 (w32-toggle-lock-key 'capslock)))

(global-unset-key (kbd "C-\\"))
(global-set-key (kbd "<language-change>") 'safe-language-change)

С настройкой Windows покончено, остается Linux допилить. К хорошему привыкаешь быстро. О стандартном способе переключения раскладок тепрь даже вспоминать не хочется.