これまで/経緯

 これまでは、WindowsではPowerShellとoh-my-poshを使って、WSL(あとraspiとかtermuxでも)bashを使っていた。 oh-my-poshはPowerShellをいい感じの見た目にしてくれるやつで、去年の12月ぐらいに入れた。 そのあと、PSReadLineの設定をして、PowerShellで補完予測が使えるようになり、その快適さに感動し、Linuxでも補完予測や見た目のカスタマイズをしたくなった。

 調べてみるとzshがメジャーらしいがどうもかなりのカスタマイズが必要らしい。 勉強するのが面倒だったが、fishというのを使えば勝手にいい感じにしてくれることが分かり、実際に入れてみるとデフォルトで補完が出てきて感動した。 fishで見た目を頑張るのもいいが、POSIX非準拠で情報も少なく、またPowerShellというbash等とは全然違うのもあるので、どうせならクロスシェルなStarshipを使おうということになった (Starshipについてはoh my poshよりいいのを探しているときに見つけた)。

 そして、複数の環境に同様の物を設定するなら以前勧められたdotfilesによる管理を導入してみようと思った。 dotfilesについて調べてみるとshellスクリプトをかかないといけないらしく、全然知識のない自分に一朝一夕で使えないことは自明で、さらにPowerShellでも共通の物を作るとなると、異常に難しくなりそうなことは明らかだったので、いい感じのツールを探したところchezmoi /ʃeɪ mwa/(shay-moi)1というのを見つけた2。 簡単そうだったのでchezmoiを使って試しにstarship.tomlをdotfilesに入れてみた。


というのでその作業の記録をしておく

WSLでのfishへの移行

移行の程度

 程度というのは分かりずらいが、要はlogin shellにするか否かということで、今回はlogin shellにすることは見送った。 単純にfishを起動しただけでは$\rm S\kern{-0.1em}A\kern{-0.1em}T\raisebox{-0.33em}{​\kern{-0.2em}Y}\kern{-0.1em}S\kern{-0.03em}F\raisebox{-0.33em}{\kern{-0.15em}I}$3やbrewのパスが通ってなかった。 なんとなく不安だったのでbashをlogin shellのままにしておいた4。 それに授業の関係でssh forwardありのsshをwslからする必要があり、windowsではwsl含めssh-agentが動いてないためssh-addが使えない問題があった。 そのための設定(具体的にはeval '$(ssh-agent)')を.bashrcに入れていたが、調べてる途中で5PIDがふえていくのが気持ち悪いのでkeychainを使う方法が紹介されていて6それをfishに移植するのをあきらめた(それほど考えてない)のもあって、login shellはbashのまま。

実際の運用

 login shell自体は変わってないのにどうやってfishを使うのかというと、さすがに毎度fishと打つのは面倒であり、また.bashrcの最後らへんに条件分岐込み7exec bashを入れるというのもあったが、失敗が多かった。

 結局、ターミナルにはWindows Terminalを使っているので、fishとbash用のプロファイルを別に用意することにした。 wsl関連のコマンドwsl.exeには後ろに実行するコマンドを付け加えられるので、プロファイルのコマンドラインに

wsl.exe -d Ubuntu-18.04 --cd ~ tmux

と書き、その上でtmuxにfishで起動するように書いてfishで起動するようにした8

VS Codeのほうは既定のプロファイルをfishにした。

PATH関係の移行

 前に$\rm S\kern{-0.1em}A\kern{-0.1em}T\raisebox{-0.33em}{​\kern{-0.2em}Y}\kern{-0.1em}S\kern{-0.03em}F\raisebox{-0.33em}{\kern{-0.15em}I}$のPATHが通ってないと書いたが、これはopam initで解決した。

 brewのほうはbrewのインストールスクリプトがfishでは動かず、oh-my-fish用のpathを通すパッケージも動かなかったので9、パスを直接通した10。bashでは通ってるので、bashでwhereis brewをした後、.config/fish/config.fishに設定を書くのではなく、$fish_user_pathsに追加する11

その他

 zを入れた。 勝手にジャンプできるのすごい。 バナーの画像にもあるがfishも普通にすごい。

Starshipの導入

Starshipとは

 Starshipとは色々なshellで使える(cmdでも!?)prompt。 簡単にカスタマイズできるらしい。 ~/.config/starship.tomlに設定を書く。

インストール/shellでのセットアップ

 これを参照。 Windowsに関しては、以前やっていたが、wingetが使えないのでscoopで入れた。 Ubuntuはbrewで入れた。

 セットアップはWindowsでは$PROFILEに、Fishでは~/.config/fish/config.fishに書く。 ちなみに、PowerShellをデフォルトの5.1から7.2に変えた12(powershellスクリプトでのインストール)13

Starshipのconfigを書く。

 公式のドキュメントを見ながら使いそうな項目を設定した。 このとき、Nerd fonts系のアイコンも使いたかったので、フォントFirge35Nerdを使用した。 アイコン系はNerd Fontsのcheat sheetで検索して、コピペしてきた。 しかし、VS Codeの統合ターミナルではmonospaceのフォントしか使えないので、アイコンはtofuになる。

Windowのタイトルを変更する

 oh my poshでは出来ていたので変えたくなった。 Advanced COnfigurationにあるChange Window Titleに従って、PowerShellの場合$PROFILEに追加する。 現在いるとこの親ディレクトリを表示させたかったのでPowerShellを調べて

# change window name
function Invoke-Starship-PreCommand {
  $ParentFolder = Split-Path $PWD -Leaf
  $host.ui.Write("`e]0; $env:USERNAME` ~ 📂 $ParentFolder `a")
}
Invoke-Expression (&starship init powershell)
$ENV:STARSHIP_CONFIG = "$HOME\.config\starship.toml"

と書いた。 そして、これを書いてる途中でFishの方の設定を忘れてたので後で書く。

 ただこれらの機能は将来変更されるらしい。

ちょっと残念

 右寄せの部分を書けない(ウィンドウサイズを変えると表示が崩れがちだったのでそうならないのはいいかもしれない)

dotfilesの管理

 chezmoiを使う。

chezmoiのいいところ

個人的にメリットに感じたこと。

  • chezmoiは.bashrcを移動させてシンボリックリンクを使うとかが必要ない。
  • shellスクリプトをかかなくていい。

インストール

install - chezmoi

PowerShellならscoopで

scoop install chezmoi

または

(irm -useb https://chezmoi.io/get.ps1) | powershell -c -

fishではcurl, wgetのが使えなかったのでLinuxbrewで

brew install chezmoi

使い方

 まず1台目ではchezmoi initをして、chezmoi addをすると、~/.local/share/chezmoiに(ちょっと変化させて)コピーされてくる。 この中でchezmoi edit ~/.bashrcとかで編集できる(Windowsだとデフォルトのエディタがnotepadになっていたので変更したいがまだできてない)。 この状態では反映されてないので、chezmoi -v applyで変更を実際の環境に適用できる。 バージョン管理はgitを使うので、chezmoiが管理するディレクトリにchezmoi cdで移動して、git commitをする。 remote repositoryにプッシュすることもできる。

 2台目ではchezmoiをインストールした後、chezmoi init remoterepo.gitでchezmoiの管理するディレクトリにpullされてくる。 chezmoi -v applyをすると、それらが実際の環境に反映される。

 このように実際の環境とchezmoiの管理するディレクトリが分かれており、gitでchezmoiの管理するディレクトリ同士、chezmoiで各マシン上でそれらのディレクトリと本来のdotfilesへの反映や追加などをできる。 このあたりの関係はQuick startにある図がわかりやすい。

 今回はstarship.tomlしか追加していないが、問題なくubuntuとwindowsで同じconfigが使えていた。

おわりに

 見た目がよくなった。  本当はtexのコンパイルに4分かかって発狂してたのでWSLを使って少しでも早く使用と思った14のが始まりだったのに、放置していたWSLの設定を始めてしまい、結局まだWSLのtexの設定が終わってない。 ストレージの容量に余裕がないので、texlive-fullを入れるのは厳しそうなので、こんなに面倒なことになってる。

ほかに

 windows terminalとvscodeの設定もやった。 windows terminalのプロファイル設定についてはあとでまとめたい

あとFileHistory.exeでこけまくってるので、その他のバックアップを含めいままでの対処とかをまとめたい。


  1. 読み方が分かれるもの(例えば$\mathrm{Ti}k\mathrm{Z}$とか$\TeX$)について話してた時、ソフトの紹介で発音記号が載っているものの話をしたことがあるが、これもその一例だ ↩︎

  2. dotfilesの例を調べるつもりでGitHubでdotfiles、PowerShellで調べてたら出てきた。 ↩︎

  3. 更新した。https://misskey.io/notes/8zrzlpekre ↩︎

  4. 結局\\wsl$\からexplorer.exeで開くやつが壊れてた。 ↩︎

  5. つまり脱線した ↩︎

  6. https://zenn.dev/kaityo256/articles/ssh_agent_on_wsl ↩︎

  7. ssh時とかfishからbashを起動したいときの為 ↩︎

  8. tmux全然使えてないので、外すかもしれないが、特にSSHのセッションを保存できるのは魅力的なので後で学んでみる。 ↩︎

  9. メモ:oh-my-fishのパッケージはfisherを使ってfisher oh-my-fish/repo_nameで入れられる。 ↩︎

  10. homebrewを使った理由は、もともとhugoをインストールするのに使っており(ただ、今回調べたときはaptで管理できるようになっていたのでbrewのインストールは諦めたときもあった)、また、starshipを入れるのに必要だったから ↩︎

  11. 参考: https://qiita.com/kiwatchi1991/items/6962dfa645bf6e66f85e, https://zenn.dev/estra/articles/zenn-fish-add-path-final-answer, https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670 等 ↩︎

  12. 違いは実感できていない。$PROFILEは5.1の物をコピーしてきた($PROFILE.exeの場所も違っていた) ↩︎

  13. MS Storeにもあるが、それぞれ別にインストールされた。MS Storeから入れたほうは削除している。アップデートはWindows Updateでやってくれるらしい。 ↩︎

  14. 数倍早くなるらしい。 ↩︎