(本記事は Claude Code による執筆です.同じ環境でも同様の動作を保証しません.自身の責任のもとで実行してください)
環境
| ツール | バージョン等 |
|---|---|
| OS | macOS |
| ターミナル | WezTerm |
| エディタ | Neovim + VimTeX |
| PDF ビューア | Skim |
| パッケージ管理 | Homebrew |
問題
- LaTeX の執筆中,Skim 上で
⌘+Shift+Clickすると,対応するソースファイルの行に Neovim のカーソルがジャンプする(逆方向検索) - しかし,ウィンドウのフォーカスが Skim のままになってしまい,そのまま編集を続けるには手動で WezTerm をクリックする必要があった
TL;DR
- Skim の逆方向検索コマンドに
osascript -e 'tell application "WezTerm" to activate'を追加したラッパースクリプトを作ることで解決 -
nvim --headlessはバックグラウンドプロセスなので,明示的に指示しないと macOS はフォーカスを切り替えてくれない
よく見かける設定
Skim の環境設定 → 同期 → PDF-TeX 同期サポート でよく紹介される設定は以下の通り。
- プリセット: カスタム
-
コマンド:
/opt/homebrew/bin/nvim(あるいはnvim) -
引数:
--headless -c "VimtexInverseSearch %line '%file'"
この設定ではカーソルジャンプは正常に動作するが,フォーカスは Skim のままになる。
原因
-
nvim --headlessはウィンドウを持たないバックグラウンドプロセスとして起動する。Skim が呼び出すのはこの無音の裏側プロセスであり,macOS はフォーカスを切り替える理由がない - カーソルジャンプは Neovim のサーバー機能を通じて正しく届くが,WezTerm ウィンドウを前面に持ってくる指示が誰からも出ていないため,フォーカスが Skim に留まり続ける
解決策:ラッパースクリプトを作成する
nvim コマンドの実行後に AppleScript で WezTerm を明示的にアクティベートするスクリプトを作成する。
1. スクリプトを作成する
mkdir -p ~/.local/bin
cat > ~/.local/bin/skim-inverse-search.sh << 'EOF'
#!/bin/bash
/opt/homebrew/bin/nvim --headless -c "VimtexInverseSearch $1 '$2'"
osascript -e 'tell application "WezTerm" to activate'
EOF
chmod +x ~/.local/bin/skim-inverse-search.sh
2. Skim の設定を変更する
Skim の環境設定 → 同期 → PDF-TeX 同期サポート を以下のように変更する。
- プリセット: カスタム
-
コマンド:
/Users/<ユーザー名>/.local/bin/skim-inverse-search.sh -
引数:
%line '%file'
動作確認
Skim 上で ⌘+Shift+Click すると,Neovim のカーソルが対応行にジャンプし,WezTerm ウィンドウが前面に移動してくる。
まとめ
| 修正前 | 修正後 | |
|---|---|---|
| カーソルジャンプ | ✅ | ✅ |
| WezTerm にフォーカス | ❌ | ✅ |
nvim --headless はバックグラウンド処理のためフォーカスを奪わない。osascript
による明示的なウィンドウアクティベーションをラッパースクリプトに追加することで解決できる。
Note: osascript は macOS 専用の方法であり,アプリ名の文字列でウィンドウを操作するため本質的にはやや脆弱です。ただし,macOS でアプリフォーカスを外部から制御する現実的な手段はこれが標準であるため,割り切って使っています。