OSSで端末操作をhackする

私が使っている端末操作を快適にしてくれるOSSを紹介します。

Alacritty

github.com
GPUレンダリングができるterminal emulatorです。
YAMLで設定を記述することができるため、dotfilesとして管理できる点が気に入っています。

インストール

こちらに従いインストールしてください。
私はリポジトリをcloneしてcargoでインストールしました。
github.com

tmux

github.com
terminal multiplexerです。
ペインという単位でウィンドウを分割し、3〜4ペインで作業すると捗ります。
iTermなどと異なり、複数タブを実装しておらず常に1つのタブであることを思想としているようです。

インストール

こちらに従いインストールしてください。
aptやbrewでもインストール可能です。
github.com

カスタマイズ

設定ファイルは~/.tmux.confに記述します。
Ctrl+bがデフォルトですが、Ctrl+jにしておくと左手小指と右手人差し指で押すことができるので便利です。

zoxide

github.com
履歴移動のためのツールです。
後に紹介するfzfを入れることで本領を発揮します。
ziで過去に移動したことのあるディレクトリを選択できます。
選択中に文字をタイプするとファジー検索を行うことができます。

ziによるディレクトリ移動

インストール

curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh

ghq

github.com
GitHubのリポジトリをcloneするとき、ローカルのディレクトリと名前が競合したり、どこにcloneしたのか分からなくなることがよくあります。
ghqを使うと ~/ghq/ にcloneし一元管理するためこのような心配が不要になります。
fzf, cdと組み合わせることによってcloneしたローカルリポジトリを高速に移動することができます。

alias g='cd $(ghq list -p | fzf)'
cloneしたリポジトリへの移動

git cloneの代わりにghq getを使えば良いだけです。

ghq get git@github.com:sharkdp/bat.git

# ghq/{git host}/{developer_name}/{repository_name} にcloneされます
ls ~/ghq/github.com/sharkdp/bat

github.com

インストール

Goでインストールしました。

go install github.com/x-motemen/ghq@latest

fzf

github.com
ファジー検索をするためのツールです。
cdやls, zoxideと組み合わせることでディレクトリの移動や、編集するファイルの選択時に力を発揮します。

ziでディレクトリのファジー検索

インストール

cloneしてインストールをしました。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

ghqとfzfを組み合わせてcloneしてきたgitリポジトリを検索する

aliasを設定します。
Ubuntuの場合は~/.bash_aliasに下記を追加します。

alias g='cd $(ghq list -p | fzf)'

次にghqで適当なリポジトリを2つ以上getしてみます。
今回はbatとripgrepをgetしてみました。

$ ghq get git@github.com:sharkdp/bat.git
$ ghq get git@github.com:BurntSushi/ripgrep.git

すると、~/ghq/に下記のディレクトリが確認できるようになります。

gesogeso@gesogeso ~  $ ls ~/ghq/github.com/
📂 BurntSushi  📂 sharkdp
gesogeso@gesogeso ~  $

これで面倒なcloneしたディレクトリ間の移動が簡単になりました。

oh-my-posh

github.com
Go言語製のプロンプトをリッチにするツールです。
通常プロンプトの設定は~/.bashrcなどでPS1という環境変数をカスタマイズしますが、oh-my-poshを使うとJSONで設定ファイルを書くことができます。
既存のテーマが豊富に用意されているのでこの中から選ぶも良し、自分でカスタマイズするも良しです。
ohmyposh.dev

oh-my-poshでvenvをactivate

インストール

curl -s https://ohmyposh.dev/install.sh | bash -s

ohmyposh.dev

lsd

github.com
lsコマンドをリッチにしたものです。
ファイルタイプに応じたアイコンを表示することができます。
アイコン表示をするためにはNerd Fontsというフォントを入れておく必要があります。
www.nerdfonts.com
memo.geso.site

lsd

インストール

cargoによるインストールが楽そうです。

cargo install --git https://github.com/lsd-rs/lsd.git --branch master

github.com

ranger

github.com
rangerとはPythonで書かれたコンソールベースの軽量ファイルマネージャです。
vimのキーバインドで操作ができ、テキストファイルをプレビューすることが可能です。
プラグインを入れて拡張することで画像などの表示にも対応できるようです。
私のrangerはこのようになっています。

インストール

Ubuntu22.04 LTSの場合は下記の通りに、ソースからインストールしました。

git clone https://github.com/hut/ranger.git
cd ranger
sudo make install

Macの場合は、Python仮想環境でranger-fxをインストールしてからbrewでインストールしました。

brew install ranger

# .venvはpython -m venv .venvで作成してください
source ~/.venv/bin/activate
(.venv) sudo pip install ranger-fm

mkaschke.medium.com

カスタマイズ

scope.shというShell Scriptを編集することで、右画面に出てくるファイルの表示をカスタマイズ出来ます。
github.com
tmux上で動かすとカラーが対応していなかったので、.tmux.confをカスタマイズする必要がありました。

ranger
scope.shを編集するとcsvやsqliteファイルを見れるのが嬉しい

memo.geso.site

broot

github.com
こちらもrangerと同じく端末上で動くファイルマネージャーです。
treeコマンドのように表示し、上下カーソルでファイルを選択することができます。

broot
broot -sdp

インストール

こちらに従ってください。
私はリポジトリをcloneしcargoでインストールしました。
dystroy.org

tokei

github.com
wc -lを詳細にしてくれるツールです。
ファイルの種類と、各種のファイル数、行数、コードの行数、コメントの行数、空白行数を表形式で表示してくれます。

tokei

インストール

cargo install --git https://github.com/XAMPPRocky/tokei.git tokei

delta

github.com
deltaとはdiffを分かりやすくする表示してくれるツールです。
diffだけではなく, git diff, git grep, git blameなどgitの表示にも対応しています。
私は主にdeltaのwrapperであるgit diffに使っており, deltaを用いると下記のような表示になります。
左右分割表示ができ、GitHubでの差分表示を端末上でも再現することができます。

git-deltaのインストール

# ubuntu
cargo install git-delta

# mac
brew install git-delta

カスタマイズ

.gitconfigに下記の設定を追記します。

# https://github.com/dandavison/delta
# fdfcc8fce30754a4f05eeb167a15d519888fc909
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true    # use n and N to move between diff sections
    light = false      # set to true if you're in a terminal w/ a light background color (e.g. the default macOS terminal)
    side-by-side = true
    line-numbers = true

[merge]
    conflictstyle = diff3

[diff]
    colorMoved = default

基本的にはリポジトリのREADMEに書いてあるもので十分ですが、下記2行のみは自身で設定しました。

side-by-side = true  # diffを左右に表示します
line-numbers = true  # 行番号を表示します

bat

github.com
catコマンドよりリッチにファイルを表示できます。
行数の表示や、コードのカラー表示をしてくれます。

batによるRustファイルの表示

インストール

ghq get git@github.com:sharkdp/bat.git
cd ~/ghq/github.com/sharkdp/bat/

# install
cargo build --bins
cargo test
cargo install --path .

aliasを設定します。
~/.bash_aliasに下記を追記します。
paging=neverのオプションを付けると同じプロンプト内でテキストが表示できます。

alias cat='bat --paging=never'

下記のようにシンタックスハイライトされて出力できるようになりました。

カスタマイズ

configuration fileの作成

gesogeso@gesogeso ~/ghq/github.com/sharkdp/bat (master) $ bat --generate-config-file
Success! Config file written to /home/gesogeso/.config/bat/config

~/.config/bat/configを下記のように変更してみました。

# bat --list-themes
#--theme="TwoDark"
--theme="Dracula"
--paging=never
--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"

config fileを反映する方法としては、下記のコマンドを実行します。

bat --config-file

参考
github.com

mcfly

github.com
コマンド履歴からコマンドの候補を表示してくれます。
Ctrl-Rで候補を示してくれます。

mcflyで過去に使ったコマンドの検索

インストール

# mac
brew install mcfly
echo 'eval "$(mcfly init bash)"' >> ~/.bashrc

ugrep

ugrepはgrepを強化したもので、正規表現での検索を高速に出来るツールです。
-Qオプションで、検索専用の画面を表示できます。
github.com
uggit grepのように検索ワードを含んだファイルと行番号を検索することができます。
git管理されていないディレクトリに対しても正規表現で検索することが可能です。

ugrep

インストール

ghq get git@github.com:Genivia/ugrep.git
cd ~/ghq/github.com/Genivia/ugrep
./build.sh
sudo make install

使い方

下記のように正規表現マッチングを行うことができます。

ug -Q