Cmderでタブやカレントディレクトリの状態を保存する


前置き

Cmderとは

タブ機能

複数のコンソールを立ち上げ、タブで管理することができる。

タブには名前を付けることができて、画面下部のタブバーにその名前が表示される。

名前を付けていないタブの場合、実行中のプログラム名が表示される。

また、タブには左から順番に1から始まる番号が振られている(この番号は後で出てくる)。

ウィンドウ分割機能

ウィンドウを複数の領域(ペイン)に分割することもできる。


本題

何が問題か

Cmderは、デフォルトでは終了時のタブやウィンドウ分割の状態を記憶しない。

つまり、いい感じにタブ作って名前付けてウィンドウ分割して作業していても、

Cmderを一旦終了して次回起動するときにはそれらの情報はすべて失われている。

解決策1. タブを保存するオプションを有効にする

[Settings > Startup] から "Auto save/restore opened tabs" にチェックを入れる。

こうしておくと、Cmderの終了時に開いていたタブの状態が保存され、次回起動したときに自動的にその状態が復元されるようになる。

 

しかし、これは場合によってはうまく動作しないこともあるらしい。

参考:https://github.com/cmderdev/cmder/issues/455

 

また、自分の場合「プロジェクトに応じた複数のタブ構成を保存しておいて、それらを使い分ける」という用途を想定していたので、上記オプションは適しておらず別の方法をとることにした。

解決策2. Taskを使う

以下のようなタブ構成を例に説明。

  • 3つのタブ+最後のタブは3つのペインに分割
  • それぞれタブ名やカレントディレクトリは適当に設定

これをCmder起動時に自動的に構築する。

 

まず [Settings > Tasks] から、以下のようなコマンドを持ったTaskを作成する。

>cmd /c "C:\Program Files\Git\bin\bash" --login -i -new_console:t:tab1 -new_console:d:"C:\path\to\a"

cmd /c "C:\Program Files\Git\bin\bash" --login -i -new_console:t:tab2 -new_console:d:"C:\path\to\b"

cmd /c "C:\Program Files\Git\bin\bash" --login -i -new_console:t:tab3-1 -new_console:d:"C:\path\to\c"

cmd /c "C:\Program Files\Git\bin\bash" --login -i -new_console:t:tab3-2 -new_console:d:"C:\path\to\d" -new_console:s3T50V

cmd /c "C:\Program Files\Git\bin\bash" --login -i -new_console:t:tab3-3 -new_console:d:"C:\path\to\e" -new_console:s4T50V

意味

  • 各コマンドは空行で区切られる(つまり上記Taskは5つのコマンドを持つ)。
  • 最初のコマンドの先頭 > は、初期状態でこのタブをアクティブにすることを示す。
  • -new_consoleオプションについては以下の通り
    • 書式
      • -new_console:<flag>:<value> (<flag>の種類によっては<value>は不要)
    • flag,value
      • t:<tabname> タブ名指定
      • d:"<dir>" カレントディレクトリ指定
      • s<tabnumber>T<percents>(V|H) ウィンドウ分割。<tabnumber>は分割対象のタブの番号を指定。その後ろのTは固定。<percents>は分割によって新しく出現するペインの大きさを%単位で指定(ベースは分割前のペインのサイズ。ウィンドウ全体のサイズではない)。最後のVとHは分割方向。垂直方向、つまり下に新しいペインを作りたければVを指定する。水平方向、つまり右に新しいペインを作りたければHを指定する。
    • その他詳しくはここに
      • https://conemu.github.io/en/NewConsole.html#syntax
      • (CmderではなくConEmuのページだが、CmderはConEmuを拡張(?)して作ったアプリケーションらしく、少なくとも自分が使ってみた範囲ではこのページの内容はCmderでも共通している)

 

Taskができたら、Cmder本体のコマンドラインオプション /TASK でTaskの名前を指定してやればいい。

その際、Task名の{}は外す。すなわち{bash::sample}というTask名の場合は以下のようなコマンドになる。

cmder /TASK bash::sample

自分は、以下のようなショートカットをデスクトップに配置して簡単に起動できるようにしておいた。