Для кого эта статья

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

С чего все начиналось

Мне всегда нравилось оптимизировать свое рабочее простанство. Но после того как я познакомился поближе с 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 можно маппить на пробел почти что угодно:

  1. Переход по ссылке

  2. Открытие приложения

  3. Открытие папки

  4. Открытие файла

  5. Запуск файла

  6. Запуск AppleScript

  7. Даже переключение на другой язык

  8. И многое другое...

По сути, уже только пункты 5 и 6 позволяют управлять системой на 80% процентов.

Мне самому нужно не много, так как большую часть времени я просиживаю в терминале.

Мои настройки
Мои настройки

По скрину выше можно заметить, что я стараюсь задавать горячие клавиши по первой букве названия приложения. В случае, когда у меня есть несколько приложений, которые начинаются на одну и ту же букву, нужно обязательно задать вторую. Ее я выбираю по принципу — она должна быть либо второй частью PascalCase, либо быть «опорной», т. е, чтобы при мысленной подстановке букв между первой буквой и второй, можно было составить осмысленное название приложения, например CursoR. Благодаря этому у меня в голове возникают ассоциации и получается быстрее запомнить.

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

Немного о Rectange и почему я его все таки не выбрал

Горячие клавиши Rectange по умолчанию
Горячие клавиши Rectange по умолчанию

Попробовав Rectange, и какое-то время на нем побывав я уже почувствовал комфорт, но чего-то все-таки не хватало, а что-то мне казалось излишним.

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

Стоит отметить, что я не говорю о том, что Rectangle плохой, это отличный инструмент и я думаю, что много кто из читающих эту статью предпочтут именно его. Мне же он подошел, но не до конца. =)

Raycast — Your shortcut to everything

Raycast vs Spotlight
Raycast vs Spotlight

Еще пользуясь Rectangle, я как маленький ребенок решил рассказать об этом своим коллегам, мол давайте пробуйте, классная штука. Заодно я решил у каждого спросить про их workflow. Очень многие из них использовали Raycast от которого я постоянно отворачивался.

Так почему же я от него отворачивался? Да потому что он может почти все, еще чуть-чуть и его разработчики добавят возможность вызывать лифт.

Не надо, я пошутил.

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

Мои настройки для Raycast
Мои настройки для Raycast

И это еще не все

Я нашел в Raycast управление окнами. В тот момент я подумал — это мне не нужно, у меня же есть Rectangle. Однако, фича с циклическим переключением окон, которая включена в Raycast по умолчанию и которую я в свое время не нашел в Rectangle, заставила задуматься над тем, чтобы удалить Rectangle и оставить Raycast как швейцарских нож для нехватающих мне фич. В том числе, в качестве менеджера окон.

Таким образом, теперь не нужно запоминать большое кол-во сочетаний клавиш, но при этом все равно имеем простую систему ресайзинга окон. That's all I need.

Циклическое переключение окна в действии
Циклическое переключение окна в действии

На гифке видно, что я нажимаю одно и тоже сочетание клавиш для того чтобы настроить окно так, как мне нужно. Rectangle же по умолчанию перебрасывает окна на другой дисплей. Скачав Rectangle во время написания этой статьи, я не нашел фичи по вынесению окон на другие вокрспейсы macOS, как это умеет Raycast. Стоит отметить, что для работы этой фичи Raycast не требует отключения каких либо служб безопасности, в отличие от yabai.

Еще немного полезностей

MacOS радует своими хоткеями. Благодаря AppKit, SwiftUI и Human Interface Guidelines от Apple. Многие хоткеи работают одинаково во всех программах. например:

  1. Переключение по табам во многих приложениях работают одинаково, что в VSCode, что в браузере можно перемещаться по вкладкам с помощью option+cmd+стрелка влево/вправо

  2. Открыть дополнительный инстанс приложения всегда можно с помощью cmd+N, причем для браузера существует вариация cmd+shift+N, которая открывает браузер в режиме инкогнито

  3. Открыв несколько инстансов одного и того же приложения можно переключаться между ними с помощью cmd+` и обратно cmd+shift+`

  4. Обычно я не использую в браузере переключение по табам, так как это может быть очень долго. Я подсел на браузерное расширение Previous Tab. Настроил его на сочетание клавиш ctrl+b, типо (back) и переключаюсь таким образом между вкладками

  5. Еще одно классное расширение — Vimium. Оно позволяет не только быстро переключаться по вкладкам, но также быстро открывать закладки. Много вкладок? Не проблема, нажимаешь shift+tи можешь найти вкладку по ее названию. Много закладок? Тоже не проблема, нажимаешь shift+b и можешь также поиском найти нужную закладку по названию. Он умеет еще много всего, всем рекомендую к ознакомлению. Даже тем, кто не использует vim повсеместно и не знает что это такое. Однако, это расширение стоит отключать на каких нибудь интерактивных сайтах, где нужно пользоваться клавишами по другим причинам. Например, для удаленных консолей.

Конфигурация

Это все конечно круто, но что по dotfiles? Мы программисты люди ленивые, а еще любим часто перенакатывать систему, поэтому не очень хочется каждый раз возиться с настройкой.

SpaceLauncher

Для Space Launcher я нашел следующий способ:

  1. Экспорт настроек в dotfiles (не бинарно)

    1. Закрываем SpaceLauncher (важно, чтобы он не перезаписал prefs в процессе).

    2. Выбераем, где хранить файл в репозитории, например: ~/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist

    3. Экспортируем настройки в файл: defaults export name.guoc.SpaceLauncher "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"

    4. На всякий случай принудительно сделаем XML (чтобы точно не было бинарного plist и были нормальные диффы в git): plutil -convert xml1 "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"

    5. Быстрая проверка, что файл читаемый и это именно XML: plutil -p "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist" | head

  2. Импорт настроек из dotfiles на другом Mac

    1. Убеждаемся, что SpaceLauncher закрыт.

    2. Импортируем plist обратно в домен: defaults import name.guoc.SpaceLauncher "$HOME/dotfiles/macos/SpaceLauncher/name.guoc.SpaceLauncher.plist"

    3. Сбрываем кеш preferences (чтобы изменения точно подхватились): killall cfprefsd 2>/dev/null || true

    4. Запускаем 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 все проще:

  1. Экспортируем

    1. Открываем Raycast

    2. Заходим в настройки с помощью cmd+,

    3. Переходим в Advanced

    4. Скроллим вниз и находим Import / Export

    5. Нажимаем на Export

    6. Далее, важно, нажимаем на кнопку Export справа

    7. Вводим пароль

    8. Выбираем папку, куда хотим сгенерировать конфиг

    9. PROFIT

  2. Импортируем

    1. Нажимаем в том же месте где был Export уже Import

    2. Далее Select File

    3. Выбираем файл

    4. Вводим пароль

    5. PROFIT

    6. Есть вариант еще проще. С установленным Raycast, просто открываем конфиг с помощью команды open "$HOME/dotfiles/macos/Raycast/Raycast.rayconfig"

    7. Вводим пароль

    8. PROFIT

Итого

В этой статье я постарался описать весь свой путь, от сложных приложений с некоторыми условностями, до чего-то простого и минималистичного, что будет понятно и удобно большинству пользователей. В своих будущих статьях я бы хотел продолжить эту тему и погрузиться немного глубже. А именно, сделать переход из рабочего стола в рабочий инструмент. Для меня рабочим инструментом является nvim и с ним я придерживаюсь тех же принципов — минимальная настройка и ее простота. А вообще, как же это хорошо иногда, включил и все работает по умолчанию. :-)

А какой workflow у вас? Буду рад вашим комментариям :-)