😎

【M1 Mac】tmuxでRosetta 2環境かどうか分かるようにしたい

2021/11/02に公開

初めてのZenn記事になります。エンジニア見習いの拙い記事ですが、どうか温かく見守って頂けると幸いです。

対象読者

  • tmuxユーザー
  • M1 Macの開発環境でarm64とx86_64を頻繁に切り替える

つくった物

背景

最近M1 ProのMacbook Proを買いました。私は主にPythonやRubyをアルバイトで使っており、ライブラリがM1に対応していないプロジェクトが多数ありました。開発環境は全部Rosetta 2で統一するのが楽というのも考え方の一つと思いますが、M1でいけるプロジェクトをRosetta 2にするのも勿体ない感じがします。なので↓の記事を参考にさせて頂いて、コマンドで切り替える運用方法を取っていました。
https://zenn.dev/sprout2000/articles/aad599d3625242
環境の切り替えは非常にシンプルでコマンドひとつでできるようになりました。しかしプロジェクトを横断して作業しているうちに、どっちの環境にいるのか分からなくなってきます。archuname -mで済む話ではありますが、せっかくtmuxを常用しているのでペインステータスにそれを表示したくなりました。

作り方

archinfoの導入

現在のシェルがどちらの環境にいるのか知るのは簡単ですが、特定のプロセスがどちらの環境で動いているのかを知るのは意外と難しいです。私が調べた限りでは、sample {PID} 1 1000 | grep 'Code Type'と以下のarchinfoしか出てきませんでした。これより良い方法を知っている方がいたらぜひ教えてください。
https://github.com/hrbrmstr/archinfo
sampleコマンドはMacにデフォルトで入っているのですが、癖が強く実運用上は色々と面倒そうなので今回はarchinfoを使うことにしました。

archinfoのリポジトリからソースコードをcloneして、makeでビルドします。

git clone git@github.com:hrbrmstr/archinfo.git
cd archinfo
make

出来上がったarchinfoをどこか適当なパスの通ってる場所に置いておきます。

表示するためのシェルスクリプト

tmuxからペインのプロセスIDを知ることができるので、それを使ってarchinfoでアーキテクチャを調べます。procinfo --pid {PID}でそのプロセスが動いているアーキテクチャが分かります。

tmux_check_rosetta
#!/usr/bin/env zsh

if [[ $2 = "ssh" ]]; then
  exit
fi

if (( $+commands[archinfo] )); then
  proc_info=`archinfo --pid $1`
  if [[ `echo $proc_info | grep 'arm64'` ]]; then
    echo " #[bg=colour63,fg=colour255] arm64/$2 #[default]"
  else
    echo " #[bg=colour131,fg=colour255] x86_64/$2 #[default]"
  fi
else
  echo " #[bg=colour63,fg=colour255] $2 #[default]"
fi

ssh時は不要なので除外しています。tmuxでは#[bg=,fg=,option]のような形で表示フォーマットを指定できます。tmuxで使える色はこちらが参考になりました。
https://superuser.com/questions/285381/how-does-the-tmux-color-palette-work
実行権限をつけて適当な場所に置いておきます。

chmod 755 tmux_check_rosetta

tmuxの設定

ペインのステータス表示を設定します。今回は表示箇所をbottomにしました。

.tmux.conf
set-option -g pane-border-status bottom
set-option -g pane-border-format "#(お好みのパス/tmux_check_rosetta #{pane_pid} #{pane_current_command})"
tmux source ~/.tmux.conf

で再読み込みをすれば完成となります。ぜひ好きな見た目にカスタマイズしてみてくださいね。

Discussion