Fish+Zellij+AstroNvimで始める最強ターミナル生活

Fish+Zellij+AstroNvimで始める最強ターミナル生活

Tags
Linux
Environment
Published
Author
けろりん北狐
Description
人生のお共に
※これはTUT Advent Calendar 2025の21日目の記事です。昨日はSmithさんの「電波かメイドカフェ」でした。
 

はじめに

こんにちは. けろりん北狐です.
皆さん、ターミナル使ってますか?ターミナルは情報系人間のお供、人生の大半を一緒に過ごす存在です。彼女と言っても差し支えないかもしれません。(現実にいないしね)
なので今回は魔改造します。

実行環境

一応参考までに
  • OS: Ubuntu 22.04.5 LTS on WSL
  • Host OS: Windows 11
  • Terminal: Windows Terminal
記事内でのパッケージマネージャーは主にaptを用います。また、記事内のスクリーンショットはテーマカスタマイズ済みであるため、見た目が異なる場合があります。
 

シェルの変更(Fish shell)

まづは、シェルを変更していこうと思います。
シェルとは、コンピューター(実際はカーネル)にコマンドを用いて処理を実行させることのできる仲介役のようなものです。ターミナルでコマンドを打つと、シェルが内容を解釈しプログラムを実行してくれます。大体のLinuxディストリビューションはbash、macOSの場合はzshがデフォルトとして入っています。
今回導入するものは、Fishです。

なんでFish?

fishを使う理由、それはfishの理念にもある「Works Out of the Box(すぐに使える)」が一番大きいです。
具体的な特徴を以下に示します。

特徴1. 強力な補完機能&シンタックスハイライト

fishはデフォルトで強力なコマンド・引数の補完機能を備えています。zshでもカスタマイズによって補完機能を導入することができますが、fishではインストールした瞬間から補完機能を使うことができます。
図1. コマンド補完の例.
図1. コマンド補完の例.
図2. コマンドの引数補完の例.
図2. コマンドの引数補完の例.
図3. パス補完の例.
図3. パス補完の例.
図1,2,3のように、補完したい場所でTabキーを押すと補完の候補が出てくるため、そのままTabキーで選択することで候補を挿入することができます。
図4. コマンド履歴から補完前.
図4. コマンド履歴から補完前.
図5. コマンド履歴から補完後.
図5. コマンド履歴から補完後.
さらに、コマンドを途中まで打つと、図4,5のように履歴から過去に打ったコマンドを薄く表示してくれるため、この状態で右矢印キーを押すと一瞬でコマンドを復元することができます。
図6. コマンドのシンタックスハイライト.
図6. コマンドのシンタックスハイライト.
また、図6のようにコマンドのシンタックスハイライトを行ってくれるので、打っているコマンドが非常に見やすいです。

特徴2. 見た目のカスタマイズ性

fishでは設定で文字の色やコマンドラインの見た目をカスタマイズすることができます。
図7. Web GUIでの文字色設定画面.
図7. Web GUIでの文字色設定画面.
図8. Web GUIでのコマンドラインの見た目設定画面.
図8. Web GUIでのコマンドラインの見た目設定画面.
図7のようにシンタックスハイライトの配色を変更したり、図8のようにコマンドラインの見た目を変更できます。fishのパッケージマネージャーを使用して有志の作成したテーマをインストールすることもできます。

特徴3. オリジナルのスクリプト&コマンド

これはメリットでもデメリットでもありますが、fishはPOSIX非準拠で、シェルスクリプトの代わりにfishスクリプトを使用します。これを使用するメリットとしては、シェルスクリプトに比べ可読性の高いコードを書けることです。
#!/bin/bash hoge="hoge" # 変数の定義 if [ "${hoge}" = "hoge" ]; then # if文 echo "hoge is ${hoge}" fi case "$hoge" in # case文 "hoge" ) echo "Hello hoge" ;; "fuga" ) echo "Hello fuga" ;; * ) echo "Hello" ;; esac
シェルスクリプトの書き方
#!/bin/fish set hoge "hoge" # 変数の定義 if test "$hoge" = "hoge" # if文 echo "hoge is $hoge" end switch $hoge # switch文 case "hoge" echo "Hello hoge" case "fuga" echo "Hello fuga" case "*" echo "Hello" end
fishスクリプトの書き方
上のコードはシェルスクリプトとfishスクリプトの比較です。シェルスクリプトに比べ、英単語を多用していることから意味が理解しやすくなっています。
特に、シェルスクリプトの制御構文の終わりをワードの逆から書く(if-fi, case-esac)という意味不明な仕様が、endで終わるというわかりやすい書き方になっているのは素晴らしいです。(esacとか書くとき毎回手が止まるしtypoしますからね、誰が考えたんだよこれ)
そしてデメリットは、シェルスクリプトをそのまま実行できないことですが、別にbashで実行すればいい(bash script.shみたいに)のでそれほどデメリットでもありません。ただ、環境変数を定義するexportが違う書き方になっているのでそこは覚える必要があります。

特徴4. abbrコマンド

コマンドの省略形を定義できるabbrコマンドを使えます。bashでも使用できるaliasコマンドに似ていますが、aliasが設定したコマンドを完全に置き換えるのに対し、abbrは設定したコマンドを展開します。
図9. hogeの定義と使用.
図9. hogeの定義と使用.
図10. スペースを押すと展開.
図10. スペースを押すと展開.
図9でhogeというabbrを定義しhogeを入力します。その状態でスペースを押すと、図10のように設定したコマンドを展開することができます。
aliasコマンドと違い、入力したコマンドを途中で編集したり、中身がブラックボックス化しないのがメリットです。

特徴5. 入門しやすい&すぐ使える

以上の特徴を踏まえて、fishの最大の特徴は、インストールしたらすぐ使えるため入門しやすいことです。設定いらずで強力な補完を使えるため、他人のpcや共有pcの環境に導入しやすいです。そして設定がいらないということは初心者でも使いやすいとも言えます。

Fishのインストール

aptを使ってfishをインストールします。インストール後、chshコマンドでシェルをfishに切り替えます。
$ sudo apt install fish # fishのインストール $ chsh -s /usr/bin/fish # シェルの変更
chshコマンド実行後見た目が変わらない場合はターミナルを再起動してみてください。
次に、fish専用のパッケージマネージャー、fisherをインストールします。fish専用のプラグイン等をインストールすることができます。
$ curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

使い方

あまり覚えることはありません。よく使うキーバインドは、入力中にTabキーで補完できるのと、Ctrl+cで入力中のコマンドをクリアできるのと、Alt+vでvimなどのエディタを開いて入力中のコマンドラインを編集できるぐらいです。
その他キーバインドは、fish_configで起動するウェブ設定画面の”bindings”から見れます。

おすすめプラグイン

先ほどインストールしたfisherでプラグインをインストールできます。
自分が使ってるプラグインのリポジトリのリンクを以下に列挙します。気になる物をインストールしてみてください。
z
jethrokuanUpdated Dec 21, 2025
※z:よく使うディレクトリにcdする
fish-bd
0raxUpdated Dec 19, 2025
※fish-bd:cd ../の代わりにbdコマンドを使える
fzf
jethrokuanUpdated Dec 14, 2025
※fzf:あいまい検索ツール
theme-bobthefish
oh-my-fishUpdated Dec 20, 2025
※おすすめテーマ設定プラグイン
fish-autols
rstacruzUpdated Oct 15, 2024
※cd時に自動でlsを実行する

ターミナルマルチプレクサの導入(Zellij)

ターミナルを同じ画面で複数開いて作業したいと思ったことはありませんか?そういう時に使えるのがターミナルマルチプレクサです。1つの画面で複数のターミナルを起動し操作することができます。
ターミナルマルチプレクサにはたくさん種類がありますが、今回導入するものはZellijです。

なんでZellij?

zellijの特徴を以下に示します。

特徴1. キーバインドが他と被りにくい

まず、zellijにはモードという概念があります。特定のキーバインドを入力するとモードが切り替わり、モードに応じたキーバインドが有効になるという仕組みです。つまり、重複したキーでもモード別にそれぞれ違うキーバインドを割り振ることができます。
図11. モード切替で新しくペインを生やす.
図11. モード切替で新しくペインを生やす.
図11はモード切替によって新しいペイン(pane)を生やしている動画です。入力中のコマンドは画面の下に表示されます。図11では、Ctrl+gp(pane)n(new)で新しくペインを作成しています。Ctrl+gでlockedモードからnormalモードに切り替え、pキーでペイン操作関連のモードに切り替え、nキーで新規作成、というようにコマンドをチェインすることで操作を行っています。
基本的に様々なモードはnormalモードから派生するため、ターミナルを操作できるlockedモードからnormalモードに切り替えるキーバインドだけ他のアプリのと重複しないように気をつけてさえいれば、自由にキーバインドの設定が行えます。

特徴2. タブ&セッション

zellijにはタブとセッションの機能が実装されています。
図12. タブの切り替え.
図12. タブの切り替え.
図12はタブを切り替えている動画です。画面上のタブバーにnvimTab #2というタブがあり、切り替わっていることが分かります。このように画面をタブ化して切り替えることができる機能です。
図13. セッションの切り替え.
図13. セッションの切り替え.
図13はセッションを切り替えている動画です。ペインやタブはセッション内で新規作成や切り替えができますが、そこからセッションを切り離し(デタッチ)したり、他のセッションに接続(アタッチ)したりできます。デタッチしたセッションはターミナルを閉じた後でも再起動しない限り残るため、作業を中断したい時などに便利です。

特徴3. レイアウトを設定できる

zellijはコマンドでペインを分けたりタブを作成したりして画面のレイアウトを変えていきますが、事前にレイアウトをファイルに記述して起動時に読み込むことで、最初からそのレイアウト通りにzellijを起動することができます。
例えば、自分は次のようなレイアウトファイルを作っています。
layout { pane size=1 split_direction="vertical" { pane size="75%" borderless=true { plugin location="tab-bar" } pane size="25%" borderless=true { plugin location="file:~/.config/zellij/plugins/zellij-datetime.wasm" { timezone1 "JST/+9" default_timezone "JST" background_color "#81b29a" foreground_color "#29394f" pane_color "#29394f" } } } pane split_direction="vertical" { pane size="15%" command="htop" close_on_exit=true pane size="50%" command="nvim" focus=true pane size="35%" split_direction="horizontal" { pane pane } } }
図14. zellijで作成したレイアウトを読み込んで起動.
図14. zellijで作成したレイアウトを読み込んで起動.
これを起動時に読み込むと、図14のように既にペインが分けられ、いくつかのコマンドが起動した状態でスタートすることができます。

Zellijのインストール

zellijをインストールする前に、Cargoをインストールします。cargoはRustのパッケージマネージャーで、ビルドシステムも備えています。zellijはrust製なので、cargoで直接ビルドした方が管理もしやすく楽です。cargoを使うためにはrustupをインストールします。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # rustupインストール
rustupはrustのインストーラーで、cargoも一緒についてくるのでこれをインストールします。インストール後、$HOME/.cargo/binを環境変数に追加するとcargoコマンドが使えるようになります。fishで変数を定義するにはexportの代わりにsetを使います。
$ set PATH $HOME/.cargo/bin $PATH # .cargo/binを環境変数に追加
さらに、cargoでビルドしたものは$HOME/.cargo/targetに配置されるのですが、このパスをCARGO_TARGET_DIRという変数で定義しておかなければビルド時にエラーが出るので先に定義しておきます。
$ set -x CARGO_TARGET_DIR $HOME/.cargo/target # ビルド配置先を指定(-xは--exportの意味)
これでようやくzellijをインストールできます。
$ cargo install --locked zellij

使い方

起動

$ zellij # 起動 $ zellij -s session-name # セッション名を決めて起動
レイアウトを決めて起動する場合は、$HOME/.config/zellij/layoutsにレイアウトを記述したkdlファイルを置くことで、そのレイアウトが使用できるようになります。起動する際はkdlファイルのファイル名を指定します。
$ zellij -l kdl-file-name # レイアウトを選択して起動
レイアウトの記述方法は公式ドキュメントを見てみてください。

操作

基本的にはCtrl+gでlockedモードからnormalモードに変えることで、zellijの操作を行えます。具体的な操作は画面下部のステータスバーに書いてあるため、そちらを見てください。
コンフィグファイル($HOME/.config/zellij/config.kdl)でキーバインドの設定変更などもできます。

プラグイン

zellijはWebAssembly(wasm)によるプラグインを使うことができます。基本的には、レイアウトに組み込むタイプと、キーバインドで起動するタイプがあります。
プラグインはwasmファイルをダウンロードし、$HOME/.config/zellij/pluginsディレクトリに配置して読み込みます。
キーバインドに組み込むタイプは、コンフィグファイルのload_pluginsにwasmファイルのパスを追加することで読み込むことができます。詳細は公式ドキュメントに書いてあります。
レイアウトに組み込むタイプは、レイアウトファイル内でプラグインをロードすることでレイアウトのペインの1つとして読み込めます。詳細は公式ドキュメントに書いてあります。

ターミナルでコードを書く(AstroNvim)

最後にAstroNvimを導入していきます。その前に、vimとneovimについて説明します。

Vim&Neovimについて

Vimは言わずも知れたターミナルで使える軽量テキストエディタです。操作を全てコマンドで行い、マウス操作なしでテキスト編集を行えます。コマンドを覚える必要があるため使用難易度が高めですが、キーボードから手を離さずに使えるため慣れると爆速でコーディングを行えます。
そしてNeovimは、vimから派生したテキストエディタです。lua言語でプラグインを開発することができ、有志の開発したプラグインが豊富で、プラグインを導入しまくればVSCodeのようなリッチなテキストエディタにすることもできます。

AstroNvimについて

AstroNvimとは、オールインワンのNeovim環境です。最初から便利なプラグインが体系的にインストールされており、プラグイン選定やインストール作業を行わずにコードを書き始めることができます。

なんでAstrtoNvim?

正直セットアップされたNeovim環境は他にもたくさんあり、違いといえば入ってるプラグインと設定がちょっと違うくらいなのでAstroNvimでなくてもいいのですが、個人的にエディタに必須な機能が体系的に入っているのでこれをオススメします。
入ってるプラグイン別に特徴を紹介していきます。

AstroCommunity

AstroCommunityプラグインは、便利なプラグインの設定をまとめたプラグインです。公式githubにプラグインとオススメの設定が乗っており、それを設定に記述するだけで設定込みでプラグインを導入することができます。設定はAstroNvimと相性がいいように作られているため自分で1から導入するより簡単にできます。
このエコシステムを利用できることがAstroNvimを使う最大の理由でもあります。

Lazy.nvim

Lazy.nvimプラグインは、neovimのパッケージマネージャーです。プラグインの遅延ロードができたり、図15のような見やすいUIでプラグインを管理できます。
図15. lazy.nvimのプラグイン一覧画面.
図15. lazy.nvimのプラグイン一覧画面.
特にプラグインの遅延ロード機能は、プラグインを最初に全てロードするのではなく使うときにロードを行うため、起動速度向上が見込めます。

Treesitter

Treesitterプラグインはソースコードの静的解析ツールで、シンタックスハイライトなどを行います。汎用性に優れておりそのままでも十分な性能を発揮しますが、言語別パーサーをインストールすることでより正確なシンタックスハイライトを行えます。(現在285個の言語やツールの言語別パーサーを利用できます。)

Mason

MasonプラグインはLSPやFormatter、Linterを管理するツールです。インストールコマンドで任意のLSP、Formatter、Linterをインストールできます。
図16. PythonのLSP(pyright)によりインポートエラーがでている様子.
図16. PythonのLSP(pyright)によりインポートエラーがでている様子.
図17. PythonのLSPにより引数の定義を表示している様子.
図17. PythonのLSPにより引数の定義を表示している様子.
LSPは、言語サーバーのことで、コード補完やエラーの表示、型や引数の定義の表示などを行うことができます。図16のように赤文字でエラーを表示したり、図17のように引数の定義などを表示してくれます。
Formatterは、コードをルールに従って成形してくれます。保存時に自動フォーマット等行うこともできます。
Linterは、コードを静的解析し構文エラーを検出したりコードの成形を行ってくれます。

which-keys

which-keysプラグインは、コマンドを画面に表示してくれるプラグインです。
図18. 画面下部に使用できるコマンドが表示されている様子.
図18. 画面下部に使用できるコマンドが表示されている様子.
図18のように、使用できるコマンドが画面下部に表示されます。コマンドを忘れても操作が可能なため、コマンドをあまり知らない状態でもneovimを使いこなすことができます。
コマンドの設定が入っているプラグインに最適化されているのもAstroNvimの特徴です。

AstroNvimのインストール

まずはneovimからインストールしていきます。aptパッケージでも公開されていますが、古いバージョンがインストールされてしまうため、githubのリリースからtarファイルをダウンロードし/optディレクトリに解凍します。解答したらパスを環境変数に追加します。
$ curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz # 最新版ダウンロード $ sudo tar -C /opt -xzf nvim-linux-x86_64.gz # 解凍 $ set PATH /opt/nvim-linux-x86_64/bin $PATH # 環境変数に追加 $ nvim --version # neovimのバージョン確認
これでnvimコマンドでneovimが起動できます。
次に、AstroNvimを入れていきます。neovimの設定ファイルは$HOME/.config/nvimにあるので、これを丸ごとAstroNvimの設定ディレクトリに置き換えます。インストールにはgitが必要です。
公式サイトのInstallationにやり方が書いてあります。
 
# まず設定ディレクトリのバックアップを取る $ mv ~/.config/nvim ~/.config/nvim.bak # その他、パッケージやキャッシュのバックアップも取る $ mv ~/.local/share/nvim ~/.local/share/nvim.bak $ mv ~/.local/state/nvim ~/.local/state/nvim.bak $ mv ~/.cache/nvim ~/.cache/nvim.bak # AstroNvimをインストールする(git必須) $ git clone --depth 1 https://github.com/AstroNvim/template ~/.config/nvim # AstroNvimインストール $ rm -rf ~/.config/nvim/.git $ nvim # neovim起動
neovimを起動して、図19のような画面が表示されたら成功です。
図19. neovimの起動画面
図19. neovimの起動画面

使い方

基本的にはvimと変わりません。よく使うコマンドを下に表にして載せます。

カーソル移動系

コマンド
説明
コマンド
説明
h, j, k, l
カーソル移動(左, 下, 上, 右)
L
画面下の行に移動
0
行頭に移動
zt
現在の行を画面上部に据える
^
行の最初の文字に移動
zz
現在の行を画面中央に据える
$
行末に移動
zb
現在の行を画面下部に据える
gg
ファイルの先頭に移動
w
次のワードに移動
G
ファイルの末尾に移動
b
前のワードに移動
数字+G
指定した行に移動
Ctrl+e
画面を1行下にスクロール
H
画面上部の行に移動
Ctrl+y
画面を1行上にスクロール
M
画面真ん中の行に移動
Ctrl+hjkl
隣の画面に移動

テキスト編集系

コマンド
説明
コマンド
説明
i
文字入力開始(insertモード)
p
ペースト
o
次の行から文字入力開始(insertモード)
yy
現在の行をコピー
O
前の行から文字入力開始
選択中+d
選択範囲を切り取り
v+カーソル移動キー
範囲選択
dd
現在の行を切り取り
選択中+y
選択範囲をコピー(ヤンク)
x
カーソル位置の1文字切り取り

その他

コマンド
説明
コマンド
説明
:q
neovim終了
Ctrl+r
リドゥ
:w
ファイル書き込み(セーブ)
u
アンドゥ
:q!
強制終了
:split
画面を上下に分割
:wq
セーブして終了
:vsplit
画面を左右に分割

プラグインのコマンド

コマンド
説明
コマンド
説明
Space
コマンドパレットを開く
:Lazy
パッケージ管理画面を開く
Space+e
ツリーを開く
:TSInstallInfo
treesitterのインストール情報を表示
Space+/
コメントアウト
:Mason
Masonの管理画面を開く
Space+c
バッファを閉じる

おすすめプラグイン

たくさんあるのでリストにします。
プラグイン名
説明
better-escape.nvim
jkキーでinsertモードからnormalモードに戻る
colorful-winsep.nvim
作業中の画面をハイライトしてわかりやすくする
dropbar.nvim
画面上部にパンくずリストを表示する
hlchunk.nvim
ブロックやインデントのハイライトを行う
lualine.nvim
画面下部のステータスラインをカスタマイズする
neominimap.nvim
画面右にバッファのミニマップを表示する
noice.nvim
コマンドラインをフロートして表示
nvim-colorizer.nvim
色コードに色を付ける
nvim-toggler
0,1やtrue,falseなどの単語を切り替え
smear-cursor.nvim
カーソルの動きを滑らかにする
vim-illuminate
同じ単語をハイライトする
render-markdown.nvim
サーバーを起動し、ブラウザでマークダウンをプレビューできる

おわりに

最後まで読んでくださりありがとうございます。後半の方は時間がなくて急ぎになりましたが、今回紹介したツールの良さがわかってくださるとありがたいです。「魔」改造できたかはわかりませんが、格段に良い環境が構築できたかと思います。
今回設定などは省きましたが、自分のdotfilesリポジトリに設定を上げているので、設定するときは参考に見てみてください。
 
22日目は昨日さんの「冗長にボールペンをカチカチする技術」です。
それでは、ありがとうございました!
トップへ戻る