「モダン」なターミナル環境を整えるには何が必要?
こんにちは! 最近、ターミナルに関するアンケートを実施して、何に不満を感じているかを聞きました。すると、こんなコメントがありました。
モダンなターミナル体験を実現するには、いろいろな要素が必要です。全部最初から使える状態になっていてほしいです。
最初に思ったのは、「モダンなターミナル環境を整えるのはそんなに難しくない。必要なのは……」ということでした。でも考えれば考えるほど、「必要なのは……」のリストは長くなり、注意点も次々に思い浮かびました。
そこで、自分にとって「モダン」なターミナル環境とは何か、そしてそこにたどり着くのが難しい理由は何だと思うか、メモとして書き残しておくことにしました。
「モダンなターミナル環境」とは?
私にとって重要なことをいくつか挙げます。それぞれ、システムのどの部分が担当する機能なのかも書いておきます。
- コピー&ペーストで複数行に対応していること:シェルに3つのコマンドを貼り付けたら、いきなり全部実行されてはいけません! 怖すぎます!(シェル、ターミナルエミュレーター)
- シェルの履歴が無制限であること:シェルでコマンドを実行したら、履歴を500件までとか何とかで削除せず、永遠に保存してほしいです。それに、シェルのセッションを終了したときだけでなく、コマンドを実行した時点ですぐ履歴に保存してほしいです。(シェル)
- 役に立つプロンプト:プロンプトに現在のディレクトリと現在のgitブランチが表示されないと、私は生きていけません。(シェル)
- 24ビットカラー:これは私にとって重要です。24ビットカラーに対応しているほうが、256色しか使えないターミナルよりも、neovimのテーマをずっと簡単に設定できるからです。(ターミナルエミュレーター)
- vimとOSの間でクリップボードが連携していること。Firefoxでコピーしたら、vimで
pを押すだけで貼り付けられるようにしたいです。(テキストエディター、場合によってはOS/ターミナルエミュレーターも) - 優れたオートコンプリート:たとえばgitのようなコマンドには、コマンド専用の補完があるべきです。(シェル)
lsに色が付くこと(シェルの設定)- 好みのターミナルテーマ:私はターミナルで多くの時間を過ごすので、見た目をよくしたいです。ターミナルエディターのテーマとも統一したいです。(ターミナルエミュレーター、テキストエディター)
- ターミナルを自動修復してくれること:プログラムがターミナルをおかしくする変なエスケープシーケンスを出力したとき、それを自動的にリセットして、ターミナルが壊れたままにならないようにしてほしいです。(シェル)
- キーバインド:
Ctrl+左矢印を使えるようにしたいです。(シェルまたはアプリケーション) lessのようなプログラムでスクロールホイールを使えること。(ターミナルエミュレーターおよびアプリケーション)
ターミナルには、ほかにも無数の便利な機能がありますし、何を重視するかは人それぞれです。でも、ここに挙げたものがなかったら、私は本当に困ります。
私が「モダンな環境」を実現している方法
基本的な方針は次のとおりです。
fishシェルを使う。ほとんど設定はしていませんが、次の2つだけは設定しています。EDITOR環境変数をお気に入りのターミナルエディターに設定するlsをls --color=autoのエイリアスにする
- 24ビットカラーに対応したターミナルエミュレーターを使う。これまでGNOME Terminal、Terminator、iTermを使ったことがありますが、あまりこだわりはありません。フォントを選ぶ以外は、ほとんど設定していません。
neovimを使う。設定はここ9年ほど、非常にゆっくりと作り込んできたものです(vimの設定を削除してゼロから始め直した最後の時点から、もう9年になります)。- base16 frameworkを使って、すべてのテーマを設定する。
私の方針に影響していることがいくつかあります。
- ほかのマシンにSSH接続して作業することは、あまりありません。
- 何もかもキーボードで操作する方法を考えるより、マウスを少し使うほうが好きです。
- 大きなプロジェクトを1つではなく、小さなプロジェクトをたくさん扱っています。
「モダン」な環境をすぐ使える選択肢
快適な環境はほしいけれど、設定に多くの時間をかけたくない場合はどうすればよいでしょうか? vimを満足できる形に設定する方法を見つけるだけで、実際に10年くらいかかりました。長い時間です!
最小限の設定で、そこそこ快適なターミナル環境を手に入れる方法として、私が思いつく最善の案は次のとおりです。
- シェル:
fish、またはoh-my-zshを導入したzsh - ターミナルエミュレーター:24ビットカラーに対応しているものなら、ほとんど何でも構いません。たとえば、次のものはすべて人気があります。
- Linux:GNOME Terminal、Konsole、Terminator、xfce4-terminal
- Mac:iTerm(Terminal.appは256色に対応していません)
- クロスプラットフォーム:kitty、alacritty、wezterm、ghostty
- シェルの設定:
EDITOR環境変数をお気に入りのターミナルテキストエディターに設定するlsをls --color=autoのエイリアスにするのもよいでしょう
- テキストエディター:これは難しいところです。おそらくmicroかhelixでしょうか? どちらも本格的には使ったことがありませんが、どちらもとても面白いプロジェクトに見えます。microでは、GUIエディターでおなじみの操作(コピーする
Ctrl-C、貼り付けるCtrl-V、すべて選択するCtrl-A)をそのまま使えて、期待どおりに動くというのはすごいと思います。vimの操作に慣れた筋肉記憶を再学習するのはあまりにも大変そうなので、私ならhelixに乗り換えてみると思います。ただ、helixにはまだGUIもプラグインシステムもありません。
個人的には、ターミナルエミュレーターとしてxterm、rxvt、Terminal.appは使わないと思います。過去に使ってみて、重要な機能が欠けていると感じたからです(Terminal.appの場合は24ビットカラーなど)。そのせいで、私にとってはターミナルが使いにくくなります。
とはいえ、「モダン」なターミナル環境を手に入れるのが実際より簡単だと思わせたいわけではありません。難しくしている問題は2つあると思います。見ていきましょう!
「モダン」な環境にたどり着く際の問題1:シェル
bashとzshは圧倒的に人気のある2つのシェルですが、どちらも、インストールしただけですぐ使えるデフォルトの環境には、私が満足できるものがありません。たとえば次のような点です。
- プロンプトをカスタマイズする必要がある
- gitの補完がデフォルトでは付属しておらず、自分で設定しなければならない
- デフォルトでは、bashが保存する履歴は500行だけ(!)で、少なくともMac OSではzshも2000行しか保存する設定になっていません。これでもまだ少ないです。
- bashのTab補完はとても使いにくいと感じます。一致する候補が複数あると、それらをTabキーで順番に切り替えられないからです。
そして、私はfishが大好きですが、POSIX準拠ではないという事実のせいで、多くの人にとって乗り換えが難しいのも確かです。
もちろん、bashなどでプロンプトをカスタマイズする方法を学ぶことはできますし、それほど複雑である必要もありません。bashなら、私はおそらくexport PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ 'のような設定から始めるか、starshipを使うでしょう。でも、こうした「複雑ではない」作業も、積み重なるとそれなりの量になります。複数のシステム間で設定を同期させる必要がある場合は、特に大変です。
「モダン」なシェル環境を手に入れる方法として、非常に人気があるのがoh-my-zshです。すばらしいプロジェクトのようですし、実際に多くの人がとても満足して使っているのも知っています。ただ、私は過去にこのような設定システムで苦労してきました。現在の基本的なoh-my-zshだけで、設定が約3000行も追加されるようです。そして、何か問題が起きたとき、設定システムがもう1つ増えると、何が起きているのかをデバッグするのが難しくなることがよくあります。私自身は、その仕組みを使ってプラグインを大量に追加し、システムを遅くし、遅いことにいら立ち、最後には全部削除して設定をゼロから書き直す、という傾向があります。
「モダン」な環境にたどり着く際の問題2:テキストエディター
最近実施したターミナルのアンケートでは、ターミナルで使うテキストエディターとして圧倒的に人気があったのは、vim、emacs、nanoでした。
ターミナル用テキストエディターの主な選択肢は、次のようなものだと思います。
- vimやemacsを使い、好みに合わせて設定する。手をかけさえすれば、欲しい機能はおそらく何でも実現できます。
- nanoを使い、かなり限定された環境になることを受け入れる(たとえば、nanoではマウスでテキストを選択してから「カット」することはできないと思います)。
microやhelixを使う。どちらも最初からかなり快適に使えるようですが、主流ではないテキストエディターを使うことで、たまに問題に遭遇する可能性はあります。- ターミナル用テキストエディターをできるだけ使わない。たとえばVSCodeを使い、ターミナルに関することはすべてVSCodeのターミナルで行い、ターミナルではほとんどファイルを編集しない。あるいは、ターミナルの
EDITORとしてcodeを使っている人も多いと思います。
問題3:個々のアプリケーション
最後の問題は、使っている個々のプログラムが、ときどき少し面倒なことです。たとえば私のMac OSマシンでは、/usr/bin/sqlite3がCtrl+左矢印のキーボードショートカットに対応していません。SQLiteでそこそこ快適なターミナル環境を実現するためにこれを直すのは少し複雑で、次のことをしなければなりませんでした。
- なぜこうなるのか理解する(Mac OSはGNUツールを提供しておらず、「Ctrl+左矢印」の対応はGNU readlineによるものです)
- 回避策を見つける(readlineに対応しているHomebrew版のsqliteをインストールする)
- 環境を調整する(Homebrewのsqlite3をPATHに入れる)
このようなアプリケーション固有の問題をデバッグするのは、本当に簡単ではないと感じます。何時間も調べるのは嫌なので、さまざまな小さな不便をそのまま受け入れてしまうこともよくあります。今回の問題を解決できたのも、最近ターミナルについて膨大な時間をかけて考えていたからにすぎません。
ターミナルプログラムを使って「モダン」な環境を実現するうえで大きな意味を持つのは、単に新しいターミナルプログラムを使うことです。たとえば、topで列を並べ替えるキーボードショートカットを覚える気にはなれませんが、htopなら列の見出しをマウスでクリックするだけで並べ替えられます。だからhtopを使っています! ただ、より「モダン」な新しいコマンドラインツールを見つけるのは簡単ではありません(こちらにリストを作りました)。実際に使って気に入るものを見つけるには時間がかかりますし、別のマシンにSSH接続している場合は、そうしたツールが必ずしも入っているとは限りません。
すべてが互いに影響する
ターミナルを何もかも「快適」にしようと設定していて難しいと感じるのは、ワークフローの一見小さな変更が、ほかのあらゆる部分に大きな影響を与えることです。たとえば、今の私はtmuxを使っていません。でも、またtmuxを使う必要が出てきたら(たとえば、別のマシンにSSH接続して作業することが多くなった場合)、いくつか考えなければならないことがあります。
- SSH経由でtmuxのコピー内容をシステムのクリップボードと同期させたいなら、ターミナルエミュレーターがOSC 52に対応していることを確認する必要があります。
- iTermのtmux統合(tmuxのタブをiTermのタブにする機能)を使いたいなら、色の設定方法を変える必要があります。今は、シェルの起動時に実行するシェルスクリプトで色を設定していますが、この方法だとtmuxセッションを復元したときに色が失われるからです。
ほかにも、まだ考えついていないことがあるでしょう。「tmuxを使うには色の管理方法を変えなければならない」というのは、ありそうに聞こえません。でも実際に私にはそれが起きて、「今は色の管理方法を変えたくないから、この機能は使わないでおこう」と決めました。
自分がどの機能に依存しているのかを覚えておくのも難しいです。たとえば、今使っているターミナルが実はOSC 52に対応していて、SSH経由でtmuxからコピーするのがずっと「ただ動いていた」ために、それが必要な機能だとすら認識していないのかもしれません。そしてターミナルを変えた途端、なぜか動かなくなります。
少しずつ変える
個人的には、自分の環境はそれほど複雑ではないと思っています。それでも、ここにたどり着くまでに20年かかりました! ターミナルの設定変更は、予想外で理解しにくい結果を招きやすいものです。だから、ターミナルの設定を一度にたくさん変えると、問題が起きたときに何が悪かったのか理解するのがずっと難しくなり、とても途方に暮れてしまいます。
そのため、私はたいてい、かなり小さな変更を加えるほうを好みます。そして、変更に慣れるまでには本当に長い時間がかかることも受け入れています。たとえば、lsからezaに乗り換えたのは1~2年前です。気に入ってはいます(eza -lなら、デフォルトで人間が読みやすいファイルサイズを表示してくれるからです)が、今でもまだ完全には馴染んでいません。一方で、大きな変更をする価値がある場合もあります。10年前にbashからfishへ乗り換えましたが、そうして本当によかったと思っています。
「モダン」なターミナルを手に入れるのは、そんなに簡単ではない
ターミナルの設定がどれだけ「簡単」かを説明しようとしてみたら、実際にはけっこう難しいし、今でもときどき混乱しているのだと気づきました。
ターミナルの設定には、ほかのすべてのものと互換性がある完璧な方法が1つ存在するわけではありません。いろいろ試して、自分にとってうまく機能する、ある程度安定した状態を見つけるしかありません。そして、新しいツールを使い始めれば、そのシステムが崩れて、もう一度考え直す必要が出てくるかもしれない。それも受け入れる必要があります。
記事をランダムに読む