🐈

bash_itをフォークしてdotfilesにする

2023/11/12に公開

はじめに

CLIをよく使う方だとdotfilesを管理&運用していることも多いと思います。今回はbash_itというbashのフレームワークをフォークして、オリジナルのdotfilesに仕立て上げる方法について書きます。

注意:bashのフレームワークをベースにしているので、環境に応じてzshやfishを使い分けている方には本記事の内容は合わない可能性が高いです。

bash_itとは?

https://github.com/Bash-it/bash-it

bashのフレームワーク。oh-my-zshを使ったことがある方であれば、それのbash版と思えばOK。bash_itを使うとプロンプト表示やエイリアスや補完を簡単に管理できます。

参考:テーマ設定の仕方(本記事ではテーマ設定については解説しません。)

https://befool.co.jp/blog/jiska/use-bash-it/

なぜbash_itをdotfilesのように使うのか?

玄人は別として、dotfilesをはじめたての人の多くに「ベストプラクティスがわからない」というものがあります。ネットで「dotfiles」と検索すると、様々な人がdotfilesを紹介しています。(それがdotfiles文化の良いところなのですが、)始めた手の人は、結局どのようにして管理して良いか分からないという事態に陥りがちです(ソース:ぼく調べ)

そこで、bash_itのようなそこそこ普及しているbashのフレームワークに備わっている仕組みを利用することで、そこそこ多くの人にとってそこそこ使いやすいdotfilesを簡単に構築するという狙いがあります。

bash_itの使い方

bash_itには様々なプラグインが標準装備されています。

プラグインにはaliases, completion, pluginsの3つのカテゴリがあります。(プラグインのカテゴリにpluginがあるのが少しややこしいですね)

利用可能なプラグインの一覧は次のコマンドで確認できます。(次のコマンドはalasesカテゴリのプラグイン一覧を表示しています。結果は一部省略しています。)

$ bash-it show aliases
Alias                Enabled?   Description
apt                  [ ]        Apt and dpkg aliases for Ubuntu and Debian distros.
atom                 [ ]        Atom.io editor abbreviations
bash-it              [ ]        Aliases for the bash-it command (these aliases are 
clipboard            [ ]        xclip shortcuts
composer             [ ]        common composer abbreviations
curl                 [ ]        Curl aliases for convenience.
dnf                  [ ]        dnf aliases for fedora 22+ distros
docker               [ ]        docker abbreviations
docker-compose       [ ]        docker-compose abbreviations
emacs                [ ]        emacs editor
fuck                 [ ]        fuck/please to retry last command with sudo
general              [x]        general aliases
git                  [ ]        common git abbreviations
gitsvn               [ ]        common git-svn abbreviations
(その他多数)

一般的によく使われているエイリアスはデフォルトで入っています。(ここに入っていないものは自分で追加していく必要があります。それは記事の後半で解説しています。)

プラグインを使うためには、プラグインを有効化する必要があります。

次のコマンドで有効化できます。(ここではaliasesgitを有効化しています。)

$ bash-it enable alias git
$ source ~/.bashrc  (←.bashrcを再読み込みして反映)

これでgitプラグインが有効化されました。

alias->gitプラグインは次の内容が含まれています。

alias g='git'
alias ga='git add'
.
.
大量のエイリアス定義
.
.

試しにターミナルで'ga'と打ってみてください。git addコマンドが走ると思います。

bash_itの構造

bash_itのファイル構造は↓のようになっています。(今回の記事で解説しないファイルは省略しています。)

.
├── aliases
├── bash_it.sh
├── completion
├── plugins
└── vendor

それぞれのファイルの役割を簡単に解説します。

bash_it.sh

ターミナルでbash-it xxx yyyと打った時にこのファイルが実行されます。bash_itの詳しい実装を追っていくときは、このファイルを読み進めることになります。

aliases, completion, plugins

これらは、プラグインを格納するディレクトリです。カテゴリに応じてファイルの格納先が分かれています。

たとえば先ほどのaliasカテゴリのgitプラグインは下記の場所に定義されています。

$ cat aliases/available/git.aliases.bash | head -n 20
# shellcheck shell=bash
about-alias 'common git abbreviations'

alias g='git'
alias get='git'

# add
alias ga='git add'
alias gall='git add -A'
alias gap='git add -p'
alias gav='git add -v'

# branch
alias gb='git branch'
alias gba='git branch --all'

bash_itに新たにプラグインを追加する

新しくプラグインを作成してみましょう。

次のファイルを作成してください。

aliases/availables/ls.aliases.bash

about-alias 'aliases for ls command'

alias ll='ls -l'

これでlsというエイリアスを作ることができました。

bash-it show aliasesと打つと、lsがプラグイン一覧に追加されているはずです。

有効化してみましょう

$ bash-it enable alias ls
$ source ~/.bashrc

llコマンドが機能すれば成功です

もう一つプラグインを作成してみる

今度はもう少し実用的なプラグインを作成してみましょう。

pnpmというJavascriptのパッケージ管理コマンドを設定するプラグインを書いてみましょう。(ここでは詳しいpnpmの効果は知らなくてもOKです。)

cite about-plugin
about-plugin 'setup pnpm'

if [[ -d "$HOME/.local/share/pnpm" ]]; then
  export PNPM_HOME="$HOME/.local/share/pnpm"
  export PATH="$PNPM_HOME:$PATH"
fi

ソースコードの詳しい意味がよく分からない場合はChatGPTに聞いてください。

有効化しましょう

$ bash-it enable plugin pnpm
$ source ~/.bashrc

pnpmコマンドが使えるようになれば成功です。

ここまでの内容で、自由にプラグインを作成できるようになりました。

bash_itに足りない機能があればどんどん追加していきましょう。

vimrcをbash_itで管理する

次は、.vimrc.tmux.confなどのファイルを含むものをどうbash_itで扱うか解説していきます。

今回は.vimrcbash_itで管理してみましょう。

まず、.vimrcファイルの置き場です。

どこに置くのが良いでしょうか?

1つは、pluginsディレクトリの中に直接ファイルを置ことです。

$ cd plugins/available/
$ ls vim.plugin.bash
vim.plugin.bash
$ ls vim/**
.vimrc
.vim/autload
.
.
.

少しpluginsディレクトリが散らかりますが、うまく機能します。

もう1つはvendorディレクトリを利用することです。(筆者はこの方法を利用しています。)

.bash_it/vendor/github.com/{自分のgithubのユーザー名}のようなディレクトリを作成し、その中に自由にファイルを置きます。(vendorディレクトリはbash_itではメンテナンスしていないが便利な機能が格納されているディレクトリです)

筆者はvendorの中にvimtmuxの設定ファイルを置いています。

詳しくは↓を参照ください。

https://github.com/ppdx999/bash-it/tree/master/vendor/github.com/ppdx999

そしてplugins/available/vim.plugin.bashに次のような内容を書いています。

cite about-plugin
about-plugin 'Vim plugin for bash'

# BASH_ITという変数でbash_itのルートディレクトリが取得できます。
VIM_DIR="${BASH_IT}/vendor/github.com/ppdx999/vim"
mkdir -p "$HOME/.vim/autoload"

# vendor配下のvimrcを`~/.vimrc`に配置するためのエイリアス
alias apply-vim-conf='cp ${VIM_DIR}/.vimrc ${HOME}/.vimrc && cp ${VIM_DIR}/plug.vim ${HOME}/.vim/autoload/plug.vim'

# vendor配下のvimrcを編集するためのエイリアス
alias edit-vim-conf='vim ${VIM_DIR}/.vimrc'

ここは正直自由なので、どこでも良いと思います。~/.vimrc~/.vimにシンボリックリンクをはるでも良いと思います。

環境を再構築する

bash_itは起動時にenabledディレクトリの配下にあるファイルを有効化するという仕組みで動いています。

そのため、現在のシステム環境で有効化されているプラグインの一覧はenabled直下のファイルを見ればわかります。

逆に言えば、新しく環境を再構築するときは、enabledディレクトリに有効化したいプラグインのシンボリックリンクをはるコマンドを作成しておき、それを実行すれば良いです。

環境に合わせて起動するプラグインを自由に組み替えましょう。

最後に

bash_itのコア部分をPOSIX Shell互換に書き直して、bashやzshすらもプラグインとして扱えるようにすれば、dotfilesの移植性がより高まると思うので、いつかやってみたい。

Discussion