【Rust】ディレクトリをブックマークするCLIツールを作ってみた
はじめに
ターミナル上でよく使うディレクトリをブックマークして管理するコマンドラインツールを作ってみたので、紹介します。
動機としてはターミナル上での移動が面倒だったからです(ある程度の補完は効く環境にはなっているのですが、それでも時々あのディレクトリのパス何だっけ、と考えながら入力するハメに……)。
それと、RustでCLIツールを作ってみたかったからです(重要)。
インストール
cargo install bookmark-cli
機能
できること
シンプルで基本的な機能のみを提供しています。
できることはブックマークの追加・検索・一覧表示・削除だけです。
検索の実行時にはfuzzy検索による絞り込みができます。
同様に、削除の際にも対象ブックマークをfuzzy検索で探すようにしています。
イメージ:
できないこと
このツール単体でブックマークに移動することはできません。ブックマークへの移動は、cd コマンドと組み合わせて行います。
基本的な使い方
ブックマークの追加(パスを指定しない場合はカレントディレクトリを追加)
bm add [ディレクトリの絶対パス]
ブックマークの検索(プロンプトが表示され対話的に検索)
bm search
ブックマークの一覧表示
bm list
ブックマークの削除(プロンプトが表示され対話的に削除)
bm delete
ブックマークへの移動
先ほど述べた通り、ディレクトリの移動を行うためにはこのツール以外のものと組み合わせる必要があります。
例として、検索結果のブックマークに移動するzshの関数のサンプルを挙げます。
これを~/.zshrc
などに追加してsource ~/.zshrc
を実行すると、cb
が叩けるようになります。cb
を叩くとbm search
が呼ばれ、選択されたブックマークにcd
で移動する、という仕組みです。
function cb() {
local -r dir=$(bm search)
if [ -z "$dir" ]; then
return 1
fi
cd "$dir" || return 1
}
なぜツール内で移動しないかというと、ツール内でcd
を実行してもツール終了時にサブシェルも終了して元のディレクトリに戻ってしまうためです。
使用技術
Rustで書いています。使用した主なクレートは以下の通り:
RustのCLIルール作成用クレートです。
サブコマンドの作成、コマンドライン引数のパース、ヘルプの生成など、CLIツールを開発する時にあると嬉しい機能が一通り揃っています。
対話的なインターフェースを構築するクレートです。
Fuzzy検索を非常に簡単に実装できました。感謝。
まとめ
類似のツールはいくつかありそうですが、作りたかったので作ってみました。
シンプルに保ちたいので機能追加はあまりする予定がありません。とはいえ、現状では絶対パスでの登録のみなので、タグ付け機能くらいは実装しても良いかな……と考えています。
とりあえず人様にお見せできる程度のツールができそうだったので、ちゃんとREADMEを書いてcrates.io
に公開しました。他人の目があると思うと少しは気合が入るものですね。
Discussion