Как стать автором
Обновить

Windows по сравнению с MacOS

Уровень сложностиПростой
Время на прочтение50 мин
Количество просмотров49K

Предисловие

Что ж, перед тем, как перейти к содержательной части, обозначу, в чем я вижу здесь проблему, стоящую упоминания. Компьютер - довольно сложное в управлении устройство. Если вам кажется, что это не так, попробуйте вспомнить свое первое знакомство с клавиатурой, когда вам надо на ней что-то напечатать, а где буквы - вы еще не выучили. Я вот помню, что у нас это была целая лабораторная работа - набрать на компьютере короткое стихотворение Пушкина из трех строф, и на это отводился весь академический час - 45 минут. И этого еще не хватало, потому что все время, отведенное на выполнение задания, занимал поиск "да где же тут эта чертова буква на этой чертовой клавиатуре".

Это понимали люди, стоявшие у истоков тех рек, чье мощное течение создало ландшафт IT-экосистемы в том виде, в котором мы имеем честь наблюдать его в настоящее время. Одним из таких людей был специалист по UI-UX интерфейсам, одно время возглавлявший данное направление в корпорации Apple, а также летчик-любитель Джеф Раскин. Именно он сформулировал основной принцип проектирования эргономичных (удобных для использования) интерфейсов, применимый равно как для взаимодействия людей и самолетов, так и людей и компьютеров  - принцип монотонности.

Этот принцип, хотя и расшифровывается достаточно просто и понятно (Раскин раскрывал его как "одинаковое действие всегда должно вести к одинаковому результату", а, в качестве пояснения использовал примеры из авиации, вроде тех, что "представьте, что вы пилот самолета, и потянули штурвал на себя, а самолет, вместо того, чтобы пойти вверх, начал пикировать, и на таком самолете вы могли бы нормально летать только после очень долгого переучивания"), имеет несколько следствий.  Например, таких:

  • переучиваться больно и тяжело

  • выгоды от переучивания должны превышать затраченный на переучивание труд

  • лучше сразу учиться делать правильно (эргономично и экономно), чтобы не пришлось переучиваться

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

Часть 1. Что не так и что с этим можно сделать?

  • Штатный Alt-Tab не работает (так, как должен). Решилось установкой бесплатной опенсорсной программы AltTab.

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

  • Штатное в Windows и в Ubuntu переключение на самые нужные приложения по Win-1, Win-2, Win-3 и т.д. не работает. Решилось установкой бесплатной программы Snap (спасибо за совет коллеге Алексею. Алексей, привет!)

  • Штатное переключение РУС/ЛАТ по Caps Lock есть и работает, но в моём специальном случае (надо часто подключаться по RDP к машинам с Windows) очень быстро задолбало его включать и отключать. Решилось созданием клавиатурной раскладки ruscaps в бесплатной программе Ukelele (точно такое же концептуально решение я использую и на Windows, которое подсмотрел в статье Ассемблер/дизассемблер клавиатурных раскладок Windows с помощью flat assembler здесь же на Хабре. Работает этот способ хорошо как на маке, так и на винде, по сути это оказался и там и там самый безглючный способ использовать переключение языка по Caps Lock. В Приложении техническая инструкция, как настроить[1]).

  • При использовании такого способа переключения клавиатурных раскладок очень хочется иметь наглядный индикатор, какая именно сейчас раскладка активна, а штатного индикатора состояния Caps Lock, которое и служит индикатором активной раскладки, в menu bar нет. Решилось установкой бесплатной программы Captin (программа работает хорошо, хотя по таймеру состояние Caps (нажато или нет) не опрашивает, отчего иногда кажется, что она зависла)

  • Как семантический эквивалент клавиши Ctrl в системе используется специфичная для маков клавиша Command, которой ни на каких других компьютерах нет. Тут пользователю надо либо переучиться, изменив свои десятилетиями наработанные клавиатурные привычки, либо попытаться настроить систему под себя.  Второй путь сложнее, но я пошел по нему, потому что Vim (для мака это будет MacVim, один из основных моих инструментов) ничего не знает про клавишу Command, и по умолчанию использует клавиатурные комбинации с клавишей Control.

  • Idea в клавиатурной раскладке по умолчанию на маках использует Command вместо Ctrl, но это решается перенастройкой клавиатурной схемы, что требует много телодвижений, но хотя бы работает  (скорее всего, она, как и MacVim, ловит скан-коды, и поэтому может использовать любую клавиатурную раскладку, но почему-то в комплект не положили схему "Idea classic как в Windows", где вместо Command был бы Control, и ее пришлось городить самостоятельно).

  • Очень непривычно себя ведут операции манипулирования с текстом в обычных текстовых полях и редакторах, в частности, при вводе текста в textarea в браузерах, и т.п. Сочетания Ctrl-Home, Ctrl-End, Shift-Ctrl-Home, Shift-Ctrl-End, и аналогичные сочетания с кнопками курсора делают не совсем то (или совсем не то), что они делают в Windows и в Ubuntu. Это приводит просто к ужасному дискомфорту, когда Idea и Vim ведут себя как надо (ну, почти), а редактирование текста в браузерной форме (набить заметку в Evernote) или штатном редакторе вроде TextEdit использует совершенно другие сочетания клавиш для тех же самых действий. Так жить совершенно точно нельзя и не нужно, и, к счастью, это можно почти полностью исправить с помощью настроек: DefaultKeyBinding (в Приложении инструкция, как настроить[2]).

  • горячие клавиши в Chrome (Ctrl-T, Ctrl-W, Ctrl-L, Ctrl-F, F3) не работают по дефолту, потому что вместо Ctrl тут для них нужно использовать Command. Решилось штатными настройками горячих клавиш в System Settings - Keyboard - Application hotkeys (заменить Command на Ctrl, и клавиатурное управление наиболее частыми действиями в Chrome становится консистентным с Windows).

  • Аналог "ножниц" (сделать скриншот части экрана) есть, но сочетание клавиш для его активации не такое, как в Windows. Решилось назначением хоткея Win-Shift-S (такой же, как в Windows) при помощи штатных средств (системные настройки хоткеев)

  • Некоторого привычного софта нету, а есть только аналоги. Решается тем, что приобретается новый опыт, как использовать эти аналоги для решения задач, справляться с которыми ранее помогал привычный софт. (привычный Tortoise Git или DBForge не поставишь, но в Idea есть почти вся нужная функциональность, которую нужно освоить, попутно освоив способы, как обходить присущие этой функциональности баги и шероховатости. Idea хорошая программа, и JetBrains хорошая корпорация, но UX дизайнеров уровня Раскина там нет ни одного, и, кажется, не будет никогда).

  • вместо Far Manager тут Midnight Commander. Некоторой функциональности в нем все равно нет, но базовые вещи (вроде пользовательского меню с пунктами "Отправить в MacVim", "Показать в Finder", "Скопировать путь" и т.п.) настроить вроде получилось (в Приложении инструкция, как именно [3]). Также есть возможность сделать список с самыми часто используемыми директориями, и SFTP-подключения (которые умеют использовать ключи из ssh-agent). В настройках программы Terminal нужно включить галку "Use Option as Meta key", и тогда оно станет реагировать на клавиатурные сочетания, включающие Meta key (это Alt на обычной клавиатуре), а их там немало.

  • кое-где всё равно используются только маковские хоткеи. Вставить текст из буфера в терминале получается только по Command-V. Решилось... никак не решилось, но таких мест мало, и я решил, что пока с ними можно смириться. Возможно, по мере обживания конфигов найдется способ что-то подправить и там.

  • Концепция "рабочих простанств" (Spaces) оказалась сравнительно удобной для использования вместе с виртуальными машинами, но пришлось немного подкрутить: - штатный хоткей для перемещения туда-сюда между пространствами это Ctrl-Left и Ctrl-Right, который использовать совершенно невозможно, потому что в моем представлении это сочетание клавиш должно использоваться для перемещения курсора между словами при редактировании текста. Это довольно просто перенастраивается штатными средствами (я сделал Ctrl-Alt-Shift-(Left | Right). Второй нюанс в том, что мне нужно, чтобы виртуальная машина ловила все хоткеи, в том числе те, для которых назначено действие в хост-системе (Alt-Tab, Win-1, Win-2, Win-3, ...). И этого можно достичь, если в настройках Parallels включить пункт "Send macOs system shortcuts = Always". Но побочным следствием такого будет то, что по Ctrl-Alt-Shift-Right войти в виртуальную машину можно, а выйти из нее по Ctrl-Alt-Shift-Left уже нельзя! К счастью, нашелся workaround - если двинуть мышь вверх, чтобы показалось системное меню Parallels, то Ctrl-Alt-Shift-Left обработается хост-системой. Ну и еще одно, что надо упомянуть - по умолчанию macOs использует поведение "Automatically rearrange spaces based on most recent use", что, возможно, иногда оправдано, но нарушает вышеупомянутый принцип монотонности совершенно явным образом (Раскин бы не одобрил), и чаще всего лучше эту опцию выключить.

  • Еще часто критикуют Макось за ее "недостаточные" возможности, предназначенные для тайлинга (расположения окон приложений по рабочему пространству одного или нескольких мониторов). Тут ничего толкового сказать не могу, потому что мой сценарий использования - это окно приложения, распахнутое на весь экран и переход к этому окну "монотонным" способом - Vim: Win-1, Chrome: Win-2, Far (Terminal): Win-3 и так далее.  Однако в комментариях к предыдущей статье был упомянут проект https://github.com/ianyh/Amethyst - на первый взгляд его возможностей должно быть достаточно для тех, кто привык раскладывать из окон красивую мозаику (автор вдохновлялся xmonad, когда его делал). Я, возможно, когда-нибудь попробую его поюзать.

Часть 2.  Субъективные реплики к пунктам статей этой своеобразной серии.

Читайте только если занудства в первой части вам показалось маловато, и надо бы добавить еще.

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

  • Бестолковый Dock Bar

Мне он не показался бестолковым, потому что я, пользуясь Windows с версии Windows 95, еще помню, как эволюционировал Task Bar там. Раньше он выглядел так:

но, начиная с Windows Vista, стал выглядеть очень похоже на Mac-версию. В Windows 7 иконки приложений стали более квадратными (чтобы их помещалось по горизонтали больше) - как и в Mac, добавились визуальные элементы индикации, отображающие текущий статус приложения (запущено, не запущено, сколько окон - как и в Маке, скачивает / занято процессом - лучше, чем в Маке), но в целом никаких неудобств докбар не вызвал, потому что этот элемент управления работает и ведет себя почти так же, как и в Windows. Здесь мы видим пример процесса, когда UI-элементы из разных систем эволюционируют, перенимая друг у друга лучшие черты, и превращаются плюс-минус в одно и то же. Мое имхо: докбар - хорошо сделано, еще и выглядит eye-candy.  Доставить программу Snap, и оно еще и на клавиши начинает реагировать монотонно.

  • Планшетный LaunchPad

Это просто второстепенное приложение для запуска других приложений, которое использует метафоры UI, принятые на планшетах - вроде "перетащите Pages на Numbers, чтобы сделать Productivity", и т.п. Никаких проблем это не вызывает, потому что этим можно пользоваться точно так же, как на iPad, если привык к такому UI-решению, либо не пользоваться вовсе, если оно не нужно (как мне). А вот облегчить переходный период пользователю iPad, который впервые купил себе Макбук зачем-то, такое приложение может.

  • Активные углы

Тут пока воздержусь от комментария, потому что не пользовался, и не имею hands-on experience, как оно. Но в теории, эта штука обладает свойством монотонности, то есть бросок мыши в конкретный угол экрана должен приводить к одинаковому результату. Поэтому, вероятно, если настроить эту фичу правильно, то она скорее полезна, чем вредна.

  • Окна - боль

Тут сценарии использования тоже могут отличаться, но по моим многолетним наблюдениям за собой и за окружающими, основной сценарий использования - это окно приложения, распахнутое на весь экран, и переключение между несколькими  такими "максимизированными" окнами по мере того, какое приложение нужно. История с тайловыми менеджерами, призванными городить хитрую мозаику из окон запущенных приложений, почти никогда не находит применений в практике (исключения - двухпанельный интерфейс файловых менеджеров вроде Far, mc, Total Commander - но и там удобнее оказалось это сделать в виде двух панелей внутри одного приложения, и дашборды мониторинга, где надо одновременно выводить много метрик (визуально оформленных как градусники, спидометры, энцефалограммы, и т.п.) в реальном времени - но и там оказалось удобнее сделать это в чем-то вроде Графаны). В результате эти кнопки светофорных цветов оказались не особо нужны, поэтому и не особо мешают (хотя то, что они ведут себя по разному для разных приложений - это стыд, позор и нарушение принципа монотонности Раскина - например, красная кнопка может просто "свернуть" приложение, а может отправить виртуальную машину в сон, что, хотя концептуально и похоже на "свернуть", а все же значительно отличается, потому что при отправке в сон, в отличие от свертывания, порвутся открытые сокетные соединения).

  • Full Screen — выбор между плохим и ужасным

Вообще в теории Full Screen режим - это хорошо, потому что вспомогательные элементы управления прячутся и не отвлекают внимания, а нужное в данный момент приложение занимает всё доступное место. На практике же это оказывается неудобным, потому что прячутся не только ненужные элементы интерфейса, но и нужные тоже (menu bar вверху, где нужно обычно не само меню, а часы, календарь, текущая раскладка, статус клавиши CapsLock), докбар (где нужна иконка System Monitor с текущей загрузкой процессора), и подобные мелочи. Эту информацию о текущем статусе системы наверняка можно реализовать как дополнительное приложение, которое будет показывать ее и в полноэкранном режиме тоже, в виде какого-нибудь полупрозрачного окна, но такое приложение надо либо искать, либо писать. Кстати, это мысль.

  • Trackpad

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

  • Touch Bar

Про Touch Bar либо хорошо, либо ничего. Его убрали в новых макбуках, и правильно сделали.

Теперь про статью "Перейти с Linux на macOS и не сойти с ума".

Проблема: Dock занимает много места, принося минимальную пользу.

Решение: убрать влево, включить автоскрытие.

Почти согласен. Тоже убрал влево, но автоскрытие выключил, потому что от него (имхо) больше вреда, чем пользы. Автоскрытие было и есть и в таскбаре Windows тоже уже очень давно, и там оно тоже приносит больше вреда, чем пользы, по причинам, перечисленным выше.

Проблема: Command + Tab (аналог Alt + Tab в других ОС) показывает все приложения со всех рабочих столов, непригоден для переключения между несколькими окнами одного приложения.

Решение: использовать альтернативный переключатель окон AltTab, использовать жесты тачпада.

Тут благодарность автору за наводку на бесплатную опенсорсную программу Alt-Tab. Работает очень хорошо, хотя и не совсем так как в Windows, но в чем-то даже лучше.

Проблема: Тайлинг окон, нормальное разворачивание окна на весь экран.

Решение: Rectangle.

Для меня это не оказалось проблемой, потому что окно разворачивается на весь экран двойным кликом по заголовку (как и в Windows) и дальше остается в этом состоянии до перезагрузки. Еще можно зажать Alt на клавиатуре и мышкой нажать на зеленую кнопку - это, оказалось, как раз разворачивание окна на весь экран.

Проблема: Переключение раскладки клавиатуры по CapsLock для тех, кто быстро печатает и часто переключает раскладки.

Решение: Использование Karabiner-Elements.

А вот тут мне пришлось почесать репу. Я тоже быстро печатаю, и тоже привык использовать CapsLock для переключения РУС/ЛАТ. В Макоси есть для этого штатная функция (Use CapsLock to switch to and from US, что-то такое), и, сначала показалось, что это прямо то, что нужно. Оно действительно работает хорошо, пока не надо использовать странные сценарии, вроде таких как "подключиться по RDP к Windows-машине", где клавиатурную раскладку тоже нужно переключать по CapsLock. TL;DR: рабочим решением оказалось сделать то же самое, что и под Windows, а именно - сконструировать кастомную клавиатурную раскладку. На Маке это оказалось сделать (с помощью программы Ukelele) даже проще, потому что клавиатурная раскладка здесь - это файл в xml-формате, а на Windows - это полноценная DLL в формате PE, который еще разный под 32, 64 и ARM архитектуру должен быть. Под ARM (aarch64) у меня пока не получилось такую DLL собрать. Пичалька.

Проблема: Непривычная русская раскладка.

Решение: Использование раскладки «Russian - PC».

Для меня это не оказалось проблемой, потому что я сразу последовал этому совету, и поставил Russian - PC. И, хотя потом пришлось городить свою раскладку, русские буквы я разложил в ней именно так, как в Russian - PC, которая была взята за основу. Спасибо автору за хороший совет.

Проблема: Autocomplete в терминале.

Решение: Fig.

Тут я это решение использовать пока не стал, потому что мне настолько хитрое решение пока не нужно, а автодополнение названий веток в Git по Tab как-то само заработало (то ли после установки Homebrew, то ли сразу было).  Терминал (zsh) можно подвергнуть настройке, чтобы показывал текущую ветку git. Для этого в ~/.zshrc нужно дописать примерно такое (честно утянуто со StackOverflow):

Hidden text
parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}
COLOR_DEF='%f'
COLOR_USR='%F{243}'
COLOR_DIR='%F{197}'
COLOR_GIT='%F{39}'
NEWLINE=$'\n'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n@%M ${COLOR_DIR}%d ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}%% '

Проблема: Docker-контейнеры тормозят.

Решение: нет.

Тут промолчу, ибо сам еще не налаживал и не запускал, но, говорят, что если надо запустить что-то x64, то придется использовать какое-то странное решение, в котором одновременно встречаются слова "docker" и "qemu", и оно вроде как еще потребляет много оперативы. (A work around is to spin up an x86 container using Colima, https://oralytics.com/2022/09/22/running-oracle-database-on-docker-on-apple-m1-chip/)

Проблема: Виртуальная машина с Windows и Linux.

Решение: UTM или QEMU.

Там автору подсказали, что "более лучшее" решение - это Parallels. Работает очень хорошо, Microsoft совсем недавно (февраль 2023) что-то даже официально сертифицировала, что Parallels для запуска Windows на макбуках с процессором Apple Silicon - это ОК, но все же Windows работает в режиме виртуальной машины там. То есть софт, который не лезет в ядро, вроде как работает весь, и с отличной, почти native, скоростью, но драйвера не запустятся, даже сравнительно безопасные, типа виртуальных сетевых интерфейсов для openconnect.

Часть 3.  Минусы и плюсы.

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

Сильнее всего не понравилось - это поведение курсора и системы выделения текста в штатных полях редактирования текста. Как-будто специально сделано, чтобы виндузятники не лезли на мак, и наоборот, с целью огораживания. Это оказалось возможным преодолеть (не полностью), но сама необходимость этим заниматься (гуглить нетривиальный способ настройки, а затем еще тюнить его под мои потребности) - создало достаточное количество предвзятости, немного даже переходящей в негатив. При этом в GUI линуксов, сколько их помню, редактирование текста вело себя так же, как в Windows, либо очень похоже.

Еще напрягло (и напрягает до сих пор) скроллинг по колесу внешней (не эппловской, а логитековской) мыши: он то слишком быстрый, то слишком медленный, и нельзя настроить, чтоб было привычно, как в Windows.

Не понравилось, что частота сканирования внешней клавиатуры совсем уж мала (внутренняя работает без нареканий), и с нее Caps иногда не включается или не выключается, когда жмешь его слишком быстро. "А вы просто не жмите так, а жмите помедленнее, с чувством, с толком, с расстановкой", - ну, что ж, такой совет помогает. Но вот в Windows никогда не крохоборничали на этой частоте, и оно всегда, сколько помню, отрабатывало моментально (с одним исключением - когда у Windows забивается дисковая очередь - вот тогда даже ядро начинает тормозить в базовых функциях реагирования на мышь и клавиатуру)

Что еще? Ну, непривычное и неконсистентное поведение кнопок управления размером окна... но это не воспринималось, как напряг, просто местная особенность.

Остальное же плюс-минус точно такое же, как и в других компьютерах. Процессор с регистрами, память, прерывания, планировщик, тред, файл, диск, сокет, пайп, GUI с реактивной моделью, что тут еще можно придумать... [место для смайлика с разведенными руками ¯_(ツ)_/¯ ]

Теперь про плюсы.

  • не глючит (не глючит сама ОС, приложения, к сожалению, еще как глючат и вылетают, в том числе даже системный WindowServer)

  • не тормозит (заставить тормозить не удалось)

  • не греется и не жужжит вентиляторами (заставить греться и жужжать получилось, но для этого надо было выключить режим low power mode, запустить виртуалку с виндой и в ней запустить GPU Stress Test системы "волосатый бублик", при этом включив еще опции "cpu burner", и запустить этот cpu burner параллельно с бубликом)

  • производительный (10 ядер, быстрая оперативка, можно запустить виртуальную машину с виндой и в ней упомянутый "волосатый бублик", и он будет показывать 60 FPS на FullHD. Не знаю, умеет ли так какой-либо ноутбук на Windows).

  • почти все нужные тулзы тут есть сразу (ssh, openssl, base64, md5, curl, split, xmllint, вот это вот все) - на винде сейчас приходится доустанавливать даже банальный telnet. Git, как я понял, ставится вместе с Homebrew, и потом тоже доступен везде.

  • чего нету - обычно легко доустанавливается через Homebrew (типа jq для форматирования JSON или nginx, тоже бывает нужен, хотя бы захостить статику)

  • обнаружил, что MacVim довольно тесно интегрируется с шеллом (zsh), и может исполнять команды шелла прямо если написать непосредственно в текущем документе (а не в режиме командной строки), причем это корректно отрабатывает даже с sudo-командами, когда надо вводить пароль, или ping, которые выдают строку за строкой. Это повышает удобство использования CLI-утилит просто в разы, и на Винде такой тесной интеграции мне достичь не удалось, хотя дёргать CLI-утилиты таким способом можно и там тоже (см. Приложение [4]).

  • долго держит батарейку (не проверял, потому что у меня компьютер практически всегда подключен к сети, и мне это не очень актуально)

  • умеет подзаряжаться даже от старых и слабых телефонных зарядок. Как-то у меня не было нормального мощного зарядного устройства, и пришлось подключить разряженный макбук к тому, что было (телефонное зарядное устройство, 5В, 2А). Часов за 9 он набрал полный заряд. Не видел, чтобы виндобуки так умели делать.

  • есть Spotlight Search (тот самый, который по Command-Space) - вот он работает быстро и принцип монотонности соблюдает как раз просто канонически. Хотя, справедливости ради, похожий по назначению Everything Search Engine под Windows работает не хуже, если не считать, что функциональность последнего ограничена поиском только по именам файлов и каталогов.

  • вроде как не кряхтит даже под нагрузкой (две виртуальных машины, Ubuntu и Windows 11, Идея,  запущенный java-проект и запущенный dev server под node, запущенный Хром и остальное по мелочи) - и оно не демонстрирует никаких подтормаживаний, хотя график Memory Pressure в мониторе ресурсов уже устойчиво уходит в желтую зону. Это у меня с 16 Gb RAM конфигурация, а бывают и с 32.

  • экран и встроенная клавиатура, говорят, хороши, но я пользуюсь нормальной внешней клавиатурой со стандартной раскладкой, к которой приспособлен мой навык десятипальцевой слепой печати, и, по возможности, внешним монитором тоже (4K 60 Hz без проблем работает через HDMI), так что тут оценить в полной мере не могу.

  • Имеется rosetta2 (которую надо, сначала, доустановить с помощью sudo softwareupgrade rosetta2), которая позволяет запускать собранные (для Макоси, конечно) бинарники с архитектурой x86_64. Помогает, если нужно запустить что-то, что под aarch64 еще не успели пересобрать.

  • Как Ubuntu, так и ARM-версия Windows 11 запускаются в Parallels, причем работают почти что с native-производительностью. При этом Windows с помощью какой-то магии умеет запускать exe-шники всех трех архитектур: x86, x86_64 и ARM (hint: чтобы посмотреть, что это за exe-шник, можно использовать встроенную в макбук программу file). Однако полного чуда все равно не происходит, и кое-что все равно не работает: некоторые драйверы (у меня не завелся openconnect под Windows, потому что он не смог установить tap/tun драйвер, или что-то такое), а также не смогла загрузиться DLL с клавиатурной раскладкой, предназначенной для переключения по Caps Lock, собранная под x86_64, причем система ее видит и показывает в списке доступных клавиатурных раскладок, но не может использовать. Даже Microsoft Keyboard Layout Creator, запущенный под ARM-виндой, собирает DLL под архитектуру x86_64, и она под этой виндой оказывается неюзабельной.

  • красиво и престижно иметь красивый и престижный компьютер с яблоком (ну, тут, как бы да, но как бы и не совсем)

Эпилог. "И как тебе макбук"?

Скорее стал нравиться,  после полугодовой доработки напильником, но фэнбойства никакого не появилось и близко. Как-то так. У этого компьютера есть ощутимые плюсы, которые, может быть, перевешивают минусы, но минусы никуда не деваются, а устранить их могут только в корпорации Apple, потому что это вопросы идеологии. "Является ли такое поведение системы багом или фичей", вот в чем вопрос.

Стоило ли оно того (полгода не очень больших, но всё же усилий, чтобы сконфигурировать этот макбук под мои потребности виндузятника)? Вопрос почти риторический. В моем случае - скорее это было не оправдано. На Винде у меня уже всё было готовое (не только набор софта, но и клавиатурные привычки и наработанные способы решения задач), а тут мне пришлось многое заново изучать, настраивать и конфигурировать. Но с другой стороны, любим же мы компьютерщину не за то, что все настроено и работает, а именно за то, что можно возиться и все настраивать и улучшать :). По принципу "put the fun back into computing - use Linux, BSD..." Поэтому с одной стороны у меня присутствует ощущение потраченных не таких уж маленьких денег и затраченного не такого уж маленького времени, чтобы настроить этот компьютер до состояния, что я могу на нем работать (а при этом он работает плюс-минус с той же отзывчивостью, скоростью и безглючностью, что и хороший виндобук), а с другой стороны, есть и ощущение некоторого удовлетворения, что я смог разобраться и настроить как мне надо, и, в процессе этого, наверное, узнал какие-то новые нюансы взаимодействия с nix-системами.  От которых мы в ближайшем обозримом будущем никуда не денемся, потому что сейчас уже понятно, что мало-мальски важную инфраструктуру будут впредь выстраивать именно на открытых, а не на проприетарных решениях.

Короче, компьютер действительно тихий и быстрый, имеет запас прочности по производительности (я так и не смог его нагрузить своими текущими задачами по-полной), и, по сути, предлагает производительность хорошего десктопа в форм-факторе ноутбука, который еще и работает обычно абсолютно бесшумно (последнее для меня весьма важно).

Еще некоторое удовлетворение приносит факт, что я осилил дописать эту статью :)

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

Приложение. Как конкретно настроить то, сё, пятое, десятое. Технические подробности.

Мои конфиги для макоси, которые описываю ниже, я разместил в репозитории https://github.com/konstlvov/macos.

  1. Переключение РУС/ЛАТ по CapsLock. Решается с помощью создания кастомной клавиатурной раскладки "ruscaps" с помощью программы Ukelele для Макоси. Эта программа предоставляет графический интерфейс, с помощью нажимания на кнопки в котором в конце концов получается примерно такой файл:

Hidden text
<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE keyboard SYSTEM "file://localhost/System/Library/DTDs/KeyboardLayout.dtd">
<!--Created by Ukelele version 359 on 2023-02-24 at 13:05 (GMT+3)-->
<!--Last edited by Ukelele version 359 on 2023-02-26 at 13:38 (GMT+3)-->
<keyboard group="126" id="-5618" name="ruscaps" maxout="1">
    <layouts>
        <layout first="0" last="17" mapSet="ANSI" modifiers="Modifiers"/>
        <layout first="18" last="18" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="21" last="23" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="30" last="30" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="33" last="33" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="36" last="36" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="194" last="194" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="197" last="197" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="200" last="201" mapSet="JIS" modifiers="Modifiers"/>
        <layout first="206" last="207" mapSet="JIS" modifiers="Modifiers"/>
    </layouts>
    <modifierMap id="Modifiers" defaultIndex="10">
        <keyMapSelect mapIndex="0">
            <modifier keys=""/>
        </keyMapSelect>
        <keyMapSelect mapIndex="1">
            <modifier keys="anyShift"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="2">
            <modifier keys="anyOption"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="3">
            <modifier keys="anyShift caps? anyOption"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="4">
            <modifier keys="caps"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="5">
            <modifier keys="command"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="6">
            <modifier keys="anyShift command"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="7">
            <modifier keys="anyOption command"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="8">
            <modifier keys="anyShift anyOption command"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="9">
            <modifier keys="caps command"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="10">
            <modifier keys="anyControl"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="11">
            <modifier keys="caps anyControl"/>
        </keyMapSelect>
        <keyMapSelect mapIndex="12">
            <modifier keys="anyShift caps"/>
        </keyMapSelect>
    </modifierMap>
    <keyMapSet id="ANSI">
        <keyMap index="0">
            <key code="0" output="a"/>
            <key code="1" output="s"/>
            <key code="2" output="d"/>
            <key code="3" output="f"/>
            <key code="4" output="h"/>
            <key code="5" output="g"/>
            <key code="6" output="z"/>
            <key code="7" output="x"/>
            <key code="8" output="c"/>
            <key code="9" output="v"/>
            <key code="10" output="§"/>
            <key code="11" output="b"/>
            <key code="12" output="q"/>
            <key code="13" output="w"/>
            <key code="14" output="e"/>
            <key code="15" output="r"/>
            <key code="16" output="y"/>
            <key code="17" output="t"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="-"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="]"/>
            <key code="31" output="o"/>
            <key code="32" output="u"/>
            <key code="33" output="["/>
            <key code="34" output="i"/>
            <key code="35" output="p"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="l"/>
            <key code="38" output="j"/>
            <key code="39" output="&#x0027;"/>
            <key code="40" output="k"/>
            <key code="41" output=";"/>
            <key code="42" output="\"/>
            <key code="43" output=","/>
            <key code="44" output="/"/>
            <key code="45" output="n"/>
            <key code="46" output="m"/>
            <key code="47" output="."/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="`"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="1">
            <key code="0" output="A"/>
            <key code="1" output="S"/>
            <key code="2" output="D"/>
            <key code="3" output="F"/>
            <key code="4" output="H"/>
            <key code="5" output="G"/>
            <key code="6" output="Z"/>
            <key code="7" output="X"/>
            <key code="8" output="C"/>
            <key code="9" output="V"/>
            <key code="10" output="±"/>
            <key code="11" output="B"/>
            <key code="12" output="Q"/>
            <key code="13" output="W"/>
            <key code="14" output="E"/>
            <key code="15" output="R"/>
            <key code="16" output="Y"/>
            <key code="17" output="T"/>
            <key code="18" output="!"/>
            <key code="19" output="@"/>
            <key code="20" output="#"/>
            <key code="21" output="$"/>
            <key code="22" output="^"/>
            <key code="23" output="%"/>
            <key code="24" output="+"/>
            <key code="25" output="("/>
            <key code="26" output="&#x0026;"/>
            <key code="27" output="_"/>
            <key code="28" output="*"/>
            <key code="29" output=")"/>
            <key code="30" output="}"/>
            <key code="31" output="O"/>
            <key code="32" output="U"/>
            <key code="33" output="{"/>
            <key code="34" output="I"/>
            <key code="35" output="P"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="L"/>
            <key code="38" output="J"/>
            <key code="39" output="&#x0022;"/>
            <key code="40" output="K"/>
            <key code="41" output=":"/>
            <key code="42" output="|"/>
            <key code="43" output="&#x003C;"/>
            <key code="44" output="?"/>
            <key code="45" output="N"/>
            <key code="46" output="M"/>
            <key code="47" output="&#x003E;"/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="~"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="2">
            <key code="0" output=""/>
            <key code="1" output=""/>
            <key code="2" output=""/>
            <key code="3" output=""/>
            <key code="4" output=""/>
            <key code="5" output=""/>
            <key code="6" output=""/>
            <key code="7" output=""/>
            <key code="8" output=""/>
            <key code="9" output=""/>
            <key code="10" output=""/>
            <key code="11" output=""/>
            <key code="12" output=""/>
            <key code="13" output=""/>
            <key code="14" output=""/>
            <key code="15" output=""/>
            <key code="16" output=""/>
            <key code="17" output=""/>
            <key code="18" output=""/>
            <key code="19" output=""/>
            <key code="20" output=""/>
            <key code="21" output=""/>
            <key code="22" output=""/>
            <key code="23" output=""/>
            <key code="24" output=""/>
            <key code="25" output=""/>
            <key code="26" output=""/>
            <key code="27" output=""/>
            <key code="28" output=""/>
            <key code="29" output=""/>
            <key code="30" output=""/>
            <key code="31" output=""/>
            <key code="32" output=""/>
            <key code="33" output=""/>
            <key code="34" output=""/>
            <key code="35" output=""/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output=""/>
            <key code="38" output=""/>
            <key code="39" output=""/>
            <key code="40" output=""/>
            <key code="41" output=""/>
            <key code="42" output=""/>
            <key code="43" output=""/>
            <key code="44" output=""/>
            <key code="45" output=""/>
            <key code="46" output=""/>
            <key code="47" output=""/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=""/>
            <key code="50" output=""/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output=""/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output=""/>
            <key code="69" output=""/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output=""/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output=""/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output=""/>
            <key code="82" output=""/>
            <key code="83" output=""/>
            <key code="84" output=""/>
            <key code="85" output=""/>
            <key code="86" output=""/>
            <key code="87" output=""/>
            <key code="88" output=""/>
            <key code="89" output=""/>
            <key code="91" output=""/>
            <key code="92" output=""/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="3">
            <key code="0" output=""/>
            <key code="36" output="&#x000D;"/>
            <key code="48" output="&#x0009;"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="66" output="&#x001D;"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="4">
            <key code="0" output="ф"/>
            <key code="1" output="ы"/>
            <key code="2" output="в"/>
            <key code="3" output="а"/>
            <key code="4" output="р"/>
            <key code="5" output="п"/>
            <key code="6" output="я"/>
            <key code="7" output="ч"/>
            <key code="8" output="с"/>
            <key code="9" output="м"/>
            <key code="10" output="ё"/>
            <key code="11" output="и"/>
            <key code="12" output="й"/>
            <key code="13" output="ц"/>
            <key code="14" output="у"/>
            <key code="15" output="к"/>
            <key code="16" output="н"/>
            <key code="17" output="е"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="-"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="ъ"/>
            <key code="31" output="щ"/>
            <key code="32" output="г"/>
            <key code="33" output="х"/>
            <key code="34" output="ш"/>
            <key code="35" output="з"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="д"/>
            <key code="38" output="о"/>
            <key code="39" output="э"/>
            <key code="40" output="л"/>
            <key code="41" output="ж"/>
            <key code="42" output="\"/>
            <key code="43" output="б"/>
            <key code="44" output="."/>
            <key code="45" output="т"/>
            <key code="46" output="ь"/>
            <key code="47" output="ю"/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="ё"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="5">
            <key code="0" output="a"/>
            <key code="1" output="s"/>
            <key code="2" output="d"/>
            <key code="3" output="f"/>
            <key code="4" output="h"/>
            <key code="5" output="g"/>
            <key code="6" output="z"/>
            <key code="7" output="x"/>
            <key code="8" output="c"/>
            <key code="9" output="v"/>
            <key code="10" output=""/>
            <key code="11" output="b"/>
            <key code="12" output="q"/>
            <key code="13" output="w"/>
            <key code="14" output="e"/>
            <key code="15" output="r"/>
            <key code="16" output="y"/>
            <key code="17" output="t"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="-"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="]"/>
            <key code="31" output="o"/>
            <key code="32" output="u"/>
            <key code="33" output="["/>
            <key code="34" output="i"/>
            <key code="35" output="p"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="l"/>
            <key code="38" output="j"/>
            <key code="39" output="&#x0027;"/>
            <key code="40" output="k"/>
            <key code="41" output=";"/>
            <key code="42" output="\"/>
            <key code="43" output=","/>
            <key code="44" output="/"/>
            <key code="45" output="n"/>
            <key code="46" output="m"/>
            <key code="47" output="."/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="`"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output=""/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="6">
            <key code="0" output="A"/>
            <key code="1" output="S"/>
            <key code="2" output="D"/>
            <key code="3" output="F"/>
            <key code="4" output="H"/>
            <key code="5" output="G"/>
            <key code="6" output="Z"/>
            <key code="7" output="X"/>
            <key code="8" output="C"/>
            <key code="9" output="V"/>
            <key code="11" output="B"/>
            <key code="12" output="Q"/>
            <key code="13" output="W"/>
            <key code="14" output="E"/>
            <key code="15" output="R"/>
            <key code="16" output="Y"/>
            <key code="17" output="T"/>
            <key code="18" output="!"/>
            <key code="19" output="@"/>
            <key code="20" output="#"/>
            <key code="21" output="$"/>
            <key code="22" output="^"/>
            <key code="23" output="%"/>
            <key code="24" output="+"/>
            <key code="25" output="("/>
            <key code="26" output="&#x0026;"/>
            <key code="27" output="_"/>
            <key code="28" output="*"/>
            <key code="29" output=")"/>
            <key code="30" output="}"/>
            <key code="31" output="O"/>
            <key code="32" output="U"/>
            <key code="33" output="{"/>
            <key code="34" output="I"/>
            <key code="35" output="P"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="L"/>
            <key code="38" output="J"/>
            <key code="39" output="&#x0022;"/>
            <key code="40" output="K"/>
            <key code="41" output=":"/>
            <key code="42" output="|"/>
            <key code="43" output="&#x003C;"/>
            <key code="44" output="?"/>
            <key code="45" output="N"/>
            <key code="46" output="M"/>
            <key code="47" output="&#x003E;"/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="~"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="7">
            <key code="0" output=""/>
            <key code="36" output="&#x000D;"/>
            <key code="48" output="&#x0009;"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="66" output="&#x001D;"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="8">
            <key code="0" output=""/>
            <key code="36" output="&#x000D;"/>
            <key code="48" output="&#x0009;"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="66" output="&#x001D;"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="9">
            <key code="0" output="A"/>
            <key code="1" output="S"/>
            <key code="2" output="D"/>
            <key code="3" output="F"/>
            <key code="4" output="H"/>
            <key code="5" output="G"/>
            <key code="6" output="Z"/>
            <key code="7" output="X"/>
            <key code="8" output="C"/>
            <key code="9" output="V"/>
            <key code="10" output=""/>
            <key code="11" output="B"/>
            <key code="12" output="Q"/>
            <key code="13" output="W"/>
            <key code="14" output="E"/>
            <key code="15" output="R"/>
            <key code="16" output="Y"/>
            <key code="17" output="T"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="-"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="]"/>
            <key code="31" output="O"/>
            <key code="32" output="U"/>
            <key code="33" output="["/>
            <key code="34" output="I"/>
            <key code="35" output="P"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="L"/>
            <key code="38" output="J"/>
            <key code="39" output="&#x0027;"/>
            <key code="40" output="K"/>
            <key code="41" output=";"/>
            <key code="42" output="\"/>
            <key code="43" output=","/>
            <key code="44" output="/"/>
            <key code="45" output="N"/>
            <key code="46" output="M"/>
            <key code="47" output="."/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="`"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output=""/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="10">
            <key code="0" output="&#x0001;"/>
            <key code="1" output="&#x0013;"/>
            <key code="2" output="&#x0004;"/>
            <key code="3" output="&#x0006;"/>
            <key code="4" output="&#x0008;"/>
            <key code="5" output="&#x0007;"/>
            <key code="6" output="&#x001A;"/>
            <key code="7" output="&#x0018;"/>
            <key code="8" output="&#x0003;"/>
            <key code="9" output="&#x0016;"/>
            <key code="10" output="0"/>
            <key code="11" output="&#x0002;"/>
            <key code="12" output="&#x0011;"/>
            <key code="13" output="&#x0017;"/>
            <key code="14" output="&#x0005;"/>
            <key code="15" output="&#x0012;"/>
            <key code="16" output="&#x0019;"/>
            <key code="17" output="&#x0014;"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="&#x001F;"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="&#x001D;"/>
            <key code="31" output="&#x000F;"/>
            <key code="32" output="&#x0015;"/>
            <key code="33" output="&#x001B;"/>
            <key code="34" output="&#x0009;"/>
            <key code="35" output="&#x0010;"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="&#x000C;"/>
            <key code="38" output="&#x000A;"/>
            <key code="39" output="&#x0027;"/>
            <key code="40" output="&#x000B;"/>
            <key code="41" output=";"/>
            <key code="42" output="&#x001C;"/>
            <key code="43" output=","/>
            <key code="44" output="/"/>
            <key code="45" output="&#x000E;"/>
            <key code="46" output="&#x000D;"/>
            <key code="47" output="."/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=""/>
            <key code="50" output="`"/>
            <key code="51" output="&#x0008;"/>
            <key code="52" output="&#x0003;"/>
            <key code="53" output="&#x001B;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="102" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="104" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="108" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="110" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="112" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="11">
            <key code="0" output="&#x0001;"/>
            <key code="1" output="&#x0013;"/>
            <key code="2" output="&#x0004;"/>
            <key code="3" output="&#x0006;"/>
            <key code="4" output="&#x0008;"/>
            <key code="5" output="&#x0007;"/>
            <key code="6" output="&#x001A;"/>
            <key code="7" output="&#x0018;"/>
            <key code="8" output="&#x0003;"/>
            <key code="9" output="&#x0016;"/>
            <key code="10" output="0"/>
            <key code="11" output="&#x0002;"/>
            <key code="12" output="&#x0011;"/>
            <key code="13" output="&#x0017;"/>
            <key code="14" output="&#x0005;"/>
            <key code="15" output="&#x0012;"/>
            <key code="16" output="&#x0019;"/>
            <key code="17" output="&#x0014;"/>
            <key code="18" output="1"/>
            <key code="19" output="2"/>
            <key code="20" output="3"/>
            <key code="21" output="4"/>
            <key code="22" output="6"/>
            <key code="23" output="5"/>
            <key code="24" output="="/>
            <key code="25" output="9"/>
            <key code="26" output="7"/>
            <key code="27" output="&#x001F;"/>
            <key code="28" output="8"/>
            <key code="29" output="0"/>
            <key code="30" output="&#x001D;"/>
            <key code="31" output="&#x000F;"/>
            <key code="32" output="&#x0015;"/>
            <key code="33" output="&#x001B;"/>
            <key code="34" output="&#x0009;"/>
            <key code="35" output="&#x0010;"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="&#x000C;"/>
            <key code="38" output="&#x000A;"/>
            <key code="39" output="&#x0027;"/>
            <key code="40" output="&#x000B;"/>
            <key code="41" output=";"/>
            <key code="42" output="&#x001C;"/>
            <key code="43" output=","/>
            <key code="44" output="/"/>
            <key code="45" output="&#x000E;"/>
            <key code="46" output="&#x000D;"/>
            <key code="47" output="."/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=""/>
            <key code="50" output="`"/>
            <key code="51" output="&#x0008;"/>
            <key code="52" output="&#x0003;"/>
            <key code="53" output="&#x001B;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="102" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="104" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="108" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="110" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="112" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
        <keyMap index="12">
            <key code="0" output="Ф"/>
            <key code="1" output="Ы"/>
            <key code="2" output="В"/>
            <key code="3" output="А"/>
            <key code="4" output="Р"/>
            <key code="5" output="П"/>
            <key code="6" output="Я"/>
            <key code="7" output="Ч"/>
            <key code="8" output="С"/>
            <key code="9" output="М"/>
            <key code="10" output="Ё"/>
            <key code="11" output="И"/>
            <key code="12" output="Й"/>
            <key code="13" output="Ц"/>
            <key code="14" output="У"/>
            <key code="15" output="К"/>
            <key code="16" output="Н"/>
            <key code="17" output="Е"/>
            <key code="18" output="!"/>
            <key code="19" output="&#x0022;"/>
            <key code="20" output="№"/>
            <key code="21" output=";"/>
            <key code="22" output=":"/>
            <key code="23" output="%"/>
            <key code="24" output="+"/>
            <key code="25" output="("/>
            <key code="26" output="?"/>
            <key code="27" output="_"/>
            <key code="28" output="*"/>
            <key code="29" output=")"/>
            <key code="30" output="Ъ"/>
            <key code="31" output="Щ"/>
            <key code="32" output="Г"/>
            <key code="33" output="Х"/>
            <key code="34" output="Ш"/>
            <key code="35" output="З"/>
            <key code="36" output="&#x000D;"/>
            <key code="37" output="Д"/>
            <key code="38" output="О"/>
            <key code="39" output="Э"/>
            <key code="40" output="Л"/>
            <key code="41" output="Ж"/>
            <key code="42" output="/"/>
            <key code="43" output="Б"/>
            <key code="44" output=","/>
            <key code="45" output="Т"/>
            <key code="46" output="Ь"/>
            <key code="47" output="Ю"/>
            <key code="48" output="&#x0009;"/>
            <key code="49" output=" "/>
            <key code="50" output="Ë"/>
            <key code="51" output="&#x0008;"/>
            <key code="53" output="&#x001B;"/>
            <key code="64" output="&#x0010;"/>
            <key code="65" output="."/>
            <key code="66" output="&#x001D;"/>
            <key code="67" output="*"/>
            <key code="69" output="+"/>
            <key code="70" output="&#x001C;"/>
            <key code="71" output="&#x001B;"/>
            <key code="72" output="&#x001F;"/>
            <key code="75" output="/"/>
            <key code="76" output="&#x0003;"/>
            <key code="77" output="&#x001E;"/>
            <key code="78" output="-"/>
            <key code="79" output="&#x0010;"/>
            <key code="80" output="&#x0010;"/>
            <key code="81" output="="/>
            <key code="82" output="0"/>
            <key code="83" output="1"/>
            <key code="84" output="2"/>
            <key code="85" output="3"/>
            <key code="86" output="4"/>
            <key code="87" output="5"/>
            <key code="88" output="6"/>
            <key code="89" output="7"/>
            <key code="91" output="8"/>
            <key code="92" output="9"/>
            <key code="96" output="&#x0010;"/>
            <key code="97" output="&#x0010;"/>
            <key code="98" output="&#x0010;"/>
            <key code="99" output="&#x0010;"/>
            <key code="100" output="&#x0010;"/>
            <key code="101" output="&#x0010;"/>
            <key code="103" output="&#x0010;"/>
            <key code="105" output="&#x0010;"/>
            <key code="106" output="&#x0010;"/>
            <key code="107" output="&#x0010;"/>
            <key code="109" output="&#x0010;"/>
            <key code="111" output="&#x0010;"/>
            <key code="113" output="&#x0010;"/>
            <key code="114" output="&#x0005;"/>
            <key code="115" output="&#x0001;"/>
            <key code="116" output="&#x000B;"/>
            <key code="117" output="&#x007F;"/>
            <key code="118" output="&#x0010;"/>
            <key code="119" output="&#x0004;"/>
            <key code="120" output="&#x0010;"/>
            <key code="121" output="&#x000C;"/>
            <key code="122" output="&#x0010;"/>
            <key code="123" output="&#x001C;"/>
            <key code="124" output="&#x001D;"/>
            <key code="125" output="&#x001F;"/>
            <key code="126" output="&#x001E;"/>
        </keyMap>
    </keyMapSet>
    <keyMapSet id="JIS">
        <keyMap index="0" baseMapSet="ANSI" baseIndex="0">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="1" baseMapSet="ANSI" baseIndex="1">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="2" baseMapSet="ANSI" baseIndex="2">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="3" baseMapSet="ANSI" baseIndex="3">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="4" baseMapSet="ANSI" baseIndex="4">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="5" baseMapSet="ANSI" baseIndex="5">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="6" baseMapSet="ANSI" baseIndex="6">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="7" baseMapSet="ANSI" baseIndex="7">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="8" baseMapSet="ANSI" baseIndex="8">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="9" baseMapSet="ANSI" baseIndex="9">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="10" baseMapSet="ANSI" baseIndex="10">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="11" baseMapSet="ANSI" baseIndex="11">
            <key code="512" output=""/>
        </keyMap>
        <keyMap index="12" baseMapSet="ANSI" baseIndex="12">
            <key code="512" output=""/>
        </keyMap>
    </keyMapSet>
</keyboard>

Потом этот файл помещается в /Users/konst/Library/Keyboard Layouts/  ,  в настройках системы он становится виден как новая клавиатурная раскладка с названием ruscaps, и, когда ее выбрать, в режиме, когда включен Caps, набираются русские буквы, а когда выключен - латинские. Система же думает, что язык и клавиатурная раскладка никогда не переключается.

  1. Стандартное (почти) поведение Ctrl, Shift, Home, End, PgUp, PgDown и стрелочных клавиш в режиме редактирования текста достигается созданием файла Users/konst/Library/KeyBindings/DefaultKeyBinding.dict

в котором написано примерно следующее:

Hidden text
{ 
  "^\UF72B"  = "moveToEndOfDocument:";                         /* Ctrl-End */ 
  "^$\UF72B" = "moveToEndOfDocumentAndModifySelection:";       /* Ctrl + Shift + End */ 
  "^\UF729"  = "moveToBeginningOfDocument:";                   /* Ctrl  + Home  */ 
  "^$\UF729" = "moveToBeginningOfDocumentAndModifySelection:"; /* Shift + Ctrl  + Home */ 
  "\UF729"   = "moveToBeginningOfLine:";                       /* Home         */ 
  "$\UF729"  = "moveToBeginningOfLineAndModifySelection:";     /* Shift + Home */ 
  "\UF72B"   = "moveToEndOfLine:";                             /* End          */ 
  "$\UF72B"  = "moveToEndOfLineAndModifySelection:";           /* Shift + End  */ 
  "\UF72C"   = "pageUp:";                                      /* PageUp       */ 
  "\UF72D"   = "pageDown:";                                    /* PageDown     */ 
  "^\U007F"  = "deleteWordBackward:";                          /* Ctrl  + Backspace */ 
  "^c"       = "copy:";                                        /* Ctrl  + C */ 
  "^v"       = "paste:";                                       /* Ctrl  + V */ 
  "^x"       = "cut:";                                         /* Ctrl  + X */ 
  "^z"       = "undo:";                                        /* Ctrl  + Z */ 
  "^с"       = "copy:";                                        /* Ctrl  + C in Russian keyboard layout */ 
  "^м"       = "paste:";                                       /* Ctrl  + V in Russian keyboard layout */ 
  "^ч"       = "cut:";                                         /* Ctrl  + X in Russian keyboard layout */ 
  "^я"       = "undo:";                                        /* Ctrl  + Z in Russian keyboard layout */ 
   
  "^\UF702" = moveWordLeft:; 
  "^\UF703" = moveWordRight:; 
  "^$\UF702" = moveWordLeftAndModifySelection:; 
  "^$\UF703" = moveWordRightAndModifySelection:; 
}

  1. Далее приведены страшные символы, создающие полезные пункты в пользовательском меню Midnight Commander, которое вызывается по F2. Придумать их невозможно, можно только нагуглить из интернета.

Итак, для начала создаем файл ~/mc.menu и в нем дописываем, кому что надо. Мне сразу понадобилось такое:

+ ! t t
v       Edit with MacVim
        /Applications/MacVim.app/Contents/MacOS/Vim --remote-tab-silent %f
+ ! t t
@       Set full path to current file to flist
        echo %d/%f >> ~/flist 
+ ! t t
l       Launch file (with finder)
        open %f
+ ! t t
o       Open and show file in Finder
        open -R %f
+ ! t t
@       Do something bad on the current file
        CMD=%{Enter command}
        $CMD %f
  1. Интеграция Vim и терминала (zsh) у меня выглядит примерно так (фрагмент из моего .vimrc):

" Отформатировать JSON
vnoremap ,j :! /opt/homebrew/bin/jq . <CR>

" Отформатировать XML
vnoremap ,f :!xmllint --format -<CR>

" Исполнить текущую строку в bash (например, вызвать curl на api endpoint)
" точка перед w означает, что использовать надо конкретную строку
nnoremap ,e :.w !bash<CR>:echo('...done.')<CR>

" то же самое, но вставить вывод команды в текущий буфер
nnoremap ,E :exec 'r!'.getline('.')<CR>

" Исполнить текущее выделение (range of lines) в bash
vnoremap ,e :w !bash<CR>

Теги:
Хабы:
Всего голосов 83: ↑54 и ↓29+41
Комментарии317

Публикации

Истории

Работа

Веб дизайнер
22 вакансии

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань