課題:月曜に書いた設定が、水曜に消えている
先週、~/.mulmoterminal/config.json に 1 行足しました。ターミナルのフォントを日本語が崩れないものに変える設定です。
水曜日、なぜか元に戻っています。ファイルを開くと、その行がありません。書き忘れたのか、書いたつもりだったのか、自分でも分かりません。
これは、設定ファイルを読み書きするアプリに広く見られる既定の挙動から起きます。
- 読むときに、自分が知らない項目は捨てる
- 保存するときに、自分が知っている項目だけ書く
- 1 つの版だけ使っているなら、何も起きない
問題は版が混ざったときです。 新しい版で足した項目は、古い版から見ると知らない項目です。古い版が何かを保存した瞬間に、その行が消えます。そして消えたことは、どこにも表示されません。
既存のやり方とそのコスト
版を厳密に固定する
グローバルに 1 つの版だけを使う運用にすれば、問題は起きません。
ただし MulmoTerminal は npx mulmoterminal@latest で起動する設計です。これは毎回いちばん新しい版を取ってきて動かすという意味で、版を固定していません。そのうえ、次のような状況が普通にあります。
- 別のポートで 2 つ同時に動かしている
- 新しい版で不具合が出たので前の版に戻した
- 1 日のうちに版が上がった
このどれでも、同じ設定ファイルが違う版から読み書きされます。通常のインストール型アプリより、版が混ざる状況が起きやすい作りになっています。
設定ファイルを 2 つに分ける
項目ごとに別ファイルに書けば、無関係な版の保存で消されない、という回避策はあり得ます。
ただしこれは「ユーザが版の違いを知って、どの項目がどの版の管轄かを覚えておく」ことを要求します。普通に使っている人の仕事ではありません。
MulmoTerminal の解決:知らない項目はそのまま書き戻す
MulmoTerminal は、自分が知らない項目を捨てません。知らないまま、そのまま書き戻します。
対象は 2 種類あります。
- 知らないトップレベルのキー(例: 新しい版が追加した
newSetting) - 知らない動作名の
keymapの行(例: 新しい版が追加したnew-actionへの割り当て)
結果として、新しい版で設定した内容が古い版を使ったあとも残ります。2 つの版を並べて動かしても消えません。しばらく前の版に戻しても、戻ってきたときに設定は残っています。
冒頭のフォントの行は、この作りのおかげで消えません。
詳細
同じ理由で、タイプミスも残る
ここが面白い帰結です。
copyOnSelect を copyOnSlect と書き間違えたとします。MulmoTerminal はこれを「知らない項目」として扱います。知らない項目は書き戻されるので、ファイルに残ります。
これは意図した選択です。「設定したのに効かない」ときに、行が残っているほうが気づけるからです。
捨てる作りだと、次に保存したときにその行が消えます。すると「書いたはずなのに無い」という状態になって、書き間違えたのか書き忘れたのかが分かりません。綴りが違うことは、残っているから目に入ります。
keymap の知らない動作名は、起動時の警告にも名前が出るので、そちらを見てファイルを直接直します。
代償はゴミが溜まること
この作りには代償があります。ファイルに使わない行が残ります。
- 昔の版で使っていて、今は無い項目
- タイプミス
- 試して消し忘れた項目
これらが全部残ります。
| 消す作り | 残す作り |
|---|---|
| ファイルがきれい | ゴミが溜まる |
| 新しい版の設定が黙って消える | 消えない |
| タイプミスが黙って消える | タイプミスが目に見える |
黙って消えるほうが高くつく、という判断です。設定したのに効かない症状が最も特定しづらいからです。
だから、手で掃除しないほうがいい
この仕組みがあるので、設定ファイルを手で片付けるときは注意が要ります。
「知らない項目がある」には 2 つの意味があります。
- 今の版が知らない → 消してよいかもしれない
- 別の新しい版が使っている → 消してはいけない
ファイルを見ただけでは、どちらか分かりません。手で掃除しないのが正解です。ゴミが残ることを受け入れる設計なので、それに従うのが一貫しています。
同じ判断が、他のところにも効いている
MulmoTerminal はこの方針を他の場所でも採っています。たとえばツールバーに出すお気に入り(paletteFavorites)の設定でも、もう存在しない項目の行を自動で消しません。
理由も同じです。「これはもう無い」を古い情報から判断すると、一度でも間違えるとまだ欲しいものを黙って消します。黙って消すより、使わない行が残るほうがよいという判断です。
ここが揃っているので、「設定を触るのが怖くなりにくい道具」になっています。
いつ効くかは、項目によって 3 通り
ちなみに、書いた項目そのものがいつ効くかは項目によって違います。
| 例 | |
|---|---|
| アプリの再起動 | keymap / fontFamily / customAgents / accounts |
| タブの再読み込み | cockpitLines / copyOnSelect |
| その場で | prWorkdirFooter(作るたびに読み直す)、questionPaneEnabled(質問ごとに読む) |
迷ったらアプリを再起動してタブを再読み込みすれば、どれでも効きます。
なお、「知らない項目を保存で消さない」という本記事の挙動は、書いた瞬間から効いています。 設定を保存する経路が 1 つしかなく、どの項目を書いたかに関係しないからです。
使ってみる
MulmoTerminal を起動した状態で、~/.mulmoterminal/config.json に、このアプリが知らない項目を 1 つ書きます。
{ "myOwnNote": "test" }
アプリを再起動して、設定画面をどれか 1 つ変えます。保存が走ればいいです。
そのあと設定ファイルをもう一度開いて、myOwnNote が残っていれば、この作りが効いています。普通のアプリなら、知らない項目は保存のときに消えます。
確かめ終わったら、その行は消してかまいません。残っていても害はありません。
ただし他の項目は、手で掃除しないでください。知らない項目は、別の版が使っているかもしれません。残っていても害はありません。
まとめ
npx mulmoterminal@latestで毎回いちばん新しい版を取ってくる道具では、版が混ざる状況が起きやすい- 普通の挙動(知らない項目を保存時に捨てる)だと、古い版が保存した瞬間に新しい版の設定が消え、消えたことが表示されない
- MulmoTerminal は知らないトップレベルキーと知らない keymap 動作をそのまま書き戻すので、2 つの版を並べても設定が消えない
- 同じ理由でタイプミスも残り、設定したのに効かないときに綴り間違いに気づける
- 代償はゴミが溜まることだが、「黙って消える」ほうが高くつくという判断
- だから設定ファイルを手で掃除しないのが、この設計との付き合い方
関連: MulmoTerminal 公式ガイドの設定ページ(unknown-keys) / MulmoTerminal の copyOnSelect — ドラッグするだけでコピーする設定 / Cursor の代替としての MulmoTerminal


