1X年ぶりにターミナル環境を作り替えている話

時の流れは恐ろしいもので、25才で社会人になり、今年で社会人人生が20年の節目の年だった。言い換えると、仮に65才定年だとすると社会人人生の折り返しの年でもあったらしい。

オールドタイプなインフラエンジニアなので仕事ではずーっと CLI 中心の生活になっていたので、ターミナル環境は生活の一部として継ぎ足しで整備をしてきた。継ぎ足して整備しているということは連続的な変化で特に新しい刺激はなく淡々と日々の仕事に支障なく使っていたのでマンネリな気配もあった。

たぶん、今のままの環境を使い続けても特に不満はないけど、節目の年ということもあって新しい風をいれてみるか、ということでターミナル環境で使っているツール類を入れ替えてみた。

入れ替え後の旧環境と新環境のツール類は以下のような感じになった。

旧環境 新環境
ターミナルエミュレータ iTerm2 WezTerm
*env 系ツール *env 各種 mise
zsh プロンプト 自作 starship
ターミナル向けエディタ MacVim Neovim
ドットファイル管理 してない chezmoi
ターミナルマルチプレクサー tmux tmux

ターミナルエミュレータ

ターミナルエミュレータの iTerm2 は X の過去のポストを遡ると少なくとも 2011年の時点では使っていたらしい。

長らく使っていたということもあって、iTerm2 には大きな不満はなかったけど、さすがに動作が重いというときがあって、軽量かつ機能的にカバーできる代替のターミナルエミュレータを探したところ、WezTerm が良さそうなので乗り換えてみた。

WezTerm は Lua で設定を書けるし、ドキュメントが充実しているので、自分のやりたいことは大体できるというところが気に入っている。あと、Lua は後述の Neovim でも使うことになるので、設定で使用する言語が同じというところも都合がよかった。

ただし、WezTerm はターミナルマルチプレクサとしても使えるんだけど、tmux の choose-window 相当の動作が実現できないのでターミナルマルチプレクサ部分を置き換えることはできなかった。

で、この記事を書いて下書きで寝かせているうちに Ghostty が正式リリースされて、どうしよう...となっている。

*env 系ツール

スクリプト言語を切り替える env 系ツールは rbevn や pyenv など個別の env 系ツールを使っていたけど、mise に一本化した。

一本化することで *env 系ツールの設定を1つにまとめることができたし、更新を取り込むときも mise up だけで済むというのは快適だった。

*env 系ツールの rbenv 向けに gem の移行用として rbenv-gem-migrate というプラグインを自作していたけど、mise では ~/.default-gems として全てのバージョンで入れておきたい gem を指定できるのでめでたくお役御免となった。

zsh プロンプト

zsh は学生の頃から使っていて、プロンプトは自前で PROMPT 環境変数と RPROMPT 環境変数を調整していたけど、今風なプロンプトを手軽に実現したかったので、starship に乗り換えた。

今風で見た目が良いというだけではなく、各種モジュールでカレントディレクトリの状態がプロンプトに表示されていて便利だった。とくに Git Status モジュールはリモートブランチからの乖離が一目でわかるようになったので、トピックブランチを生やす時にリモートブランチの HEAD の取り込み漏れが減ったり、stash の状態が一目でわかるのでゴミ掃除が捗った。

ターミナル向けエディタ

通常時は Emacs を使っているけど、ターミナル内でちょっとした修正や EDITOR 環境変数は MacVim に付属している vim コマンドを使っていた。~/.vimrc も Emacs ほどではないけど、それなりに育ていたけど、ちょっとした事情で育ていた環境を吹っ飛ばした時のバックアップ漏れで一年ほど素の状態で使い続けることになった。ガッツリ使っているわけではないので、大きな不満はなかったけど、少し使いづらいなーと感じる場面には遭遇するので、同僚が使っている Neovim を導入してみた。

プラグイン管理は LazyVim を使って Treesitter によるシンタックスハイライトや LSP の設定などを入れている。目的にあった Neovim のプラグインを探す時は dotfyle.com というサイトでいろんな人の設定を見れたり、目的別の人気のプラグインがわかるのでかなり重宝した。

あとは zsh のエイリアスとして以下を設定しておいた。

alias vim=nvim
alias view='nvim -mR'

Neovim の設定は Emacs と同様に github の個人アカウントでパブリックリポジトリとして公開している。

ドットファイル管理

ドットファイル管理は以前はファイルの symlink で管理する方法が主流だったけど、symlink での管理はなんとなく嫌だったので、これまでは避けていた。しかし、バックアップをとらずに育てていた ~/.vimrc を吹っ飛ばしたり、設定ファイルを Lua で記述できるツールが増えたりしたので、ドットファイル管理も Github で管理する機運が高まった。

そんななかで、chezmoi というツールが実ファイルを残して管理できるし、リモートリポジトリでの公開に躊躇うような秘密情報は暗号化して管理できそうということがわかったので、今回のことをきっかけに chezmoi によるドットファイル管理を取り入れることにした。

chezmoi も個人の Github アカウントにリポジトリを作っているけど、秘密情報の暗号化漏れが怖いのでプライベートリポジトリとして運用している。

chezmoi は Go のテンプレートでファイルを記述できるので、仕事用のマシンと私用のマシンでマシンのコンテキストを考慮しtた状態で設定を共有することも可能ということもよかった。あと、外部リポジトリを chezmoi の同期対象に入れることもできるので、Emacs や Neovim の設定を chezmoi の同期対象にいれることでドットファイル管理の統一ができたということも嬉しかった。

まとめ

じつは10年以上大きく変えてこなかった環境の入れ替えを決心できたのは今の会社では SSH によるリモートログインがほとんど必要なくて、ターミナル環境は自分のマシンだけを考えておけば良いという状態になったということも大きかった。今までは手元の環境を現代風にしたとしても SSH でリモートログインしたときに操作感が大きく異なることで作業効率が落ちることを嫌がって変化を拒んでいたという側面はあったけど、そういう心配がかなり小さくなったので変更に踏み切りやすかった。

今回の変更で10年以上戦えるかというとかなり微妙だけど、ドットファイルを管理するようになったので、大きな変更をして失敗しても切り戻すことはできるので変更しやすくなった。

あと、長いこと使い続けているツールとして zsh という超大物がいるけど、macOS のデフォルトシェルが zsh なのでこのまま使い続けるんじゃないかと思っている。

続: (Emacs さんの) 気分によってフォントを変える

半年前くらい Emacs のフォントは起動時にランダムで決定されたフォントを使っていました。設定した当初はお気に入りのフォントが見つかるかなーと思っていたけど、蓋を開けてみたら選択する候補のフォントは増えていた。

git のログを見る感じだと候補のフォントの入れ替わりはこんな感じだった。

現時点での候補はこんな感じになっている。これだけ見ると Moralerspace がどんだけ好きやねん?となりそうだけど、実際に Moralerspace Krypton HWNF はクセが強いけど視認性が悪くなくて結構好きです。

ここまで多いと起動時に読み込ませるだけでは物足りなくなってきて、任意のタイミングでフォントガチャを回してくなってきた。

話は変わって Emacs のテーマは doomemacs/themes を使っているんだけど、こっちもテーマの数がめっちゃあるのでフォントと同じようにガチャを回したくなってきた。というのも、今までは Solarized 由来のダーク系テーマを好んで使っていたけど、Neovim や WezTerm を使っている時に Tokyo Night というテーマの存在を知って、これいいじゃんとなったので Emacs のカラーテーマも色々かえてみようかという気持ちになってきた。

ということで、フォントの設定部分と同様に doom-theme の設定時にいくつか選んできたテーマをランダムで決定するようにして、フォントの選択部分と合わせていつでも呼び出せるようにしてみた。

nabeo/randomly-select-doom-themeとして doom-theme をいい感じに選択する

nabeo/set-my-font としてフォントファミリーをいい感じに選択する

nabeo/randomly-select-doom-theme と nabeo/set-my-font は C-c C-r でいつでも呼び出せるようにする

これで作業しているときにいつでも Emacs の中身をガラッと変えられるようになって日々の作業が充実するようになった。

本当は nabeo/randomly-select-theme を after-save-hook とか日常の手癖になっている操作の hook に登録して、いきなり Emacs さんの見た目が変わるなどのオモシロを取り入れてもいいかなーと思っている。

terraform は Homebrew で管理しない方が良いという話

macOS のパッケージ管理は Homebrew が主流だけど、terraform については Homebrew で管理しないほうが良いと言う話です。以前は Homebrew 経由で入れていたけど、今は mise を使って terraform コマンドを管理しています。

続きを読む

WezTerm 事始め

少なくともここ10年くらいは macOS のターミナルエミュレータは iTerm2 を使っていたんだけど、私用の macbook air は未だに intel CPU を使っていて、だんだん iTerm2 の動作がもっさりしてきていてストレスを感じるようになってきた。そんな中でどうやら WezTerm が軽量ぽいみたいな話題をみたので、iTerm2 で凝った設定をしていないということもあり、ターミナルエミュレータの引越しをしてみた。

続きを読む

git の pager 設定と less のオプション

プライベートと仕事用で設定が微妙に違っているので、メモっておく。こんなことしないでドットファイルは github とかで管理すればいいと思う。

less のオプションは ~/.zshrc に相当するところで $LESS を -g -i -M -R -W -z-4 -x4 となるように設定している。

git の core.pager は less -FRX -M -W -z-4 -x4 という設定を入れている。

あとは $PAGER、$GIT_PAGER あたりの環境変数は設定していない。

(Emacs さんの) 気分によってフォントを変える

今日はこどもの日なので、童心に返って Emacs の設定を見直していた。

で、最後にフォントを変えてみようかと思って最近の等幅フォント事情をググってみたら、いくつか気になるフォントを見つけた。どれも良さそうだったので、決められないなーと思っていたら、元同僚の id:aereal が Array#sample で毎日変えているという話題を思い出した。

ということで、Emacs でも同じようなことは簡単にできるなーと思ったので、こんな感じで Emacs を起動するごとにフォントを変えてみた。

(setq my/fontfamilies
      '("HackGen Console NF"
        "Moralerspace Neon HWNF"
        "Moralerspace Argon HWNF"
        "Moralerspace Xenon HWNF"
        "Moralerspace Radon HWNF"
        "Moralerspace Krypton HWNF"))
(set-face-attribute 'default nil :family (elt my/fontfamilies (- (random (length my/fontfamilies)) 1)) :height 140)

最近の emacs さんには restart-emacs コマンドで気軽に再起動することができるので、これで再起動の楽しみを1つ追加できた。

Node.js の grpc パッケージのインストール時に python で gyp が見つからなくてエラーになる時の対処

手元環境の python を 3.12 系に更新したあとに Node.js で grpc パッケージを入れようとすると

│ Traceback (most recent call last):
│   File "/Users/nabeo/.cache/node/corepack/pnpm/8.15.3/dist/node_modules/node-gyp/gyp/gyp_main.…
│     import gyp  # noqa: E402
│     ^^^^^^^^^^
│   File "/Users/nabeo/.cache/node/corepack/pnpm/8.15.3/dist/node_modules/node-gyp/gyp/pylib/gyp…
│     import gyp.input
│   File "/Users/nabeo/.cache/node/corepack/pnpm/8.15.3/dist/node_modules/node-gyp/gyp/pylib/gyp…
│     from distutils.version import StrictVersion
│ ModuleNotFoundError: No module named 'distutils'

こういうエラーで失敗してしまう。エラーメッセージでググると python 3.12 から distutils は削除されたので、python の packaging を入れなさいという issue が nodejs/node-gyp であった。

もしくは npm_config_python 環境変数に python 3.11 のパスを設定すると回避もできるらしい。とりあえずの対処としては npm_config_python 環境変数で逃げるでもよいけど、これからのことを考えるといつまでも python 3.11 に依存したくないので、python 3.12 でちゃんと使えるようにしたい。

homebrew では python の packaging は python-packaging として提供されていて、このエラーが発生時している時点でちゃんと入っていた。

% brew info python-packaging
==> python-packaging: stable 24.0 (bottled)
Core utilities for Python packages
https://packaging.pypa.io/
/opt/homebrew/Cellar/python-packaging/24.0 (53 files, 372KB) *
  Poured from bottle using the formulae.brew.sh API on 2024-03-25 at 10:36:03
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/p/python-packaging.rb
License: Apache-2.0 or BSD-2-Clause
==> Dependencies
Build: python-flit-core ✘, [email protected] ✔, [email protected] ✔
==> Analytics
install: 19,387 (30 days), 63,842 (90 days), 205,027 (365 days)
install-on-request: 821 (30 days), 1,497 (90 days), 3,796 (365 days)
build-error: 24 (30 days)
% brew list python-packaging
/opt/homebrew/Cellar/python-packaging/24.0/lib/python3.11/ (23 files)
/opt/homebrew/Cellar/python-packaging/24.0/lib/python3.12/ (23 files)
%

実は python の setuptools も必要というオチだったので、brew install python-setuptools で setuptools も入れて、python 3.12 の環境でも Node.js の grpc パッケージのインストールができるようになった。