「モダン」なターミナル環境を整えるには何が必要か?
原文は Julia Evans により に公開されました。 このブログを購読する
こんにちは!最近、ターミナルに関するアンケートを実施して、みなさんがどんなことにフラストレーションを感じているかを聞いてみました。ある人がこんなコメントをくれました。
モダンなターミナル体験を得るには、あまりにも多くの要素が関わってきます。最初から全部そろっていればいいのに。
最初に聞いたときは「え、モダンなターミナル体験なんてそんなに難しくないよ、ただ〜すればいいだけなのに…」と思ったのですが、よく考えてみると「ただ〜すればいい」のリストはどんどん長くなり、注意点も次々と思い浮かんできました。
そこで、私にとって「モダン」なターミナル体験とは何なのか、そしてそこにたどり着くのを難しくしているのは何なのかについて、個人的なメモを書き留めてみようと思いました。
「モダンなターミナル体験」とは何か?
私にとって重要ないくつかの要素と、それがシステムのどの部分に関わるかを挙げてみます。
- コピー&ペーストの複数行対応:シェルに3つのコマンドを貼り付けても、全部がすぐに実行されないこと!勝手に実行されたら怖いですからね!(シェル、ターミナルエミュレータ)
- 無限のシェル履歴:シェルで実行したコマンドは、500件くらいで削除されたりせず、ずっと保存されてほしい。しかも、シェルセッションを終了したときだけでなく、実行した瞬間に履歴に保存されてほしい(シェル)
- 便利なプロンプト:プロンプトに現在のディレクトリと現在のgitブランチが表示されていないと生きていけません(シェル)
- 24ビットカラー:これは私にとって重要です。256色しかないターミナルよりも、24ビットカラーに対応している方がneovimのテーマ設定がはるかに簡単だからです(ターミナルエミュレータ)
- クリップボード連携:vimとOS間でクリップボードが連携していて、Firefoxでコピーしたものをvimで
pを押すだけで貼り付けられること(テキストエディタ、OSやターミナルエミュレータも関係するかもしれません) - 優れた自動補完:たとえばgitのようなコマンドで、コマンド固有の自動補完が効くこと(シェル)
lsで色が付くこと(シェル設定)- 気に入ったターミナルテーマ:ターミナルで過ごす時間は長いので、見た目をきれいにしたいし、ターミナルエディタのテーマと合わせたい(ターミナルエミュレータ、テキストエディタ)
- ターミナルの自動修復:もしプログラムが変なエスケープシーケンスを出力してターミナルが崩れても、自動的にリセットされてぐちゃぐちゃにならないこと(シェル)
- キーバインド:
Ctrl+left arrowがちゃんと動いてほしい(シェルまたはアプリケーション) lessのようなプログラムでスクロールホイールが使えること:(ターミナルエミュレータとアプリケーション)
ほかにも便利な機能は山ほどありますし、人によって重視するものは違いますが、これらは私にとって、ないと本当に困るものです。
私が「モダンな体験」をどう実現しているか
私の基本的なやり方はこうです。
fishシェルを使う。基本的には設定をいじらず、以下のことだけ行います。EDITOR環境変数をお気に入りのターミナルエディタに設定するlsをls --color=autoにエイリアスする
- 24ビットカラーに対応したターミナルエミュレータなら何でも使う。過去にはGNOME TerminalやTerminator、iTermを使ってきましたが、ここはあまりこだわりがありません。フォントを選ぶ以外は特に設定しません。
neovimを使う。設定はここ9年ほどかけて少しずつ作り上げてきたものです(最後にvimの設定を全部消して一からやり直したのが9年前でした)- すべてのテーマ設定にbase16フレームワークを使う
私のやり方に影響しているいくつかの事情は次のとおりです。
- ほかのマシンにSSHでつないで作業することはあまりない
- すべてをキーボードだけで操作しようとするより、多少マウスを使った方がいいと思っている
- 一つの大きなプロジェクトではなく、小さなプロジェクトをたくさん扱っている
「モダン」な体験を手軽に得るための選択肢
快適な体験は欲しいけれど、設定にあまり時間をかけたくない場合はどうすればいいでしょうか?私自身、納得のいく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)がそのまま期待通りに使えるのが素晴らしいと思います。私もhelixに乗り換えてみたいのですが、vimで染み付いた指の癖を直すのが大変すぎる気がします。あと、helixにはまだGUIもプラグインシステムもありません。
個人的には、ターミナルエミュレータとしてxtermやrxvt、Terminal.appは使わないようにしています。過去の経験上、これらには(Terminal.appの24ビットカラー非対応のように)ターミナルを使いにくくするような、核となる機能が欠けていると感じたからです。
とはいえ、「モダン」なターミナル体験を得るのが実際より簡単であるかのように見せたくはありません――それを難しくしている問題が2つあると思います。そのことについて話しましょう!
「モダン」な体験を得る上での問題1:シェル
bashとzshは圧倒的に人気のある2つのシェルですが、どちらもデフォルトのままでは私が満足して使える状態にはなりません。たとえば次のような点です。
- プロンプトをカスタマイズする必要がある
- デフォルトではgitの補完が付いてこないので、自分で設定しなければならない
- デフォルトでは、bashは履歴をたった500行(!)しか保存せず、(少なくともMac OSでは)zshも2000行しか保存するように設定されていない。これはまだまだ少ない
- bashのタブ補完はとてもイライラします。候補が複数あるときにタブで順に切り替えられないからです
そして私はfishが大好きですが、POSIX準拠ではないという事実が、多くの人にとって乗り換えを難しくしています。
もちろん、bashなどでプロンプトをカスタマイズする方法を学ぶことは十分可能ですし、そこまで複雑である必要もありません(bashならたとえばexport PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ 'のようなものから始めるか、あるいはstarshipを使うかもしれません)。しかし、こうした「複雑ではない」ことが一つひとつ積み重なっていくのですし、特に複数のマシン間で設定を同期させなければならない場合はなおさら大変です。
「モダン」なシェル体験を得るための非常に人気のある解決策がoh-my-zshです。素晴らしいプロジェクトだと思いますし、多くの人がとても満足して使っているのも知っています。ただ、私は過去にそういった設定システムで苦労したことがあります――今のoh-my-zshのベースだけでも約3000行の設定が追加されるようですし、こうした追加の設定システムがあると、何か問題が起きたときに何が起きているのかをデバッグするのが難しくなると感じることがよくあります。私個人としては、ついそのシステムを使ってプラグインを追加しすぎてシステムを重くし、遅さにイライラして、結局全部消して一から新しい設定を書き直す、ということを繰り返しがちです。
「モダン」な体験を得る上での問題2:テキストエディタ
最近実施したターミナルアンケートでは、圧倒的に人気が高かったターミナルテキストエディタはvim、emacs、そしてnanoでした。
ターミナルテキストエディタの主な選択肢は、次のようなものだと思います。
- vimかemacsを使って好みに合わせて設定する。手間をかければ、欲しい機能はおそらく何でも手に入れられる
- nanoを使って、かなり限定的な体験になることを受け入れる(たとえばnanoではマウスでテキストを選択して「切り取り」することはできないと思います)
- そのままでもかなり快適に使えるように見える
microやhelixを使う。ただし、あまりメジャーでないエディタを使うことで、ときどき問題に遭遇する可能性はある - できるだけターミナルテキストエディタを使わないようにする。たとえばVSCodeを使い、ターミナルが必要なときはVSCodeのターミナルを使い、基本的にターミナルでファイルを編集しない。ターミナルでの
EDITORとしてcodeを使っている人もたくさんいるのは知っています。
問題3:個別のアプリケーション
最後の問題は、ときどき自分が使う個別のプログラムがちょっと厄介だということです。たとえば私のMac OSマシンでは、/usr/bin/sqlite3がCtrl+Left Arrowのキーボードショートカットに対応していません。SQLiteでまともなターミナル体験を得るためにこれを修正するのは少し複雑で、次のようなことをする必要がありました。
- なぜこうなるのかを理解する(Mac OSはGNUツールを同梱しておらず、「Ctrl+Left Arrow」の対応は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年かかりました!ターミナルの設定変更は予想外で理解しにくい結果を招きがちなので、一度にたくさんの設定を変えると、何か問題が起きたときに何が悪かったのかを理解するのがずっと難しくなり、本当に混乱してしまうと感じています。
だから私はたいてい、かなり小さな変更を少しずつ行うようにしています。そして、変化に慣れるまで本当に長い時間がかかることもあるのだと受け入れています。たとえば1、2年前にlsからezaに乗り換えましたが、気に入ってはいるものの(eza -lがデフォルトで人間が読みやすいファイルサイズを表示してくれるので)、まだ完全にはしっくりきていません。ただ、ときには大きな変更をする価値もあります。たとえば10年前にbashからfishに乗り換えたのは、本当にやってよかったと思っています。
「モダン」なターミナルを手に入れるのはそう簡単ではない
ターミナルの設定がいかに「簡単」かを説明しようとしてみて、むしろそれが結構難しくて、今でもときどき混乱するのだということに気づかされました。
ターミナルでは、ほかのすべてのものと互換性のある唯一の完璧な設定方法など存在しないのだとわかってきました。いろいろ試して、自分にとってうまくいく、ある種の局所的に安定した状態を見つけ、新しいツールを使い始めたらシステムが崩れて再考が必要になるかもしれないということを受け入れるしかないのです。
記事をランダムに読む
コメント
ログインしてコメントする