📂

MacのFinderからAlacritty上のtmux内Neovimでファイルを開きたい

に公開

Mac + Alacritty + tmux + Neovim という環境で生息している者です。

普段は何かしらファイルを開くときは nvim hoge.md とかを叩いて起動させているので問題ないのですが、時たま Finder を使ってファイルを開いてしまうと Mac のデフォルトエディタが起動してしまい[1]ちょっとしょんぼりしてしまいます。 (´・ω・`)

今回は Finder でテキストファイルをダブルクリックした際に、すでに開かれている Alacritty の tmux セッション内で Neovim を使用して編集できるようにしたいと思います。
この手法を応用すれば [Alactitty], [tmux], [Neovim] の項目を別のツールに置き換えることもできるかと思いますので、他ツールをお使いの方も最後までお付き合いいただければ幸いです。

記事の更新履歴

2025-03-24

  • コードが長くて可読性 & 管理品質が悪い気がしたので Github Gist に移行
  • バグを発見したのでコード修正
    • L58: tmux から neovim が開かれている pane を探す際、空白を含むファイル/フォルダがあると上手く動作しない問題があったので対応 (sed で空白をエスケープする処理を追加)

やりたいこと

  • Finderから特定の拡張子のファイルをダブルクリックすると Alacritty の tmux 内の Neovim で開きたい
    • Alacritty プロセスがなければ起動、あればフォーカスを移動
    • 「起動している tmux セッション内で Neovim が開かれているか」「その Neovim が同一のプロジェクトに対して開いているか」を確認
      • 「同一プロジェクトか」は開こうとしているファイルが所属するgitリポジトリのディレクトリパスで判断
      • 既に Neovim 開かれている & 同一プロジェクト => プロセス内で新規タブにファイルを開く
      • それ以外 => 新しい tmux-window で Neovim を起動して開く
    • 既存のNeovimで開く場合はNORMALモード以外でも正しく開けるように

Shellスクリプトの作成

適当なディレクトリに open_in_tmux_nvim.sh を作成し、実行権限を付与していきます。

(書き方がだいぶ仰々しいのは趣味なのであまり気にしないでくださいw

最後に実行権限を渡すのをお忘れなく

chmod +x /path/to/open_in_tmux_nvim.sh
ポイントとか (必要ない人は読み飛ばしてOK)

export PATH="/path/to/bin:$PATH"

このスクリプトはのちのち AppleScript から呼び出されるのですが、AppleScript の do shell script から呼び出されるshell の $PATH は従来の bash の PATH とは異なり、最低限しか通っていない 様です。
どうやら他環境への依存を少なくするため、そういった設計になっているらしいです。

私の環境では tmux は nix-homemanager を通じてインストールされており、AppleScriptで呼び出されるshellだとパスが通っていなかったためこの一文を追加しております。[2]
ここは導入される環境に応じて削除・変更してください。


function find_project_dir(): プロジェクトルート判定

コメントに記載の通り、対象のパスがどのプロジェクトに属しているかを返すメソッドとなっています。
ルートディレクトリから順に深堀りし、.git ディレクトリがあるフォルダをプロジェクトルートディレクトリと判定しています。


function open_in_tmux_nvim()

メインとなるスクリプトです。

Alacritty が起動していなければ起動します。

tmux は Alacritty の設定ファイル alacritty.toml にて自動で立ち上がるように設定しています:

[terminal.shell]
program = "/bin/zsh"
args = [
  "-l",
  "-c",
  "tmux a -t 0 || tmux ",
]

上記設定をしないのであれば open -a Alacritty 部分に引数を与える等で解決できる気がします。多分。
やってないので各位確認してみてください。

tmux の各 pane にて nvim (Neovim) が起動しているか、起動していたらプロジェクトディレクトリが一致しているかを確認、すべて一致したら該当 pane 上の Neovim に :tabnew <filename> を送信します。
送信時に C-[ (Escキー) も送信してNORMALモード以外のときも正しくコマンドが読み取れるようにしました。
これであらかた問題ないと思うのですが、なにか漏れがあるかもです。気がついたら追記します。

Neovimが起動していない、起動していてもプロジェクトが不一致の場合は tmux new-window で新たに window (タブ)[3] を作成し、そこで開くようにします。

人によっては常に新しい pane で起動したいなど求める用途が異なるかと思うので、適宜上記スクリプトを手直しして使うのが良いかと思います。

AppleScript作成

Mac搭載のスクリプトエディタ /Applications/Utilities/Script Editor.app を起動し、open_in_tmux_nvim.app ファイルを作成します。

open_in_tmux_nvim.app
on open theFiles
	repeat with aFile in theFiles
		do shell script "/path/to/open-in-tmux-nvim.sh " & quoted form of POSIX path of aFile
	end repeat
	tell application "Alacritty" to activate
end open

このとき、作成時に拡張子をアプリケーション .app にするよう気をつけてください。
(後々Finderで開くアプリとして登録するため

選択されたファイル毎に open-in-tmux-nvim.sh を実行し、最後に Alacritty アプリケーションにフォーカスするようにしています。

Finderのファイル関連付け設定

Finderで .txt や .md などのテキストファイルをダブルクリックした際に open_in_tmux_nvim.app を実行するように設定します。

  • Finderで開きたいファイル (.txt や .md など) を 右クリック -> [情報を見る]
  • [このアプリケーションで開く] から open_in_tmux_nvim.app を選択
  • [すべてを変更] をクリック

これで、Finderからファイルをダブルクリックすると、 tmux 内の Neovim で開くようになります。

まとめ

これで Mac の Finder からダブルクリックで Alacritty 上の tmux 内 Neovim でファイルを開くことができるようになりました。
入れ子になってて起動が結構面倒でしたが、苦労に見合うHack担ったのではないでしょうか。どうだろう??

特に、

  • 既存のNeovimを利用することで無駄なプロセスを増やさない
  • NeovimがNORMALモード以外でも正常に開けるようにする
  • Finderからの操作後にAlacrittyへフォーカスを移すことで、スムーズに編集作業に移れる

といった点が個人的に気に入ってます。

今後の発展として、UnrealEngine や Alfred といった別アプリケーションから開くといったフローが考えられます。まだ試せていないですが、これらができればよりストレスフリーな開発環境が整えられると思います。

興味がある方はぜひ試してみてくださいー

脚注
  1. Markdown.md 形式のファイルだと Xcode が開いたり...。誰も Xcode でマークダウン書かないよぉぉ ↩︎

  2. Source: http://tonbi.jp/AppleScript/Dictionary/OSAX/Command/do_shell_script.html ↩︎

  3. tmuxのwindow、直感的にはタブだと思うの。こう思うのって私だけですかね...? ↩︎

Discussion