💻

Mac操作の効率化メモ

2024/02/28に公開

Macの操作を効率化したい。まずは基礎固めということで、主要なユースケースをピックアップしてそれらに対するTIPSを整理してみた。結果的に現行ではRaycast中心の体系となった。

https://www.raycast.com/

アプリケーション起動・切替

RaycastのExtensions > Hotkeyを利用したキーボードショートカット主体の操作とする。

常用している(Dock配置している)アプリケーションには全てHotkeyを割り当てる。
https://manual.raycast.com/command-aliases-and-hotkeys
Hotkeyに指定するキーバインドがmacOSやアプリケーション固有のものと被らないようにHyper key(Ctrl + Option + Command + Shift)を設定して空間を分離する。HyperkeyはKarabiner-Elementscaps lockキーと置換する設定を入れることにより、1タイプに省略することができる。
https://karabiner-elements.pqrs.org/docs/manual/configuration/configure-complex-modifications/

Hotkeyは以下の構成となる。アプリケーション名の頭文字が被る場合は記号に振り分けるなどしてタイプ数を節約する方向に調整する。

Hotkey = Hyperkey + アプリケーション名の頭文字


Hotkeyによるショートカット操作に移行することで、Dockからのアプリケーションの起動・切替がほぼ不要になるので画面スペース節約および操作に慣れる意味でもDockはデフォルトで非表示にする。(マウスカーソルを当てれば表示される)

また、アプリケーションを呼び出した後の以下のケースではアプリケーション共通でmacOSのショートカットを利用する。

操作 キーバインド 備考
同一アプリケーションのウィンドウ切替 Command + @ ウィンドウ数によってはTrackpadでのアプリExposeの方が効率的
メニューバーへのアクセス Ctrl + F2 USキーボードの場合は指運びが厳しいのでリマップするか、習熟してアクセスしたいメニュー名が絞れてきた場合はRaycastのSearch Menu Itemsからインクリメンタルサーチした方が早そう

ウィンドウ配置

RaycastのExtensions > Window Managementを利用したキーボードショートカットによるサイズ調整・配置とする。
https://manual.raycast.com/window-management

以下のメニューに対して、アプリケーション起動・切替と同様にHotkeyを割り当てる。
Mouse / Trackpad操作の文脈ではMagnetも便利であるがキーボード操作に統一するため併用しない。

Name Hotkey 効果
Left Half Hyperkey + ← ディスプレイの左半分にウィンドウ配置
Maximize Hyperkey + Space ディスプレイの全体にウィンドウを拡大(フルスクリーンではない)
Right Half Hyperkey + → ディスプレイの右半分にウィンドウ配置
Next Display Hyperkey + ↑ 別ディスプレイにウィンドウを移動
Previous Display Hyperkey + ↓ 別ディスプレイにウィンドウを移動

ターミナル操作

ディレクトリ移動

enhancdを利用してパス階層のタイプを省力化する。過去の移動履歴とfuzzy finderの組み合わせにより直感的な移動が可能になる。
https://github.com/babarot/enhancd

コマンド 効果
cd <directory name> 過去に移動したことがあるディレクトリの場合はパスを打たずにディレクトリ名だけで直接移動することができる。ディレクトリ名が被った場合は候補表示されるので選択して移動する。
cd - 直近移動したディレクトリ一覧が候補表示されるので選択して移動する。(デフォルトで10件)
cd .. カレントディレクトリからルートまでの親ディレクトリ各階層が候補表示されるので選択して移動する。cd ../../.. のようなコマンドを打たなくて済むようになる。
cd . カレントディレクトリの子ディレクトリが候補表示されるので選択して移動する。

コマンド履歴・補完

以下のZLE (Zsh Line Editor)を利用した関数をウィジェット登録してCtrl + rキーで呼び出すと過去のコマンド履歴から選択実行することができる。fzfコマンドを利用するのでインクリメンタルサーチも可能である。

function select-history() { 
  BUFFER="$(history -n -r 1 | fzf --exact --no-sort --reverse --border-label="history" --no-scrollbar --prompt="Search > " --color='bg+:-1' --query="$LBUFFER")"
  CURSOR="${#BUFFER}"
}

zle -N select-history
bindkey '^r' select-history

また、補完に関しては以下のzshプラグインを活用する。

プラグイン名 機能
zsh-autosuggestions プロンプトに文字列を入力すると過去のコマンド履歴から入力途中の文字列に一致する履歴をグレーフォントで提案してくれる。→キーを押下すると提案されたコマンドをプロンプトに再現できる。
zsh-completion 各種CLIのサブコマンドやオプションの補完を強化してくれる。

アプリケーションのローカル起動

開発中のアプリケーションをローカル環境で動作させるには、画面 / APIサーバ / DB / その他の個別起動が必要な場合がある。tmuxを利用して以下のようなスクリプトを組んでおくと、ターミナルのタブ分割、ディレクトリ移動、ローカル起動を自動化することができる。
誤ってターミナルを終了した場合でもtmuxのセッションは残るので復旧が容易というメリットもある。

#!/bin/bash

set -eu

cd path/to/mono_repo # モノレポ想定

tmux new-session -d -s "sample_session" # 任意のセッション名を指定

# 1つ目のウィンドウでDB等のインフラ周りを起動する
tmux rename-window "infra_window" # 任意のウィンドウ名を指定
tmux send-keys -t "sample_session:infra_window" "cd path/to/infra" Enter
tmux send-keys -t "sample_session:infra_window" "docker-compose up -d --build" Enter
# 厳密には起動完了を待たないとアプリ起動時の接続チェックで落ちることになるがここでは割愛

# 2つ目のウィンドウでアプリを起動する(2種を想定)
tmux new-window -t "sample_session" -n "app_window" # 任意のウィンドウ名を指定

# アプリ用のウィンドウを4分割する
tmux split-window -h
tmux select-pane -t 1
tmux split-window -v
tmux select-pane -t 3
tmux split-window -v

# アプリ用のウィンドウの左半分をapp1に割り当てる
# 上半分で画面を起動
tmux select-pane -t 1
tmux send-keys -t "sample_session:app_window" "cd path/to/app1/front" Enter
tmux send-keys -t "sample_session:app_window" "npm run dev" Enter
# 下半分でAPIサーバを起動
tmux select-pane -t 2
tmux send-keys -t "sample_session:app_window" "cd path/to/app1/api" Enter
tmux send-keys -t "sample_session:app_window" "npm run dev" Enter

# アプリ用のウィンドウの右半分をapp2に割り当てる
# 上半分で画面を起動
tmux select-pane -t 3
tmux send-keys -t "sample_session:app_window" "cd path/to/app2/front" Enter
tmux send-keys -t "sample_session:app_window" "npm run dev" Enter
# 下半分でAPIサーバを起動
tmux select-pane -t 4
tmux send-keys -t "sample_session:app_window" "cd path/to/app2/api" Enter
tmux send-keys -t "sample_session:app_window" "npm run dev" Enter

tmux select-pane -t 1
tmux attach-session -t "sample_session"

ブラウザ操作(Google Chrome)

利用するブラウザはGoogle Chromeを前提とし、拡張機能のVimiumを利用したキーボードショートカット主体の操作とする。
?キーから呼出すVimium Helpでガイドされるキーバインドとデフォルトの動作が一部異なっているので、Custom key mappingsに以下のキーバインドを登録して補正する。
デフォルトの動作はREADMEの記載に基づいているようである。
https://github.com/philc/vimium?tab=readme-ov-file#keyboard-bindings

map h goBack
map l goForward
map H previousTab
map L nextTab

検索を開始する

  • Google Chromeがカレントウィンドウでない場合
    • RaycastのQuikLinks > Search Google機能を呼び出して検索する
  • Google Chromeがカレントウィンドウである場合
    • Vimiumキーバインドのtを押下して新規タブを開きアドレスバーから検索する
    • ChromeショートカットのCommand + lを押下してアドレスバーにフォーカスしてから検索する

https://manual.raycast.com/quicklinks

ブックマークを開く

  • VimiumキーバインドのO(新規タブで開く)/o(既存タブで開く)を押下してvomnibarを開き検索キーワードを入力する

画面操作

  • Vimiumのキーバインドを利用すると下表の操作がキーボードの数タイプだけで可能になる
操作 キーバインド
ページ内リンクを同タブで開く f
ページ内リンクを別タブで開く F
下スクロール j
下スクロール(ページ半分) d
上スクロール k
上スクロール(ページ半分) u
ページ最上部へジャンプ gg
ページ最下部へジャンプ G
左側のタブに移動 H
右側のタブに移動 L
タブを閉じる x
閉じたタブを戻す X
現在のタブを複製 yt
ページ更新 r
履歴戻る h
履歴進む l
ページ内検索(※) Command + f

※Chromeショートカットの方がハイライトや操作性の面でより扱いやすいためVimiumのキーバインドは利用しない

タブ管理

  • ブックマークやWebクリップ(NotionやPocket等)を活用して開き過ぎないことを前提とする
  • そのうえで特に拡張機能などを利用せずシンプルにCommand + Shift + aのChromeショートカットを利用する
  • 別ウィンドウのタブも選択可能であるのでウィンドウ移動の起点にもできる

ドキュメント(ディレクトリ)管理

ドキュメント管理はオンラインサービスとのダウンロード・アップロードが起点となるので、macOSデフォルトの~/Documents~/Downloads~/Desktopに忠実に振り分けて運用しようとしても結局は分散してしまう課題感がある。

個人の性格や業務内容によるところもあるが、以下のように独自ディレクトリに集約する運用を試している。1ディレクトリのみだとすぐに溢れてしまい、Finderやエディタ(VScode)のエクスプローラでの視認性が低下するのでライフサイクルごとに段階を設けて数を絞る構成としている。

~/var
├── schreenshot // スクリーンショットの保存先をデフォルトの~/Desktopから変更
├── archive // 長期間参照していないファイルを移動。このタイミングで固定的な分類を行う
│  ├── admin
│  ├── project1
│  └── project2
├── recent // tmpが煩雑になったタイミングで直近参照していないファイルを移動
│  └── context1 // この段階で作業文脈ごとに集約整理するのもOK
└── tmp // 作業スペース。各アプリのダウンロード先に指定

また、*.md*.csv*.logファイルなどのテキストファイルはVSCodeで開くことが多いのでウィンドウの立ち上げや、開発用ウィンドウとの切替がそれなりに発生する。

Project ManagerというVSCodeプラグインとVisual Studio Code - Project ManagerというRaycastのExtentionsを組み合わせて利用すると事前にProject Managerに登録したフォルダまたはワークスペースをRaycastから選択して開くことができるので非常に便利である。

https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager
https://www.raycast.com/MarkusLanger/vscode-project-manager

その他

クリップボード履歴

  • RaycastのClipboard History機能にHotkeyを登録して利用する
  • HotkeyにはMacOSのペーストショートカットに寄せるためCommand + Shift + vを割り当てる

https://manual.raycast.com/core

スニペット管理

  • RaycastのSearch Snippets機能にHotkeyを登録して利用する
  • 階層管理ができないのでその点ではClipyの方が秀でているが、特にそのような管理は行わないためクリップボード履歴含めてRaycastに統一するものとした
  • Hotkeyにはクリップボード履歴に寄せてCommand + Shift + sを割り当てる
  • スニペットにキーワードを割り当てれば該当の文字列(例:!mail)を入力するとHotkey呼び出しして検索せずとも直接置換してくれる

https://manual.raycast.com/snippets

パスワード管理

Discussion