Переключение dark mode для вашего рабочего пространства¶
Вы когда-нибудь хотели, чтобы ваше рабочее пространство автоматически адаптировалось к темному режиму вашей операционной системы?
Если да, то вам повезло, рассмотрим как настроить автоматическое переключение тем для таких приложений, как tmux, nvim, alacritty и vscode, при изменении режима отображения macOS.
Установка инструмента¶
Для начала нам потребуется инструмент под названием dark-mode-notify.
Данный инструмент позволяет запускать скрипты при изменении режима отображения macOS. Мы можем воспользоваться форком этого инструмента из репозитория, чтобы добавить необходимую функциональность.
Делаем fork репозитория
Cобрать бинарник можно: - установив полностью среду XCode(заархивированный 12Гбайт, для установки потребуется свободного места от 30Гбайт ) - через github actions
Создаем github actions workflow:
name: Build
on:
push:
branches:
- main
# Add a new 'workflow_dispatch' trigger to enable Manually Running Job
workflow_dispatch:
inputs:
parameter_name:
description: Description of the input parameter
required: true
default: default_value
jobs:
macos:
runs-on: ${{ matrix.job.os }}
strategy:
matrix:
job:
- os: macos-latest
target: aarch64-apple-darwin
use-cross: false
steps:
- uses: actions/checkout@v3
- name: Build
run: |
swift build -c release --disable-sandbox
- name: Release
uses: softprops/action-gh-release@v1
with:
tag_name: release
files: .build/release/dark-mode-notify
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
После успешной сборки нам нужно загрузить исполняемый файл dark-mode-notify из раздела Releases репозитория и поместить его в нужное место, например, ~/bin/dark-mode-notify.
Настройка автозапуска¶
Кладем бинарник в ~/bin/dark-mode-notify
Чтобы скрипт автоматически запускался при изменении режима отображения macOS, мы можем использовать LaunchAgents. Это позволит нам запускать скрипт в фоновом режиме.
Чтобы он запускался при старте и работал в background cоздаем LaunchAgents, то есть при смене dark mode будем вызывается скрипт /Users/SET_USERNAME/bin/theme :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.SET_USERNAME.dark-mode-notify</string>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/Users/SET_USERNAME/dark-mode-notify-stderr.log</string>
<key>StandardOutPath</key>
<string>/Users/SET_USERNAME/dark-mode-notify-stdout.log</string>
<key>ProgramArguments</key>
<array>
<string>/Users/SET_USERNAME/bin/dark-mode-notify</string>
<string>/bin/zsh</string>
<string>-c</string>
<string>/Users/SET_USERNAME/bin/theme</string>
</array>
</dict>
</plist>
Сам скрипт, который будет выполняться при изменении режима, мы разместим по пути ~/bin/theme. Этот скрипт будет менять темы для наших приложений в зависимости от режима отображения macOS.
$HOME/bin/theme скрипт для установки темы для alacritty, tmux, nvim, vscode
#!/bin/zsh
set -x
mode="light"
if [ -z "$1" ]; then
defaults read -g AppleInterfaceStyle >/dev/null
if [ $? -eq 0 ]; then
mode="dark"
fi
else
case "$1" in
light)
$(osascript -l JavaScript -e "Application('System Events').appearancePreferences.darkMode = false")
mode="light"
;;
dark)
$(osascript -l JavaScript -e "Application('System Events').appearancePreferences.darkMode = true")
mode="dark"
;;
esac
fi
#change vim
#tmux_s_name="$(tmux display-message -p '#S')" # current session name
tmux_listsessions=($(/opt/homebrew/bin/tmux list-sessions | cut -d : -f 1))
tmux_wins=$(/opt/homebrew/bin/tmux list-windows -t "$tmux_s_name")
#for wix in $(/opt/homebrew/bin/tmux list-windows -t main -F 'main:#{window_index}'); do
# for pix in $(/opt/homebrew/bin/tmux list-panes -F 'main:#{window_index}.#{pane_index}' -t "$wix"); do
for tmux_s_name in $tmux_listsessions ; do
for wix in $(/opt/homebrew/bin/tmux list-windows -t "$tmux_s_name" -F "$tmux_s_name"':#{window_index}'); do
for pix in $(/opt/homebrew/bin/tmux list-panes -F "$tmux_s_name"':#{window_index}.#{pane_index}' -t "$wix"); do
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
/opt/homebrew/bin/tmux if-shell -t "$pix" "$is_vim" "send-keys -t $pix escape ENTER"
/opt/homebrew/bin/tmux if-shell -t "$pix" "$is_vim" "send-keys -t $pix ':call ChangeBackground()' ENTER"
done
done
done
alacritty_config=~/.config/alacritty/alacritty.yml
#change alacritty
case "$mode" in
dark)
/opt/homebrew/bin/tmux source-file ~/.tmux/themes/github_light.conf
sed -i -e 's/github_light/github_dark/' ${alacritty_config}
# change VSCode theme
sed -i -e 's/"workbench.colorTheme": ".*"/"workbench.colorTheme": "Default Dark Modern"/g' "$HOME/Library/Application Support/Code/User/settings.json"
;;
light)
/opt/homebrew/bin/tmux source-file ~/.tmux/themes/github_dark.conf
sed -i -e 's/github_dark/github_light/' ${alacritty_config}
# change VSCode theme
sed -i -e 's/"workbench.colorTheme": ".*"/"workbench.colorTheme": "Default Light Modern"/g' "$HOME/Library/Application Support/Code/User/settings.json"
;;
esac
Ручное переключение¶
Для удобства мы также настроим возможность ручного переключения тем с помощью приложения Raycast. Мы создадим два скрипта ScriptCommands для переключения между светлым и темным режимом.
dark.applescript
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title dark
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 🌒︎
log "Dark Mode enabled"
tell application "System Events" to tell appearance preferences to set dark mode to dark mode
do shell script "/Users/SET_USERNAME/bin/theme dark"
light.applescript
#!/usr/bin/osascript
# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title light
# @raycast.mode silent
# Optional parameters:
# @raycast.icon 💡
log "Light Mode enabled"
tell application "System Events" to tell appearance preferences to set dark mode to not dark mode
do shell script "/Users/SET_USERNAME/bin/theme light"
Themes:¶
alacritty:
Проверьте чтобы вначале файла ~/.config/alacritty/alacritty.yml