MacOS を快適に使うための設定

Yabai

mac の window manager の yabai。インストールがちょっとめんどいんだけど、一番安定しているので使っている。

sudo yabai --load-sa
yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa"

yabai -m config layout bsp

yabai -m config window_gap 7
yabai -m config top_padding 5
yabai -m config bottom_padding 5
yabai -m config left_padding 5
yabai -m config right_padding 5

yabai -m config window_border on
yabai -m config window_border_width 4
yabai -m config active_window_border_color 0xffffb454

yabai -m shadow off
yabai -m config window_opacity on
yabai -m config active_window_opacity 0.97
yabai -m config normal_window_opacity 0.90

yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add app="^Spotify$" manage=off
yabai -m rule --add app="^Finder$" manage=off
yabai -m rule --add app="^Installer$" manage=off
yabai -m rule --add app="^Steam$" manage=off
yabai -m rule --add app="^Paradox Launcher$" manage=off

外部ディスプレイ対応

内蔵ディスプレイはノッチ部分を含めない設定でいけるので、(ノッチ下端からの padding) 上でいいんだけど、外部ディスプレイに接続すると、加味されないから、ウィンドウが sketchybar とかぶる。その場合は、 yabai に下記を送ってやれば良い。画面解像度の関係で、mac 本来のトップバーとあわなくなるけど、まあいいでしょう。

if [[ $(system_profiler SPDisplaysDataType | rg Internal | wc -l | tr -d " \t") == "0" ]] ; then
    #echo "clam"
    yabai -m config top_padding 29
fi

skhd

同じ作者による、key bind をいじる skhd。特に良く使うアプリケーション、ターミナルと emacs とブラウザに関しては、直接開くようにしてる。起動スクリプトは後述。

cmd - return : "$HOME"/.config/skhd/open_iterm2.sh
rcmd - sound_up : "$HOME"/.config/skhd/open_emacsclient.sh
rcmd - sound_down : "$HOME"/.config/skhd/open_safari.sh

ralt - 0x2A : "$HOME"/.config/skhd/open_emacsclient.sh
ralt - 0x18 : "$HOME"/.config/skhd/open_safari.sh

skhd -o

メインの機能は yabai を操作することになります。どの領域にフォーカスするのかは、 vim に準じています。デスクトップの切り換えは、 ctrl にしていて。今フォーカスしているアプリを別のデスクトップに飛したい場合は shift

cmd - l            : yabai -m window --focus east
cmd - k            : yabai -m window --focus north
cmd - j            : yabai -m window --focus south
cmd - h            : yabai -m window --focus west

ctrl - 1            : yabai -m space --focus 1
ctrl - 2            : yabai -m space --focus 2
ctrl - 3            : yabai -m space --focus 3
ctrl - 4            : yabai -m space --focus 4
ctrl - 5            : yabai -m space --focus 5
ctrl - 6            : yabai -m space --focus 6

shift + ctrl - 1 : yabai -m window --space 1 && yabai -m space --focus 1
shift + ctrl - 2 : yabai -m window --space 2 && yabai -m space --focus 2
shift + ctrl - 3 : yabai -m window --space 3 && yabai -m space --focus 3
shift + ctrl - 4 : yabai -m window --space 4 && yabai -m space --focus 4
shift + ctrl - 5 : yabai -m window --space 5 && yabai -m space --focus 5
shift + ctrl - 6 : yabai -m window --space 6 && yabai -m space --focus 6

フルスクリーンにする

alt - f            : yabai -m window --toggle zoom-fullscreen

アプリの起動

沢山インスタンスを立ちあげて Dock が汚なくなったり、そもそも同じアプリの複数同時起動に制限がかかっていたりするらしいので、アプリ自体はひとつで、新しい window をつくるのには下記のスクリプトを使わないといけない。

#!/usr/bin/env bash

# Detects if Safari is running
if ! pgrep -f "Safari" > /dev/null 2>&1; then
    open -a "/Applications/Safari.app"
else
    # Create a new window
    script='tell application "Safari" to make new document activate'
    ! osascript -e "${script}" > /dev/null 2>&1 && {
        while IFS="" read -r pid; do
            kill -15 "${pid}"
        done < <(pgrep -f "Safari")
        open -a "/Applications/Safari.app"
    }
fi

iterm2 殆ど変らないんだけど、 script ちょっとだけ変ってる。

#!/usr/bin/env bash

# Detects if iTerm2 is running
if ! pgrep -f "iTerm" > /dev/null 2>&1; then
    open -a "/Applications/iTerm.app"
else
    # Create a new window
    script='tell application "iTerm2" to create window with default profile'
    ! osascript -e "${script}" > /dev/null 2>&1 && {
        # Get pids for any app with "iTerm" and kill
        while IFS="" read -r pid; do
            kill -15 "${pid}"
        done < <(pgrep -f "iTerm")
        open -a "/Applications/iTerm.app"
    }
fi

iTerm 自分のウィンドウを消す

tell application "iTerm2"
     tell current window to close current session
end tell
#!/bin/bash

/opt/homebrew/bin/emacsclient -c -e \
                "(select-frame-set-input-focus (selected-frame))" \
                "(delete-other-windows)" \

sketchybar

上のバーの情報は出来るだけミニマルにしたい。mac の環境設定で、メニューバーは自動的に消えるようにしてる。こうすれば、元のメニューバーは情報てんこもりでもいいって事になる。

https://felixkratz.github.io/SketchyBar/config/bar に skechybar の設定項目がのっているのでかえたければ参考にする。

PLUGIN_DIR="$HOME/.config/sketchybar/plugins"

sketchybar --bar height=40        \
                 blur_radius=5   \
                 position=top     \
                 padding_left=17  \
                 padding_right=7 \
         color=0xe80a0e14

if [[ $(system_profiler SPDisplaysDataType | rg Internal | wc -l | tr -d " \t") == "0" ]] ; then
    sketchybar --bar height=24
fi

sketchybar --default updates=when_shown                    \
                     drawing=on                            \
                     icon.font="HackGen35Nerd:Regular:17.0"  \
                     icon.color=0xddffffff                 \
                     label.font="SF Pro Rounded:Semibold:13" \
                     label.color=0xddffffff                \
                     label.padding_left=4                  \
                     label.padding_right=4                 \
                     icon.padding_left=4                   \
                     icon.padding_right=4

ねこちゃんマーク。犬派だけど。特に機能はない。

sketchybar --add item cat_icon left                            \
           --set cat_icon icon=                               \
                                 label.drawing=off                    \
                 icon.font="HackGen35Nerd:Regular:20.0" \
                 icon.color=0xffe0af68 \
                 icon.padding_right=40 \

スペース(デスクトップ) の表示と切り換え:

SPACE_ICONS=("" "" "" "" "" "" "7" "8" "9" "10")

for i in "${!SPACE_ICONS[@]}"
do
  sid=$(($i+1))
  sketchybar --add space space.$sid left                                 \
             --set space.$sid associated_space=$sid                      \
                              icon=${SPACE_ICONS[i]}                     \
                              icon.padding_left=8                        \
                              icon.padding_right=8                      \
                              icon.color=0x44ffffff                       \
                              icon.highlight_color=0xddffffff                       \
                              label.drawing=off                          \
                              script="$PLUGIN_DIR/space.sh"              \
                              click_script="yabai -m space --focus $sid"
done

右は、時計と電池がなくなったら電池の残量表示

mail のチェックはデフォルトで 5 分になっているので、そんなに更新をする必要がない。

launchctl list | rg homebrew
sketchybar --add item clock right                        \
           --set clock   update_freq=10                  \
                         script="$PLUGIN_DIR/clock.sh"   \
                                                         \
       --add alias "Control Center,Battery" right              \
           --set "Control Center,Battery" update_freq=30 \
                                            label.drawing=off\
                                                         \
    --add item mail right \
           --set mail script="$PLUGIN_DIR/mail.sh" \
           update_freq=30

設定の反映をさせるコマンド?らしい

sketchybar --update
echo "sketchybar configuration loaded.."

plugins

どれも書く程ではないようみえるけど、毎回別に実行されるスクリプトは別に書いておかないといけない。

clock.sh

#!/usr/bin/env sh
sketchybar --set $NAME label="$(date '+%H:%M')" label.padding_right=10

space.sh

#!/usr/bin/env sh
sketchybar --set $NAME icon.highlight=$SELECTED icon.hightligh_color=0xffffffff

mail.sh

count mails in new folder

fd -ptf /new/ ~/Mail/ -E 'Trash' -E 'All*' -E 'yasushi.accounts*' -E Archive | wc -l | tr -d ' \t'
NEWMAIL=$(fd -ptf /new/ ~/Mail/ -E 'Trash' -E 'All*' -E 'yasushi.accounts*' -E Archive | wc -l | tr -d ' \t')

if [[ $NEWMAIL -ne "0" ]]; then
    sketchybar --set $NAME icon.font="SF Pro Rounded:Regular:13" icon.color=0xffffffff icon="􀈫" label.drawing=on label="$NEWMAIL" click_script="~/.config/sketchybar/open_mutt.sh"
else
    sketchybar --set $NAME icon.font="SF Pro Rounded:Regular:13" icon="􀈣" label.drawing=off icon.color=0x33ffffff click_script="~/.config/sketchybar/open_mutt.sh"
fi

open iterm2 and run a command.

#!/bin/bash
osascript - "$@" <<EOF
on run argv
tell application "iTerm"
    activate
    set new_term to (create window with default profile)
    tell new_term
        tell the current session
            repeat with arg in argv
               write text arg
            end repeat
        end tell
    end tell
end tell
end run
EOF

use above to open mutt (aliased to neomutt)

#!/usr/bin/env bash
$HOME/.config/sketchybar/iterm_cmd.sh ~/.config/neomutt/open_close_neomutt.sh

おわったら、セッションごと消す

neomutt

if [[ $! -eq "0" ]]; then
    osascript ~/.config/scripts/close_iterm.as
fi

AquaSKK

日本語の入力は AquaSKK を使います。

元々 config は ~/Library/Application Support/AquaSKK/keymap.conf

英数モードにすると iTerm とか支障をきたすので、出来るだけそうならないようする。

###
### keymap.conf
###

# ======================================================================
# event section
# ======================================================================

SKK_JMODE        ctrl::j
SKK_ENTER        group::hex::0x03,0x0a,0x0d||ctrl::m
SKK_CANCEL        ctrl::g||hex::0x1b
SKK_BACKSPACE        hex::0x08||ctrl::h
SKK_DELETE        hex::0x7f||ctrl::d
SKK_TAB            hex::0x09||ctrl::i
SKK_PASTE        ctrl::y
SKK_LEFT        hex::0x1c||ctrl::b||keycode::7b
SKK_RIGHT        hex::0x1d||ctrl::f||keycode::7c
SKK_UP            hex::0x1e||ctrl::a||keycode::7e
SKK_DOWN        hex::0x1f||ctrl::e||keycode::7d
SKK_PING        ctrl::l
SKK_UNDO                ctrl::/

# ======================================================================
# attribute section(for SKK_CHAR)
# ======================================================================

ToggleKana        q
ToggleJisx0201Kana    ctrl::q
SwitchToAscii        ctrl::shift::l
SwitchToJisx0208Latin    ctrl::shift::alt::l

EnterAbbrev        /
EnterJapanese        Q
NextCompletion        .
PrevCompletion        ,
NextCandidate        hex::0x20||ctrl::n
PrevCandidate        x||ctrl::p
RemoveTrigger        X

UpperCases        group::A-K,M-P,R-Z
Direct            group::keycode::0x41,0x43,0x45,0x4b,0x4e,0x51-0x59,0x5b,0x5c,0x5f
InputChars              group::hex::0x20-0x7e

CompConversion        alt::hex::0x20||shift::hex::0x20

# ======================================================================
# handle option
# ======================================================================

AlwaysHandled           group::keycode::0x66,0x68
PseudoHandled           ctrl::l

reboot でウィンドウ一掃

reboot したい時は、大抵一回全部アプリを落したい時なのに、デフォルトで sudo reboot すると、元々起動していたアプリが起動してうざい。

defaults write -g ApplePersistence -bool no

スクリプトを実行可能にしておく

上で書いた設定ファイルは実行可能にしておく必要があるので下記を実行する。

find ~/.config -type f | rg -v 'htop|.DS_Store' | rg 'rc$|.sh$' | xargs chmod u+x

Date: 2022-07-29 Fri 13:27