Skip to content

Переключение 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.

image

Настройка автозапуска

Кладем бинарник в ~/bin/dark-mode-notify

Чтобы скрипт автоматически запускался при изменении режима отображения macOS, мы можем использовать LaunchAgents. Это позволит нам запускать скрипт в фоновом режиме.

alt text

Чтобы он запускался при старте и работал в 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:

mkdir -p ~/.config/alacritty/themes
git clone https://github.com/alacritty/alacritty-theme ~/.config/alacritty/themes
Проверьте чтобы вначале файла ~/.config/alacritty/alacritty.yml
import:
   - "/Users/SET_USERNAME/.config/alacritty/themes/themes/github_light.yaml"