end-4/dots-hyprlandを例にしてFishシェルでターミナルを速く・美しく・便利に使ってみよう

前回end-4/dots-hyprlandを導入していくつかカスタマイズしましたが今回はターミナルを飾ったり、便利に使おうという話です

Hidekichi

ターミナルでなにすんねん?

何をするかと聞かれると、なんだろう?と思ってしまいますが、PCでやることならだいたいの事はできます。その中でも日頃のシステムアップデートやソフトのインストールなどで使うことが多いのはご存知かと思いますが、それは普段からLinuxなどを使用している人か、WindowsでもChocolateyなどでソフトを管理している人ぐらいで、多くのWindowsユーザーはターミナルを使用することなどほぼほぼ無いと思います。

たまに何かがあってレジストリをいじったり、自分でちょっとしたコードを書くとかはあるかも知れませんし、そういった場合にターミナルを使用せざるを得ないなどはあるかも知れません。

Windowsで言うと、ターミナルとPowerShellは聞いたことがあるかと思います。これらは別々にWindowsに入っていて、どちらを使うのが良いのだろうか?などと迷う部分でもあります。そしてそれらは別の役目を持っています。

Windowsよりもっと昔にあったPC-98などの時代は、電源を入れても黒い画面のままでした。これがいわゆるターミナルに当たります。正確にはコンソール画面なわけですが、これはユーザーからの入力を待ってPCにどう指示を出すのかを待機している状態であると言えます。

昔にMS-DOSというものや、その他にも色々あったと思いますが、PC-98の黒い画面からゲーム等をインストールできたのは、その黒い画面がMS-DOSでOS兼シェルとして動作しており、コマンドなどを入力してどこに何を入れるのか等を指示して処理していたからなわけです。
そういったものは仕組みとしては現代のPowerShellに近いですが、MS-DOSとPowerShellは同じようなものとも言えなくはないですし、後継とか発展型と言えなくもないですが、それでも別物(別の仕組み)です。

WindowsのターミナルはそれらPowerShellと対話する窓口です。DOSコマンドとも対話できます。ここからもWindowsのターミナルとは、その向う側にあるDOSやPowerShellなどに指示を入力する装置(窓口)であり、その結果を表示するUIなのです。

Windowsでコマンドを使いたい時、ターミナルを起動するかPowerShellを起動するか迷う人も多いと思います。どちらも似たような黒い画面が表示されますが、役割には違いがあります。

ターミナルは入れ物や窓口であり、内部でどのシェルを使うかを選んで動作します。そのシェルとして、PowerShellを使うこともできますし、古くからあるコマンドプロンプト(cmd.exe)を使うこともできます。
つまりターミナルは、設定次第でPowerShellにもDOS(cmd)にも、また他のシェル(WSL経由でbashなど)にも指示を出せる統合的なインターフェースです。
直接PowerShellを起動する意味があるのは、「PowerShellの機能を明確に使いたい場合」 です。それ以外で単にコマンドを実行したいだけなら、ターミナル経由で十分なのです。

WSL(Windows Subsystem for Linux)とは
Windows上で直接Linuxのコマンドやアプリケーションを実行できる、Microsoft Learnが提供する機能です。仮想マシンを使わずに軽量な環境でLinuxを動作させることができ、開発者はWindowsからシームレスにLinuxツールを利用できます。
Windos Subsystem for Linuxとは

ターミナルとはなんぞや?

元々は、

という流れがあり、これらはテレタイプライター(TTY:Teletypewriter)という機械で行っていました。現代ではLinuxにGUI環境がない場合に黒い画面で入力待ちになっていますが、これをTTYと呼んでいます。
これらはCtrl + ALT + F1~F6でそれぞれTTY1~6まであり、仮想コンソール(Virtual Console)と呼んでいます。GUI環境に戻る場合はF7((標準ではそうですが違うものもあるかも知れません))が該当します。
中には、F1がGUI、F2以降がTTYになる構成のディストリビューション等があるので、F2~6がTTYに該当して、F7F1でGUIに戻ると理解しておくのが良いかも知れません。

LinuxではGUIが何かしらのトラブルに見舞われてPCは問題はないがシステム的に機能しなくなった場合にTTYでなんとかするための最後の砦のようなものになっています。他にもユーザーを切り替えて作業をしたりなど、現在のセッションと切り替えて使用することなどもできます。

Linuxでいうと、ターミナルと言っているものはターミナルエミュレーターで、これらはGUI上で動作するソフトです。物理的なターミナルの機能をエミュレート(模倣(もほう))してます。

ここからターミナルとはPCと対話する画面であって、それらを便利に処理するためのプログラムがShellと呼ばれるものです。

ここまで書くと「Shellって貝殻ってことだろ?ガワのことやん?ターミナルの中身がShellっておかしくない?」と思われる人もいるかと思いますが、ターミナルの向こう側にはOSの心臓部に当たるカーネル(Kernel)があるのです。
それを包み込むインターフェースなのでShellと言います。そしてそのShellと対話する窓口となるのがターミナル(エミュレーター)であり、人間はターミナルとShellを通じてカーネルなどのPCの処理をする中心部に指令を伝えているわけです。

Shellには色々と種類があったり、できることが多岐に及びます。しかし考え方としてはPCと対話をするものと理解してよいのではないかと。内部的に何がどうしてるのかはユーザーの知る所ではないですが、ユーザーの意図通り動作するようにPCサイドに伝える窓口と考えるのが良いと思います。

本題はここから

end-4/dot-HyprlandにはStarshipというShell用のプログラムが導入されています。
これはRust製のカスタマイズ可能なプロンプトを表示するためのプログラムです。デフォルトで組み込まれているので、~/.config/starship.tomlを編集するだけでカスタマイズできるわけですが、後述する公式プリセットにあるスクリプトを使用するとファイルが上書きされてしまうので、オリジナルのファイルや何かこれと決めたものがあればバックアップとしてstarship.toml.defaultなどとして置いておくのが良いかと思います。

これらは既に誰かが作ったプリセットから選ぶこともできます。例えばPastel Powerlineを適用するとすると、

starship preset pastel-powerline -o ~/.config/starship.toml

とターミナルで入力します。
そうすると、ユーザーディレクトリ以下の/.configディレクトリの下にstarship.tomlが書き出されます。

基本的にはこれだけで適用されます。

Pastel Powerline

end-4/dot-HyprlandはFishがデフォルトで使用できるようになっていますが中にはBashZshなど他のShellで使用したいという場合もあるかと思います。starshipはクロスシェル対応のプロンプトカスタマイズ用の小さなプログラムなので*.tomlの設定的には同じでしょうから環境が異なっても設定ファイルは流用できると思います。

oh my fishもプロンプトを変更できたりしますがoh my fishなどはフレームワークでプロンプトに特化しているわけではなくプラグインを管理したりいくつかの便利な機能のセットであると言えます。

この記事はend-4/dots-hyprlandのデフォルトとなっているFishシェルについて、そのRice環境をアップデートなどをするための事前準備や使い方などを書いたものです。

Linuxの古いコマンドを新しい代替のコマンドにする

なぜコマンドを置き換えるのかですが、基本的な作業は古典的なコマンドで対応はもちろん可能です。置き換える必要もないわけですが、置き換えた方がより速く・美しく・便利に作業ができるようになるので置き換えておきましょうという事です。
置き換えたとしても従来のコマンドは使用できます

前述のプロンプトを綺麗に飾るというのはカスタマイズの範疇ですが、これからやることは全体的なファイル操作などになるので、これがHyprland環境でなくてもターミナルでやることは変わりませんし、何なら別のディストリビューションで環境構築さえできれば同じことができます。

end-4/dots-hyprlandでは、最初からFish環境が作られていて、かついくつかのコマンドが導入設定されています。Starshipもその一つです。

ユーザーが公開しているセットアップStarship[Github-discussions]。これらは直接~/.config/starship.tomlを編集します

他のShellでもできるかもしれませんがFishシェルと組み合わせることが大事であって、かつHyprland環境で低遅延なターミナルでやるということがポイントです。

事前準備

end-4/dots-hyprlandをアップデートするとせっかく作ったfishのコードやファイルが上書きされてなくなってしまうだろうと思いますので、最初から無くならないようにしておきたいと思います。

日時は確認していませんが10/7現在、end-4/dots-hyprlandのインストールスクリプト(install.sh)が刷新されました。これによって流れは同じですがその方法や選択できる項目が以前のものと変わりましたのでillogical-impulseのwikiを十分に確認して下さい

ここからの設定などはRice環境本体(quickshellやHyprland環境)ではなくFishシェルの環境を保全するという流れになってます

1. 更新の影響が及ばない安全な場所を確保する

mkdir -p ~/.local/fish_functions

として、~/.local/ディレクトリにfish_functionsディレクトリを作ります。fish_functionsは様々な処理をfishでするスクリプトを置くディレクトリになります。

すでに~/.config/fish/functionsディレクトリにファイルを作って作業を始めていた方の場合

中身を新しくできた ~/.local/fish_functions に移せばよいだけの事ですが、これはターミナルでもマウスなどでカーソルを操作しても良いです。ターミナルでやるとすれば、

# 作業していたスクリプトを新たなディレクトリに移動させる
mv ~/.config/fish/functions/* ~/.local/fish_functions/

として予め作ったファイルを移動させておきます。その後、中のスクリプトを移動させた元々の作業フォルダである~/.config/fish/functionsは削除します。

# 作業していた元々のディレクトリは削除します
rmdir ~/.config/fish/functions

これらは既にfunctions/ディレクトリを作成していて作業していた場合です。新たに始めた場合はする必要はありません。

このことから、~/.config/fish直下にはend-4/dots-hyprlandで作られたあるいは更新された時のままのデフォルトのファイルだけがあるという状態になります。

2. fishディレクトリにシンボリックリンクを貼る

ln -s ~/.local/fish_functions ~/.config/fish/functions

これは、Fish Shellが様々な処理をする関数を探しに来る場所への道筋を作ると言うことになります。
Windowsで言うと、元になるスクリプトファイルの実態が入っているディレクトリを~/.local/fish_functionsに移しておいて、そのショートカット(シンボリックリンク)を~/.config/fish/functionsに置くというイメージです。

ここまでを行い、ターミナルで~/.config/fish/に移動して、ls -lとコマンドを打つと、

fishディレクトリの権限など

というような表示が出ると思います。上記で言う一番下のfunctions -> /home/hidekichi/.local/fish_functionsがここまでにした内容を表しています。Thunarなどのファイルマネージャで実際に見るとディレクトリアイコンに矢印のアイコンが付いたものが表示されているかと思います。

つまりfishシェルは本来であれば~/.config/fish/functionsを探しに行くわけですが、~/.local/fish_functionsを参照してるんでそっちを使ってねと言う意味になるわけです。

そのためこれから書くfishシェルでのスクリプトは~/.local/fish_functionsに追加していってください。編集する時なども同じです。これによってend-4/dots-hyprlandが更新されてfishディレクトリなどが書き換わってしまっても、追加したコードは別で管理しているためそのまま利用できると言うことになります。

Fishシェルに書く設定の新規作成/復元を楽にするために

これはどういうことかを説明すると、

と言う事を想定して、初回は良いとしてもそれらを更新の度に書き直すのは大変なので、

  1. 最初に作業場所を確保しておき、そこに追記したり新たに作成したりをするようにします。
  2. もしRice環境を更新をした後で、~/.config/fishが上書きされて初期化((Rice環境のデフォルト状態に))されてしまった場合は、作業ディレクトリから設定を復元する

という試みです。

fishの設定の自動復元のスクリプト

手順としては、

  1. 自作する設定ファイル の実体を置く安全な場所が作られているかを確認(なければ作成)
  2. Fish Shellが設定を探すリンク先(conf.d)を確認(なければ作成)
  3. ソースディレクトリの実体(自作した設定ファイル)を、ターゲットディレクトリにコピーして復元

これらは本来、~/.config/fish/config.fishに書く設定ですが、更新時に上書きされてしまうためにzoxideの(初期)設定などは無くなってしまいます。そのためカスタム設定を~/.local/fish_conf.d/.fishファイルとして分離することでRice環境の更新の影響を受けないように切り離して管理・作成ができるようにしています。

fishの設定はfunctionsディレクトリなどとは違ってやや特殊なためconf.dディレクトリに置く必要があるということです。

処理的には、~/.local/fish_conf.d/~/.config/fish/conf.d/に復元するスクリプトになります。
以下のコードは~/.local/fish_functions/post_rice_setup.fishに書きます。

function post_rice_setup --description "Restore custom fish configuration after dotfile update"
    set -l SOURCE_DIR "$HOME/.local/fish_conf.d"
    set -l TARGET_DIR "$HOME/.config/fish/conf.d"

    echo "--- Restoring Custom Fish Settings ---"

    # 1. カスタム設定の実体ディレクトリを確認・作成
    if not test -d "$SOURCE_DIR"
        echo "Creating source directory: $SOURCE_DIR"
        mkdir -p "$SOURCE_DIR"
        echo "Please add your custom settings (e.g., zoxide init) to this directory."
        return 0
    end
    
    # 2. ターゲットディレクトリを確認・作成 (Rice更新で消されている可能性があるため)
    if not test -d "$TARGET_DIR"
        echo "Creating target directory: $TARGET_DIR"
        mkdir -p "$TARGET_DIR"
    end

    # 3. カスタム設定ファイルをターゲットにコピー(上書きで復元)
    set -l source_files (ls -A "$SOURCE_DIR") 

    if test (count $source_files) -gt 0
        echo "Copying custom settings from $SOURCE_DIR to $TARGET_DIR..."
        
        find "$SOURCE_DIR" -mindepth 1 -maxdepth 1 | xargs -I {} cp -r {} "$TARGET_DIR"
        
        echo "Restore complete."
    else
        echo "Source directory $SOURCE_DIR is empty. Skipping copy."
    end
end

これらはend-4/dots-hyprlandをインストールした後、あるいは更新した後にターミナルから

post_rice_setup

と入力実行するだけです。場所を分離・管理しているため最新のユーザー設定は.localにあることになります。.config側に手を入れる必要はありません

スクリプトの説明として、find部分が何をしているかと言うと、ソースディレクトリの下にあるファイルだけをリストにするために、親ディレクトリになるソースディレクトリ自体(~/.local/fish_conf.d)を除外して、パイプ(|)でxargに対象のファイルのリストを渡し、受けたリストから再帰的にターゲットディレクトリにコピーするという手順を行っています。
これによってもし何かしらがサブディレクトリを持っていたとしてもそれらも再帰的に(そのサブディレクトリの中身も)全てコピーされます。

作業フォルダについて

本来、~/.config/fishディレクトリの中に書くものは以下のディレクトリに分離・管理して作業します。

.localディレクトリ

ディレクトリの移動 cd → z

z(zoxide)は、cdでディレクトリの移動ができるように、それと同等以上の機能を提供する便利プログラムです。
普通にはWindowsのようにファイルマネージャーで目的のファイルまでダブルクリックでディレクトリを辿っていくわけですが、zfishの環境であれば、慣れればそれよりも速くに目的のディレクトリまで到達できます(ターミナル上の話ですが)。なんせ、1回到達しているディレクトリはz (なにかしら)と入れたらの後enterでそのディレクトリまで到達できるのですから。
サブディレクトリ名が正しければ一発ジャンプも可能です。

インストールは、

sudo pacman -S zoxide

でできます。
他にもfisherというプラグインマネージャーがあります。詳細はリンク先の手順を参考までに。これを使っても同じことですが、システム全体に導入するかfishだけに適用するかの違いでしょうか。

導入できたら、~/.local/fish_conf.d/ディレクトリに01_zoxide.fishを作り、

zoxide init fish | source

と追記します。これでzoxideが有効になるので、

z foo              # foo に一致するディレクトリのうち、最もよく使う場所へ移動
z foo bar          # foo と bar の両方に一致するディレクトリのうち、最もよく使う場所へ移動
z foo /            # foo で始まるサブディレクトリに移動

z ~/foo            # 通常の cd コマンドのようにも使える
z foo/             # 相対パスに移動
z ..               # 1つ上の階層へ移動
z -                # 直前にいたディレクトリに移動

zi foo             # 対話的に候補を選んで移動(fzfを使用)

z foo<SPACE><TAB>  # 補完候補を対話的に表示(zoxide v0.8.0+、bash 4.4+/fish/zsh 限定)

のようなコマンドが使えるようになります。

ファジーファインダ(あいまい検索) fzf

EndeavourOS+Gnome+end-4/dots-hyprland の環境だと多分ですがfzfは既に導入されているかと思います。
もし入っていないようであれば、

sudo pacman -S fzf

としてインストールして、本来は、~/.local/fish_conf.d/02_fzf.fish

fzf --fish | source

とするわけですが、iiの作者の意図としては、場合によってはキーバインドが競合する可能性もあり、最低限の状態にしておいて必要であれば有効にするようにしてあるのではないかと思います。
よって、fzfのキーバインドを使用しないのであれば、02_fzf.fishなどを作らなくてもキーバインド以外の機能は動作します。もし何かが動作しないなどの問題がでてから有効にすればよいのでひとまずは先送りで良いです。

fzfのキーバインドは、ターミナルでダイレクトにCtrl + R(履歴詮索)Ctrl + T(ファイル検索)Alt + C(ディレクトリ移動)などを使用して反応がなかったり、見つからないなどと英語でメッセージが出た場合、もしそれらの利用が必要であるようならば、~/.local/fish_conf.d/02_fzf.fishを上記初期設定通り追加して作って下さい。

z(zoxide)の使い方

最初にSuper + Tでターミナルを開いて、

z quickshell

として実行すると、即座に~/.config/quickshellまで到達したのではないでしょうか?もし到達できないのであれば、順番にディレクトリを辿っていく必要があるのですが、それはzoxideが受動的に到達したディレクトリを記憶しているからです。
たいていはfishの補完機能の方が優秀で、サクッと表示されることが多いかと思います。

~/.config/quickshellに到達した段階で、z <TAB>と半角スペースを開けてTABを押すとサブディレクトリが表示されるはずです。それらは矢印キーで選択できるので、ディレクトリを移動する場合はこれらの方法で次々に移動できますし、最初からサブディレクトリ名がわかっていればそこにジャンプもできます。ただし、ディレクトリの階層違いで名称が重複している場合などもあるのでそのあたりはうまく管理するか、fishの補完機能などをうまく使って移動するとよいかと思います。

さて、~/.config/quickshellに到達し、z <TAB>とすると、

z tab

の画像のような表示があると思います((「z」「半角スペース」「tab」をしてサブディレクトリを表示してtransrateに矢印キーを動かした様子))。このiiがillogical-impulseと言う名称の略になっています。なのでQuickshellについて何かしら修正するのであればこれを選択します。

目的の場所には到達できたので、これで1発で目的の場所まで来れるはずです。例えば、

zでキーワードの一部を入力

まで入れると薄い字で「quickshell」のようになって、「→」を押せば確定されます。しかし、「quickshell」までしか表示されないかも知れません。その後、即座に「/」を入力すれば「z quickshell/ii」と補完されます。ここで再度「→」を押しenterで移動できます。

文字で書くと大げさですが、入力したものは、
「z」「スペース」「q」「→」「/」「→」「(enterキー)」
だけです。これがこれら機能の速さの秘訣です。

「/」を入れず一旦~/.config/quickshell/に移動して、そこで、「z」「スペース」「TAB」と入れればサブディレクトリが表示されるわけですから任意のディレクトリにすぐに移動できると言えるわけです。

使用コード参考例(zoxide + fzf)

zoxideの履歴をfzfに渡して、fzfのインクリメンタルサーチで絞り込み選択されたディレクトリに移動するというようなコードです。~/.local/fish_functions/zf.fishに書きます。

zf使用サンプル

画像は、下記コードを~/.local/fish_functions/zf.fishに書いた後、ターミナルでコマンドをzf quickと入れたものです。quickと言う単語は覚えているけども、全体には、あるいは正確にはどうだっただろう?と曖昧な状態でわかっているキーワードで試したという(テイ)です。

function zf --description 'Find and change directory using zoxide history and fzf'
    set selected (zoxide query -l | fzf --height 40% --reverse)
    
    # 選択があった場合のみ移動
    if test -n "$selected"
        cd "$selected"
    end
end

このコードには欠点というか問題点もあり、zoxideが受動的に到達した事があるディレクトリを履歴で持っていてその候補一覧を入力文字で絞っている点です。候補が表示されるということはzoxideが到達したことのあるディレクトリであるということを示唆しています。
fzfはファジーファインダ(あいまい検索)であり、多くはコマンドに|(パイプ)を通して絞り込んだ結果を渡せる、いわゆるフィルタです。
使い方によってはとても便利ですが、おおよその代用はFishだけで可能なので((補完が強力なので一発で選択できずとも簡単に目的に到達できる))、特別なければならない機能(サンプル)とも言えないと思います。

おそらくは作者がデフォルトでfzfを有効にしていない理由もこのあたりの事情も含まれているのではないかと想像します。

同様に、ファイル検索をするfindの代替であるfdも導入されています。またリスト表示する時にアイコンやツリー表示をするezaも導入されているので敢えて同じような機能を持っているlsdを導入する必要もありません。

アイコン付きリストあるいはツリー表示にする eza

移動した後、そのディレクトリの中にはどういうファイルがあるのかはわかりません。end-4/dots-hyprlandでは、古典的なlsの代わりにRustで作られたezaというのが既に導入されています。
これは、config.fishでエイリアスが登録されていて、従来通りlsと入れるとeza --iconsというコマンドが実行されます。アイコン付きで一覧が表示されるわけです。

ls -lであれば、ファイルのパーミッション(権限)やファイルサイズ、所有者、作成日、ディレクトリあるいはファイル名の一覧が表示されます。
ls -TL 2とすれば、2階層までのツリー表示にもなるはずです。

一覧表示された時に、ディレクトリとファイルが混在して表示されているのに気がつくと思いますが、例えばディレクトリだけ、ファイルだけを表示したいとかとソートしたい場合があると思います。これらは、以下のようなオプションで可能です。

# ディレクトリだけを表示
ls -D

# ファイルだけを表示
ls -f

# ディレクトリを先頭に表示
ls -x --group-directories-first

# ファイルだけを先頭に表示
ls -x --group-directories-last

他にもありますが、こういうコマンドで表示できます。上記例の下2つに-xがついているのは、

dir1  dir2  dir3  dir4  file1  file2 ...

と横並びに表示するためです。--group-directories-firstとか打つのが面倒くさいというのもわかりますが、これらはfishで途中まで入れたら補完できます。しかしこれらは「ディレクトリ/ファイル」の各名称を確認するだけなので、上記例の最初2つ、ディレクトリだけかファイルだけかのいずれかで良いのではないかと。
ディレクトリの移動が目的なら、z <TAB>で確認もできるわけですし、要はファイル名を表示して確認しつつテキストエディターで開くというような使い方ができるわけです。そういった用途が多いのではないかとも。

例を出せば、~/.config/quickshell/ii/に移動しているとして、「nano shell.qml」と太字ぐらいまで入れれば、細字部分が補完されると思います。このようにファイル名でも全部を入れる必要がないのがfishの強力な機能なわけです。

ファイルの内容を確認する cat → bat

catはファイルの中身を確認するためのコマンドですが、batはそれらにシンタックスハイライトなどを適用して見やすくしたりするプログラムです。bat -Aもしくはbat --show-allとすれば改行コードやタブがスペースかtabであるか、本来は見えないものが見えるようにもできます。
tmuxなどのターミナルマルチプレクサでターミナルを分割し、参照元にbatでコードなどを表示しておき、編集先でnanovimなどを使用して修正すると言う事がターミナルだけで完了してしまいます。

ターミナルマルチプレクサは、ターミナルを仮想的に分割・管理するプログラムです。1つのウィンドウ内で複数のシェルを扱え、セッションを切断しても再接続できるため、リモート作業や長時間の処理に便利です。

そこまでするのであれば普通にGUIなテキストエディターを使用したらいいじゃないかと言われるかも知れませんがその場合でも、元のファイルを見本で置いておいて、テキストエディターで修正したりも便利だろうと思います。
そう言う用途の本格的なソフトではスクロールしたらそれぞれの画面が連動したりして見やすくなっているのでそういうのを使用するのが最も良いわけですが、そこまでではない作業などはできるだけサックリと行いたいものです。

こういった場合でも左にターミナルのウィンドウ、右にテキストエディターのウィンドウを並べられ、あるいは即座に左右を入れ替えられるHyprlandはスタック型のウィンドウマネージャよりも使い勝手が良いと思います。そのためにはある程度画面の大きさも必要になると思いますが。

他にも、

# https://github.com/end-4/dots-hyprland/main/README.md を
# batで色分けして見る場合
curl https://raw.githubusercontent.com/end-4/dots-hyprland/main/README.md | bat -l

とした場合、markdown形式のファイルを確認することができます。

batの便利な使い方

githubに訪れずにネット環境があればローカルで更新状況が調べられます。

cd ~/.cache
git clone https://github.com/end-4/dots-hyprland
cd dots-hyprland

で作業フォルダに移動しておき、

git fetch

として最新情報を取得します。この時ローカルは変更しない状態になります。そこで、

git diff HEAD origin/main | bat -l diff

とすると、差分ファイルが表示されます。しかし差分ファイルは差分ブロックに改行が入らないように設計されていますので見にくくさはあります。それでもどこが変更されたのかは確認できると思います。
削除されたものは赤で、追加されたものは緑でなどと環境によって表示の色は変わるかも知れませんがだいたいこのような表示になるのではないかと。

見やすくするには、

# awkを使って Diff Hunk の前に改行と区切り線を追加
git diff HEAD origin/main | awk '/^@@/{print "\n======================"; print} !/^@@/{print}' | bat -l diff

などとすると@@が登場する所に区切り線を入れられるので多少わかりやすくなるかも知れません。

awkはテキストファイルを「行ごと・列ごと」に処理するための強力なツールです。
主に ログ解析・CSV処理・テキスト整形 などに使われます。

これらはシェルスクリプトで関数にまとめて、簡単にも実行できるのですが、順番に内容を書くほうが良いのではなかろうかと敢えて順序を追っています。

後述しますが、fishのスクリプトを書けばii_update_statusとターミナルで入力するだけで、ここまでの手順をまとめてできるようになります。これは実際にend-4のgithubの該当サイトに訪れて、確認すればよりわかりやすくgithubの形式で見れます。しかし、何が更新されたかを確認するのはそこそこ手間であり、自身がRice環境をアップデートする際に、事前に何が更新されるのかを知った上で行う事が大事でもあると思うのです。

その際に、アップデートの内容がわかるかは別の話ですが、例えばコミットのメッセージから何について更新されているのかがわかるだけで何かあった時もどこを修正すればよいかがわかるようになるかもしれません。

batを利用したローカルでリモートの更新状態を確認するコード

これはend-4/dors-hyprland専用ですので注意して下さい。

これまで同様に~/.local/fish_functions/ii_update_status.fishを作り、以下のコードを書きます。

function ii_update_status --description "Fetch dotfile updates and display changes using bat"
    set -l DOTS_DIR $HOME/.cache/dots-hyprland
    
    # 1. 目的のディレクトリに確実に移動
    if not test -d "$DOTS_DIR"
        echo "Error: Dotfiles directory not found. Please clone it first."
        return 1
    end
    cd "$DOTS_DIR"
    
    echo "--- Fetching latest updates from remote ---"
    
    # 2. リモートの最新情報を取得(ローカルは変更しない)
    git fetch
    
    echo "--- Showing differences between local (HEAD) and remote (origin/main) ---"
    
    # 3. ローカルとリモートの差分を、awkで整形し、batでハイライト表示
    # 差分Hunkの前に区切り線(========)を挿入することで見やすくする
    git diff HEAD origin/main | awk '/^@@/{print "\n======================"; print} !/^@@/{print}' | bat -l diff
    
    echo "--- Status check complete. Run 'git pull origin main' to apply changes. ---"
end

これらをターミナルから、

ii_update_status

とすると、自動で作業ディレクトリに移動しgitコマンドで差分を取得、それらをある程度見やすい形で表示するということができるようになります。
これらは内容の確認用なのでファイルの更新は行われませんが、ファイルの更新をするには次を読み進めて下さい。

そして更新するには

ここからファイルを更新するためには、~/.cache/dots-hyprlandにいるのを確認し、

git pull origin main

としてローカルのファイル自体を更新します。リモート(end-4/htprlandのgithub)のコミットを取り込む操作になります。これでローカルは最新の状態になりますから、

./install.sh

とすればHyprland含めquickshellなどの更新が適用されます。

さらに更新を少しだけ楽にする

end-4/dots-hyprlandのアップデートはデフォルトだと、

  1. ~/.cache/dots-hyprlandに移動
  2. git pullしてローカルの各ファイルを最新にする
  3. ./install.shを実行

という手順で行われます。./install.shは対話形式でsudoパスワード確認プロンプト(y/n)などの選択をユーザーに求める部分であるので、面倒ですがこれはセキュリティの観点からも自動化するべきではないため、全自動にすることはしていませんが、この対話部分までを自動化することは可能です。

自動化はできるわけですが、何をインストールするか、あるいは何を削除するかなどのメッセージが書かれているのでそれらをy/n等で選択することになるので、確認を怠らないようにして下さい。

以下のコードは、~/.local/fish_functions/ii_update.fishに書きます。ディレクトリの移動やii_update.fishの作成・編集はThunarなどのファイルマネージャー、テキストエディターで作っても良いですし、

# 作業ディレクトリがないのであれば作っておく(あればこれは飛ばす)
mkdir -p ~/.local/fish_functions

# 作業ディレクトリに移動
# cd ~/.local/fish_functions  #(としても良いですしzで移動しても良い)
z fish_functions

# 移動したらファイルを作成
touch ii_update.fish

とすればディレクトリとファイルが作られます((もっと便利に書けますが手順通りに書いてます))。Hyprland環境でファイルマネージャーとターミナルが画面に表示されているのであればターミナルで実行した結果がすぐファイルマネージャーに反映される((ディレクトリやファイルを作成すればそれがファイルマネージャにも即表示される))ので、後はクリックでファイルマネージャーを辿っていけばよいですし、ファイルマネージャーを操作するのが面倒なら、そのままターミナルで作成したファイルを開いてコードをコピペすることもできます。

nano ~/.local/fish_functions/ii_update.fish

nanoでの貼り付けはCtrl + Shift + Vで、上書き保存する場合はCtrl + Oでエンターで確定です。終了(ターミナルに戻る)は、Ctrl + xで戻ります。

nano はコマンドライン(ターミナル)上で動作するシンプルなテキストエディターで、ファイルの編集・保存・検索などをキーボード操作だけで行うことができます。
vimemacs ほど高機能ではありませんが、操作が直感的で初心者にも扱いやすいのが特徴です。

ターミナルで操作することの記事なのでわざとターミナルの操作を書いていますが、一般的にはファイルマネージャーとテキストエディターでやる方がWindowsと操作が同じなので作業も速いしわかりやすいと思います。
しかしここでもfishの補完機能があればパスの入力などが軽減され、ファイルの場所を指定するパスもだいぶ速く入力できる事もあって、あるディレクトリを開いている状態から目的のファイルを開くのもWindowsと同等かそれ以上の速さで行えると思います。

illogical-impulseの更新を半自動化するコード

function ii_update --description "Update end-4 dots-hyprland repository and run install script"
    set -l DOTS_DIR $HOME/.cache/dots-hyprland
    
    # 1. リポジトリが存在するか確認
    if not test -d "$DOTS_DIR"
        echo "Error: Directory $DOTS_DIR not found. Please clone the repository first."
        return 1
    end
    
    echo "--- 1. Changing directory to dots-hyprland ---"
    cd "$DOTS_DIR"
    
    echo "--- 2. Pulling latest changes from GitHub ---"
    # git pull を実行し、変更を取得
    git pull
    
    echo "--- 3. Running the install script for update ---"
    echo "Please follow the prompts, including password entry and 'y' confirmations."
    
    # 2. install.sh を実行
    # ここでsudoや対話が発生する
    ./install.sh
    
    echo "--- Update process finished. ---"
end

これらはターミナルで

ii_update

と入力・エンターすれば実行されます。fish環境があるので入力補完もあり、コマンドも記憶するので全部を入力する必要もないのではなかろうかと。ただしそのコマンドが何をするコマンドかだけは覚えておく必要があります。

ディレクトリを作成したら即座にその場所にcdするスクリプトを作っておく mkcd

~/.local/fish_functions/mkcd.fishを作り以下のスクリプトを書きます。ここまでを試された方であればfish_functions/ディレクトリはできているでしょうから、zで移動してファイルを作り編集するだけです。あわせてファイルはディレクトリが移動できていれば、

# z fish_functions # で移動してから
touch mkcd.fish    # でも良いですし

# touch ~/.local/fish_functions/mkcd.fish  # とパスを入れても良いです

として(カラ)でファイル名だけつけたファイルを作っておきます。
これをnanoで開いても良いですし、例えばファイルマネージャでThunarを使用しているのであれば~/ディレクトリからでもその画面上で.localとキーボードからダイレクトに入れるとそのディレクトリに移動できます。

fish_functions/ディレクトリは色んなfishのスクリプトを作ったり確認したりがすぐ作業できるように.local/ディレクトリ直下に置いています。

利便性を考えて.localディレクトリ直下に作業ディレクトリを置いていますが、もっとたくさんのファイルがある.configディレクトリからfish/ディレクトリを見つけるような場合に、Thunarのこの機能はすぐに移動ができるのが便利です。

function mkcd --description 'Make directory and change into it'
    # 引数が渡されているかチェック
    if test (count $argv) -eq 0
        echo "Usage: mkcd <directory>"
        return 1
    end
    
    # mkdir -p でディレクトリを作成し、成功したらそのディレクトリに移動する
    # $argv は関数に渡された全ての引数を表します
    if mkdir -p $argv
        cd $argv
    end
end

このコードの使用例としては、前述した、ディレクトリを作成してその下にファイルを作るような場合で、

mkdir -p ~/.local/fish_functions && touch ~/.local/fish_functions/ii_update.fish

と同じパスを繰り返すようなコマンドの時、

mkcd ~/.local/fish_functions && touch ii_update.fish

と同じパスを繰り返さないようにできるようになるので、使う機会は多くはないかも知れませんが作っておけば便利に使えるだろうと思います。

上記例では、ファイルを作る所までやっていますがmkcdは、ディレクトリを作成して即座にそのディレクトリに移動するためのものです。

まとめ

end-4/dots-hyprlandのアップデートやファイル操作を通じてターミナルの操作、主にfishの簡単なサンプルや使い方を書きました。ある意味備忘録でもあります。
本来であれば~/.config/hyprquickshellのファイルにも上書きされて無くなってしまうものがあるのでここらにも手を入れるべきかも知れませんが、これらは注意深く読むとインストール/アップデートの時に削除するかどうかなども行われていたようにも思いますので、未確認ですがもしそのようであれば作者は上書きされることを理解して何かしらの手段を考えている可能性もあるのではなかろうかと思います。

fishの設定などはこの記事で切り分けて作業できるようになったので元の環境に復旧するのは準備さえしておけばすぐできるようになるわけですが、それ以外は注意深くしないと初期化されてしまうので、もし上書きされて設定が消えた場合は、

~/.config/hypr/hyprland/general.confにある、inputの項目を参考に、~/.config/hypr/customgeneral.confに、

input {
    kb_layout = jp
}

env.confに、

env = QT_IM_MODULE, wayland

などを書いたり、keybinds.confなどにファイルマネージャを変更したり、ターミナルを変更したりなどを追記してカスタマイズし、それらが無くなっていないかを確認するようにして下さい。
custom/ディレクトリはおそらく上書き・削除されないだろうと思いますが念の為、確認が必要です。
これら自分で行った設定が無くならなければよっぽどでない限りはそのまま使い続けられると思います。

pacman -Syuなどでシステムを更新するとHyprlandが更新されてRice環境が古いままだとエラーが表示されることがあります。これまではそれら更新があればRice環境も追って対応していますが、場合によってはHyprlandの更新の対応に時間がかかる場合もあるでしょうから、システムのアップデートをする際は十分気をつけて下さい。
事前にend-4/dots-hyprlandのgithubの更新状況を確認するスクリプトを作ったのもそういうことがあるからです。

実際にこの記事内で作成したスクリプトを見てみて、一部ややこしい部分はあるかも知れませんが、基本的には順を追っていっているだけだと思ってもらえればそれでokです。
いちいちターミナルですることをまとめることもできるし、そのいちいちをターミナルでやっても良いわけで、bashだけだと面倒くさいでしょうがfishを使えばそれら面倒な所が楽になると感じてもらえるだけでもこの記事を書いた甲斐があります。

とっかかりが何かしらあればそこから色々理解できることがあると思いますので、それらの役に立てれば幸いです。

blogカテゴリ内のタグ一覧