🔧

【Rust】ディレクトリをブックマークするCLIツールを作ってみた

2024/09/23に公開

はじめに

ターミナル上でよく使うディレクトリをブックマークして管理するコマンドラインツールを作ってみたので、紹介します。

https://github.com/iced-penguin/bookmark-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で書いています。使用した主なクレートは以下の通り:

clap - Rust

RustのCLIルール作成用クレートです。
サブコマンドの作成、コマンドライン引数のパース、ヘルプの生成など、CLIツールを開発する時にあると嬉しい機能が一通り揃っています。

dialoguer - Rust

対話的なインターフェースを構築するクレートです。
Fuzzy検索を非常に簡単に実装できました。感謝。

まとめ

類似のツールはいくつかありそうですが、作りたかったので作ってみました。
シンプルに保ちたいので機能追加はあまりする予定がありません。とはいえ、現状では絶対パスでの登録のみなので、タグ付け機能くらいは実装しても良いかな……と考えています。

とりあえず人様にお見せできる程度のツールができそうだったので、ちゃんとREADMEを書いてcrates.ioに公開しました。他人の目があると思うと少しは気合が入るものですね。

Discussion