プロジェクトごとにシェルコマンドのエイリアスを切り替えたい

.bashrc.zshrcに書くシェルエイリアスはどのディレクトリでも同じものが使えるが、プロジェクトによって使いたいエイリアスが変わる場合もある。mise shell-aliasを使うと、mise.toml[shell_alias]セクションにエイリアスを定義でき、mise activateを組み込んだシェルでプロジェクトディレクトリに入ったときだけ有効になる。【mise】mise tool-aliasでツールバージョンにエイリアスを定義する で紹介したmise tool-aliasとは名前が似ているが別物で、こちらはツールバージョンではなくシェルコマンドのエイリアスを扱う。

mise.tomlにエイリアスを定義する

[shell_alias]セクションにエイリアス名とコマンドを書く。

[shell_alias]
gs = "git status"

mise activate bash(やzsh/fish)を組み込んだシェルでこのディレクトリにcdすると、実際にシェルのaliasとして登録される。

$ cd project
$ alias gs
alias gs='git status'
$ gs
On branch master
...

ディレクトリを離れると、このエイリアスは自動的に解除される。

$ cd ..
$ alias gs
-bash: alias: gs: not found

mise shell-alias ls/getでエイリアスを確認する

mise shell-alias lsを実行すると、現在の設定で有効なエイリアス一覧を確認できる。

$ mise shell-alias ls
ll ls -la
gs git status

特定のエイリアスの中身だけを確認したい場合はgetを使う。

$ mise shell-alias get gs
git status

mise shell-alias set/unsetは常にグローバル設定を操作する

mise shell-alias set/unsetのヘルプには「~/.config/mise/config.toml(グローバル設定ファイル)の内容を変更する」と明記されている。実際に試すと、プロジェクトのmise.toml[shell_alias]セクションがあるディレクトリで実行しても、常にグローバル設定ファイルだけが書き換わり、プロジェクト側のmise.tomlには影響しない。

$ mise shell-alias set ll "ls -la"
[shell_alias]
ll = "ls -la"

unsetも同様にグローバル設定だけが対象で、プロジェクトのmise.tomlに書いたエイリアスはunsetで削除できない(エラーにもならず、指定した名前がグローバル設定に見つからなければ何も起きない)。プロジェクト固有のエイリアスを変更・削除したい場合は、mise.tomlを直接編集する。

ls/getはグローバル設定とプロジェクトのmise.tomlの両方をマージして表示するため、mise shell-alias lsの結果だけを見ても、どちらの設定ファイルに書かれているかは分からない。

グローバル設定のエイリアスはディレクトリを離れても消えない

mise shell-alias setで登録したグローバル設定のエイリアスは、プロジェクトのmise.tomlに書いたエイリアスと違い、ディレクトリを離れても解除されない。

$ cd project  # mise.tomlにgs、グローバル設定にllがある状態
$ alias | grep -E "^alias (ll|gs)="
alias gs='git status'
alias ll='ls -la'
$ cd ..
$ alias | grep -E "^alias (ll|gs)="
alias ll='ls -la'

gs(プロジェクト固有)は消えるが、ll(グローバル)は残ったままになる。「プロジェクトを離れると消える」という挙動は、プロジェクトのmise.tomlに書いたエイリアスだけの話であり、グローバル設定に登録したエイリアスは常時有効という違いに注意する。