Немодальное переключение раскладок клавиатуры в Mac OS X

Обновление от 27.04.2015: к сожалению, описанное здесь решение больше не работает, причём сразу по двум причинам. Во-первых, обновление до OS X 10.10.3 сломало утилиту changeInput; во-вторых, сайт разработчика данной утилиты больше недоступен, а значит, её больше неоткуда загрузить. В настоящий момент я работаю над альтернативным решением. Как только оно будет готово, я напишу об этом в своём блоге.


Mac OS X — замечательная операционная система, которая превосходит Windows практически во всём, за исключением одного: работы с несколькими раскладками клавиатуры.

Вообще, если говорить совсем уж откровенно, то следует признать, что использование одного сочетания клавиш для циклического переключения между всеми доступными раскладками придумал какой-то олигофрен. Данная операция имеет модальную природу, то есть её результат зависит от того, какая раскладка активна в данный момент. Если учесть, что Mac OS X имеет привычку случайным образом переключать раскладки при переключении между программами, результат нажатия на ⌘Space («умолчальная» комбинация для переключения языка ввода) становится совсем непредсказуемым.

Разумеется, данная проблема актуальна не только для Mac OS X, но в Linux[1] настраивается что угодно и как угодно, да и Windows позволяет системными средствами назначить каждой раскладке своё клавиатурное сокращение. Я обычно назначал ^1 на английский язык, ^2 на русский язык и так далее. Поскольку штатными средствами на Маке ничего подобного сделать нельзя[2], приходится городить свой собственный колхоз.

Изначально было понятно, что решать проблему придётся при помощи скриптов. К сожалению, чтение документации не принесло ответов на волнующие вопросы, а дальнейшая консультация со знающими людьми подтвердила, что переключать раскладку «чистым» AppleScript нельзя. Те же самые знающие люди намекнули, что можно самому набросать простенькую программку в Xcode, которая переключала бы раскладки при помощи Text Input Source Services.

К счастью, писать мне ничего не пришлось, потому что благодаря всемогущему Гуглу я нашёл консольную утилиту changeInput. Лично мне удобнее, чтобы эта утилита лежала в любой системной папке, например, /usr/local/bin:

$ sudo cp ~/Downloads/changeInput /usr/local/bin/

Программа принимает в качестве аргумента точное название желаемой раскладки. Скажем, следующая команда:

changeInput 'Russian'

…сделает активной стандартную русскую раскладку.

Дальнейшее — дело техники. Открываем AppleScript Editor и пишем скрипты практически одинакового содержания:

do shell script "/usr/local/bin/changeInput 'U.S.'"

Или:

do shell script "/usr/local/bin/changeInput 'Russian'"

И так далее. Копируем полученные .scpt-файлы в папку ~/Library/Scripts. Теперь нам понадобится приложение, которое умеет выполнять скрипты AppleScript при нажатии определённого сочетания клавиш. Я когда-то давно совсем для других целей купил FastScripts и с тех пор использую её, но в Mac App Store есть аналоги и дешевле (например, Apptivate).

FastScripts

Осталось решить только один вопрос — на какие сочетания клавиш повесить переключение раскладок? Увы, Mac OS X не даёт нам особого выбора. ⌘1, ⌘2 и проч. уже заняты, трёхклавишные сочетания (вроде ^⌘1) неудобны. Остаётся использовать привычные по Windows сочетания ^1, ^2 и ^3. По умолчанию они используются для переключения между виртуальными рабочими столами, но их, в отличие от сочетаний с ⌘, можно переназначить (всё равно Spaces в Mac OS X Lion ухудшили до полной бесполезности).

Разумеется, это решение является неприкрытым костылём, однако у него есть одно большое достоинство: оно работает. Я использую связку changeInput + AppleScript + FastScripts уже почти год и ни разу не сталкивался с какими-либо неприятными побочными эффектами. ♦


  1. В это сложно поверить, но до перехода на Мак я был красноглазым линуксоидом. ↩︎

  2. По крайней мере, я не нашёл, хотя очень старался. ↩︎

Если вам понравился этот текст, не забудьте подписаться на обновления моего блога.

Плюсануть
Поделиться