Для кого эта статья
Эта статья для людей, которые любят минимализм и простоту в разработке. Кто хочет, чтобы включил и все заработало без особых дополнительных усилий. Я постарался, чтобы эта статья подошла как для простого обывателя, так и для профессионала, которые обладают слепым методом печати. Надеюсь, что каждый найдет для себя что-то полезное в этой статье.
С чего все начиналось
Мне всегда нравилось оптимизировать свое рабочее простанство. Но после того как я познакомился поближе с vim, а затем с nvim, то во мне уже появилась какая-то одержимость этим. Я решил, что хочу забыть про мышь и использовать только клавиатуру в своем распоряжении.
По началу я находил такие решения как yabai или Aerospace — популярные тайлинговые менеджеры окон для macOS. В случае с yabai, решение показалось мне слишком громоздким, так как требовало дополнительную утилиту skhd, также у него есть некоторые предостережения. Самое сомнительное из них, что нужно отключать System Integrity Protection на уровне системы. Отключение этой системы позволяет yabai полноценно управлять панелью и рабочими пространствами macOS. Однако, отключать какие-то системы безопастности в угоду по��ноценного использования какого-то приложения я не готов.
Поэтому, покопавшись в альтернативных решениях, я натолкнулся на Aerospace. На первый взгляд он показался мне очень хорошим решением, лишенным минусов yabai. Причем решили они этот минус достаточно тривиальным способом, отказавшись от workspaces macOS, сделав свои workspaces на уровне приложения. Однако, как оказалось, их решение не выдерживает нагрузку и через какое-то время начинает дико лагать, все нажатия хоткеев переключения на другие окна или рабочие пространства начинают отрабатывать через пару секунд, а то и вовсе встают колом и перестают работать.
Еще до встречи с yabai и Aerospace я пользовался Space Launcher и был очень доволен этим решением. Оданко, мне хотелось полноценного workflow, которое бы позволило мне дополнительно управлять окнами как я пожелаю. Придерживаясь принципа минимализма и являясь любителем цельных экосистем я полагал, что могу достигнуть этого используя лишь одно приложение, которое сможет решить все мои хотелки. К сожалению, я ошибался.
Немного растроившись, я решил, что нужно расширить свое сознание и позволить себе использовать несколько инструментов. На этот раз, главным принципом было — минимум приложений, максимум функционала. Причем сначала я думал, что хочу, чтобы каждое приложение делало только одну задачу, но делало это максимально хорошо. Мне не хотелось, чтобы приложение делало одну нужную мне задачу и давало еще возможность заваривать кофе, вызывать такси и отправлять письма. Поэтому я остановился на spaceLauncher + Rectangle.
Space Launcher

С помощью Space Launcher можно маппить на пробел почти что угодно:
Переход по ссылке
Открытие приложения
Открытие папки
Открытие файла
Запуск файла
Запуск AppleScript
Даже переключение на другой язык
И многое другое...
По сути, уже только пункты 5 и 6 позволяют управлять системой на 80% процентов.
Мне самому нужно не много, так как большую часть времени я просиживаю в терминале.

По скрину выше можно заметить, что я стараюсь задавать горячие клавиши по первой букве названия приложения. В случае, когда у меня есть несколько приложений, которые начинаются на одну и ту же букву, нужно обязательно задать вторую. Ее я выбираю по принципу — она должна быть либо второй частью PascalCase, либо быть «опорной», т. е, чтобы при мысленной подстановке букв между первой буквой и второй, можно было составить осмысленное название приложения, например CursoR. Благодаря этому у меня в голове возникают ассоциации и получается быстрее запомнить.
Еще на скрине можно заметить для некоторых приложений надпись "switch to previous app". При создании маппинга, есть возможность задать поведение при повтором нажатии того же сочетания клавиш. Это удобно, когда у нас, например, на фоне есть заметки и мы из них что-то переписываем в другой источник. В таком случае хочется быстрее переключаться и удобнее один раз зажать пробел и нажимать только N для переключения туда и обратно. Дополнительно можно либо прятать приложение (Hide), либо ничего не делать (None).
Немного о Rectange и почему я его все таки не выбрал

Попробовав Rectange, и какое-то время на нем побывав я уже почувствовал комфорт, но чего-то все-таки не хватало, а что-то мне казалось излишним.
По возможным шорткатам можно увидеть, что гибкость у Rectange впечатляющая. Однако, все эти шорткаты я не использую и отключаю, дабы не занимать место на клавиатуре. Сильно ужимать окна мне не нужно, потому что я использую macOS скейлинг экрана и на рабочем столе у меня не так много места. Мне также не нужен снэппинг, иногда он только мешал, поэтому я его отключал. Из-за большого кол-ва настроек, в свое время, я не нашел в Rectangle фичу, которую нашел в другом инструменте, о котором напишу дальше.
Стоит отметить, что я не говорю о том, что Rectangle плохой, это отличный инструмент и я думаю, что много кто из читающих эту статью предпочтут именно его. Мне же он подошел, но не до конца. =)
Raycast — Your shortcut to everything

Еще пользуясь Rectangle, я как маленький ребенок решил рассказать об этом своим коллегам, мол давайте пробуйте, классная штука. Заодно я решил у каждого спросить про их workflow. Очень многие из них использовали Raycast от которого я постоянно отворачивался.
Так почему же я от него отворачивался? Да потому что он может почти все, еще чуть-чуть и его разработчики добавят возможность вызывать лифт.
Не надо, я пошутил.
Однако, решив все таки покопаться в нем и изучить подробнее, я нашел все то, что мне нужно было и даже б��льше. Я нашел то, о чем раньше даже не думал. Например, теперь, чтобы попасть на рабочий созвон из календаря, мне не нужно открывать календарь и искать нужное событие с ссылкой. Открываю Raycast, далее выбираю календарь и после этого нажатием Enter, выбираю ссылку на Zoom. Никакого использования мыши, еще и vim-like сочетания клавиш работают, можно выбирать пункты с помощью CTRL+N/P (next/prev), супер удобно. И это не все, что может вам пригодиться, но об этом не в этой статье.

И это еще не все
Я нашел в Raycast управление окнами. В тот момент я подумал — это мне не нужно, у меня же есть Rectangle. Однако, фича с циклическим переключением окон, которая включена в Raycast по умолчанию и которую я в свое время не нашел в Rectangle, заставила задуматься над тем, чтобы удалить Rectangle и оставить Raycast как швейцарских нож для нехватающих мне фич. В том числе, в качестве менеджера окон.
Таким образом, теперь не нужно запоминать большое кол-во сочетаний клавиш, но при этом все равно имеем простую систему ресайзинга окон. That's all I need.

На гифке видно, что я нажимаю одно и тоже сочетание клавиш для того чтобы настроить окно так, как мне нужно. Rectangle же по умолчанию перебрасывает окна на другой дисплей. Скачав Rectangle во время написания этой статьи, я не нашел фичи по вынесению окон на другие вокрспейсы macOS, как это умеет Raycast. Стоит отметить, что для работы этой фичи Raycast не требует отключения каких либо служб безопасности, в отличие от yabai.
Еще немного полезностей
MacOS радует своими хоткеями. Благодаря AppKit, SwiftUI и Human Interface Guidelines от Apple. Многие хоткеи работают одинаково во всех программах. например:
Переключение по табам во многих приложениях работают одинаково, что в VSCode, что в браузере можно перемещаться по вкладкам с помощью
option+cmd+стрелка влево/вправоОткрыть дополнительный инстанс приложения всегда можно с помощью
cmd+N, причем для браузера существует вариацияcmd+shift+N, которая открывает браузер в режиме инкогнитоОткрыв несколько инстансов одного и того же приложения можно переключаться между ними с помощью
cmd+`и обратноcmd+shift+`Обычно я не использую в браузере переключение по табам, так как это может быть очень долго. Я подсел на браузерное расширение Previous Tab. Настроил его на сочетание клавиш
ctrl+b, типо (back) и переключаюсь таким образом между вкладкамиЕще одно классное расширение — Vimium. Оно позволяет не только быстро переключаться по вкладкам, но также быстро открывать закладки. Много вкладок? Не проблема, нажимаешь
shift+tи можешь найти вкладку по ее названию. Много закладок? Тоже не проблема, нажимаешьshift+bи можешь также поиском найти нужную закладку по названию. Он умеет еще много всего, всем рекомендую к ознакомлению. Даже тем, кто не использует vim повсеместно и не знает что это такое. Однако, это расширение стоит отключать на каких нибудь интерактивных сайтах, где нужно пользоваться клавишами по другим причинам. Например, для удаленных консолей.
Конфигурация
Это все конечно круто, но что по dotfiles? Мы программисты люди ленивые, а еще любим часто перенакатывать систему, поэтому не очень хочется каждый раз возиться с настройкой.
SpaceLauncher
Для Space Launcher я нашел следующий способ:
Экспорт настроек в dotfiles (не бинарно)
Закрываем SpaceLauncher (важно, чтобы он не перезаписал prefs в процессе).
Выбераем, где хранить файл в репозитории, например:
~/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plistЭкспортируем настройки в файл:
defaults export name.guoc.SpaceLauncher "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"На всякий случай принудительно сделаем XML (чтобы точно не было бинарного plist и были нормальные диффы в git):
plutil -convert xml1 "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"Быстрая проверка, что файл читаемый и это именно XML:
plutil -p "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist" | head
Импорт настроек из dotfiles на другом Mac
Убеждаемся, что SpaceLauncher закрыт.
Импортируем plist обратно в домен:
defaults import name.guoc.SpaceLauncher "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"Сбрываем кеш preferences (чтобы изменения точно подхватились):
killall cfprefsd 2>/dev/null || trueЗапускаем SpaceLauncher и проверяем, что настройки применились.
Что делает каждая команда:
defaults export: читает настройки из macOS Preferences по домену и сохраняет их в plist-файл.plutil -convert xml1: конвертирует plist в текстовый XML-формат (удобно для git).plutil -p: печатает структуру plist, чтобы быстро проверить корректность.defaults import: записывает значения из plist в macOS Preferences под этим доменом.killall cfprefsd:перезапускает демон, который кеширует prefs; иначе иногда изменения “не видны” сразу.
Raycast
Для Raycast все проще:
Экспортируем
Открываем Raycast
Заходим в настройки с помощью
cmd+,Переходим в Advanced
Скроллим вниз и находим Import / Export
Нажимаем на Export
Далее, важно, нажимаем на кнопку Export справа
Вводим пароль
Выбираем папку, куда хотим сгенерировать конфиг
PROFIT
Импортируем
Нажимаем в том же месте где был Export уже Import
Далее Select File
Выбираем файл
Вводим пароль
PROFIT
Есть вариант еще проще. С установленным Raycast, просто открываем конфиг с помощью команды
open "$HOME/dotfiles/macos/Raycast/Raycast.rayconfig"Вводим пароль
PROFIT
Итого
В этой статье я постарался описать весь свой путь, от сложных приложений с некоторыми условностями, до чего-то простого и минималистичного, что будет понятно и удобно большинству пользователей. В своих будущих статьях я бы хотел продолжить эту тему и погрузиться немного глубже. А именно, сделать переход из рабочего стола в рабочий инструмент. Для меня рабочим инструментом является nvim и с ним я придерживаюсь тех же принципов — минимальная настройка и ее простота. А вообще, как же это хорошо иногда, включил и все работает по умолчанию. :-)
А какой workflow у вас? Буду рад вашим комментариям :-)
