こんにちは! 最近、ターミナルに関するアンケートを実施し、人々が何に不満を感じているかを尋ねました。ある人が次のようにコメントしました:

モダンなターミナル体験を実現するには、実に多くの要素が必要です。最初から全部揃っていてほしいと思います。

私の最初の反応は「モダンなターミナル体験なんて大したことないですよ。ただ…」というものでしたが、よく考えるほど「ただ…」のリストは長くなり、さらに多くの注意点が浮かび上がってきました。

そこで、私自身にとって「モダン」なターミナル体験とは何を意味するのか、そしてそれが人々にとって難しい理由について、いくつかのメモを書き留めてみようと思いました。

「モダンなターミナル体験」とは?

以下は、私にとって重要な要素と、それぞれを担当するシステムの部分です:

  • コピー&ペースト時の複数行サポート:シェルに3つのコマンドを貼り付けた場合、それらをすべて即座に実行してほしくありません! それは怖いです!(シェルターミナルエミュレータ
  • 無限のシェル履歴:シェルでコマンドを実行したら、それを永遠に保存してほしいです。500件の履歴エントリなどで削除されたくありません。また、コマンドは実行した瞬間に履歴に保存され、シェルセッションを終了したときだけ保存されるのであってほしくありません(シェル
  • 便利なプロンプト現在のディレクトリ現在のgitブランチがプロンプトに表示されることは、私にとって欠かせません(シェル
  • 24ビットカラー:これは私にとって重要です。なぜなら、256色のみのターミナルよりも、24ビットカラーサポートのあるターミナルでneovimのテーマを設定する方がずっと簡単だからです(ターミナルエミュレータ
  • クリップボードの連携:vimとOS間でクリップボードを共有し、Firefoxでコピーした内容をvimでpを押すだけで貼り付けられるようにしたい(テキストエディタ、OS/ターミナルエミュレータも関与する可能性あり)
  • 優れたオートコンプリート:例えばgitのようなコマンドには、コマンド固有のオートコンプリートがあってほしい(シェル
  • lsでのカラー表示シェル設定
  • 好みのターミナルテーマ:ターミナルで多くの時間を過ごすので、見た目を良くし、ターミナルエディタのテーマと一致させたい(ターミナルエミュレータテキストエディタ
  • ターミナルの自動修復:プログラムが奇妙なエスケープコードを出力してターミナルを乱した場合、それを自動的にリセットしてターミナルが壊れないようにしたい(シェル
  • キーバインドCtrl+左矢印が動作してほしい(シェルまたはアプリケーション
  • lessのようなプログラムでスクロールホイールを使えるようにする:(ターミナルエミュレータアプリケーション

他にもターミナルの利便性は無数にありますが、私がなければ本当に困るのはこれらの機能です。

私が「モダンな体験」を実現する方法

私の基本的なアプローチは次のとおりです:

  1. fishシェルを使用する。ほとんど設定せず、以下の点のみ:
    • EDITOR環境変数をお気に入りのターミナルエディタに設定する
    • lsls --color=autoにエイリアスする
  2. 24ビットカラーサポートのある任意のターミナルエミュレータを使用する。過去にはGNOME Terminal、Terminator、iTermを使ってきましたが、この点については特にこだわりはありません。フォントを選ぶ以外はほとんど設定しません。
  3. neovimを使用し、過去9年ほどかけて非常にゆっくりと構築してきた設定を使う(最後にvim設定を削除してゼロから始めたのは9年前)
  4. base16フレームワークを使ってすべてをテーマ化する

私のアプローチに影響を与えるいくつかの点:

  • 他のマシンに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環境変数をお気に入りのターミナルテキストエディタに設定する
    • 必要に応じてlsls --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:テキストエディタ

最近実施したターミナル調査では、最も人気のあるターミナルテキストエディタは圧倒的にvimemacsnanoでした。

ターミナルテキストエディタの主な選択肢は次のとおりだと思います:

  • vimまたはemacsを使用して好みに合わせて設定する。努力すれば、望む機能はほぼすべて得られる可能性がある
  • nanoを使用して、かなり限定的な体験を受け入れる(例えば、テキストをマウスで選択して「切り取り」することはできないと思います)
  • microまたはhelixを使用する。これらはかなり良い箱から出してすぐの体験を提供しているように見え、主流ではないテキストエディタを使用する際に時折問題に遭遇する可能性がある
  • ターミナルテキストエディタの使用をできるだけ避け、おそらくVSCodeを使用し、すべてのターミナルニーズにVSCodeのターミナルを使用し、ほとんどターミナルでファイルを編集しない。あるいは、多くの人がターミナルでEDITORとしてcodeを使用していることも知っています。

問題3:個別のアプリケーション

最後の問題は、私が使用する個別のプログラムが時々少し面倒なことです。例えば、私のMac OSマシンでは、/usr/bin/sqlite3Ctrl+左矢印キーボードショートカットをサポートしていません。SQLiteで合理的なターミナル体験を得るためにこれを修正するのは少し複雑でした。以下のことをする必要がありました:

  • これが起こっている理由を理解する(Mac OSはGNUツールを出荷せず、「Ctrl-左矢印」サポートはGNU readlineから来ている)
  • 回避策を見つける(readlineサポートのあるsqliteをhomebrewからインストールする)
  • 環境を調整する(Homebrewのsqlite3をPATHに置く)

このようなアプリケーション固有の問題のデバッグは本当に簡単ではなく、「価値がある」と感じることはよくありません — 時間をかけて調査したくないので、さまざまな小さな不便さに我慢してしまうことがよくあります。この問題を解決できた唯一の理由は、ターミナルについて非常に多くの時間を費やして考えていたからです。

ターミナルプログラムを使用して「モダン」な体験をする大きな部分は、より新しいターミナルプログラムを使用することです。例えば、topで列をソートするキーボードショートカットを学ぶ気にはなりませんが、htopではマウスで列見出しをクリックするだけでソートできます。そこでhtopを使っています! しかし、新しいより「モダン」なコマンドラインツールを発見するのは簡単ではなく(ここにリストを作りました)、実際に気に入って使うものを見つけるには時間がかかり、別のマシンにSSHで接続している場合は、いつもそこにあるとは限りません。

すべてがすべてに影響する

すべてを「快適」にするためにターミナルを設定する上で難しいと感じるのは、ワークフローの一見小さな変更が本当にすべてに影響を与える可能性があることです。例えば、現在私はtmuxを使用していません。しかし、再びtmuxを使用する必要がある場合(例えば、別のマシンにSSHで接続して多くの作業をする場合)、いくつかのことを考える必要があります。例えば:

  • tmuxのコピーをSSH経由でシステムクリップボードと同期させたい場合、ターミナルエミュレータにOSC 52サポートがあることを確認する必要がある
  • iTermのtmux統合(tmuxのタブをiTermのタブにする)を使用したい場合、色の設定方法を変更する必要がある — 現在はシェルが起動するときに実行されるシェルスクリプトで色を設定しているが、それはtmuxセッションを復元するときに色が失われることを意味する

そして、おそらく私が考えていないもっと多くのことがあります。「tmuxを使うことは、色の管理方法を変更する必要があることを意味する」というのはありそうにないように聞こえますが、それは実際に私に起こり、「今は色の管理方法を変更したくないので、その機能は使わないことにする!」と決めました。

また、どの機能に依存しているかを思い出すのも難しいです — 例えば、私の現在のターミナルは実際にOSC 52サポートを持っており、SSH経由でtmuxからコピーすることが常にJust Workedしているので、それが何が必要なのかを認識していないかもしれません。そして、ターミナルを切り替えたときに不思議に動作しなくなるかもしれません。

ゆっくりと変更する

個人的には、私のセットアップはそれほど複雑ではないと思いますが、ここまで到達するのに20年かかりました! ターミナル設定の変更は予期しない、理解しにくい結果をもたらす可能性が非常に高いため、一度に多くのターミナル設定を変更すると、問題が発生した場合に何が間違っていたのかを理解するのがはるかに難しくなり、本当に混乱を招く可能性があることがわかりました。

そこで、私は通常、かなり小さな変更を好み、変更に本当に長い時間がかかる可能性があることを受け入れています。例えば、lsからezaに切り替えたのは1、2年前で、私はそれが好きです(eza -lはデフォルトで人間が読めるファイルサイズを表示するため)しかし、まだ完全に確信しているわけではありません。しかし、時には大きな変更をする価値があることもあります。私は10年前にbashからfishに切り替えましたが、それを非常に嬉しく思っています。

「モダン」なターミナルを手に入れるのはそれほど簡単ではない

ターミナルを設定するのがどれほど「簡単」かを説明しようとすると、それがかなり難しいことだと感じさせられ、私自身もまだ時々混乱することがあると思います。

ターミナルで物を設定するのに、すべての他のものと互換性のある完璧な方法は存在しないことがわかりました。ただ何かを試し、私にとってうまくいくある種の局所的に安定した状態を見つけ、新しいツールを使い始めるとシステムが混乱する可能性があり、物事を再考する必要があるかもしれないことを受け入れるだけです。