❤️動機
zoxideもいい感じだけど、アルゴリズムが少しキモと思ってしまったので、
ChatGTPを先生としてOleOleブックマークを作ってみた。
✅ 概要
WezTerm 上でよく使うディレクトリをブックマークとして管理し、fzf
を使って選択・移動できるようにする便利な仕組みを構築します。Zsh 関数で bm
コマンドを作り、次の機能を提供します。
-
bm
:ブックマーク一覧から選択してcd
(fzf プレビュー付き) -
bm -a
:現在のディレクトリをブックマークに追加 -
bm -d
:選択してブックマークを削除 -
bm -e
:VS Code でブックマークファイルを編集
📁 ディレクトリ構成(推奨)
~/.config/bookmark/
├── .bookmark # ブックマークデータ (JSON)
├── saveBookmark.sh # 追加用スクリプト
├── bm.sh # bm 関数本体
🧠 .bookmark
の形式(JSON)
{
"dotfiles": "/Users/yourname/.dotfiles",
"project": "/Users/yourname/dev/myproject"
}
🛠 saveBookmark.sh
(ブックマーク追加スクリプト)
#!/bin/bash
BOOKMARK_FILE="$HOME/.config/bookmark/.bookmark"
mkdir -p "$(dirname "$BOOKMARK_FILE")"
current_path=$(pwd)
key=$(basename "$current_path")
# ファイルが存在しなければ空の JSON オブジェクトを書いておく
if [[ ! -f "$BOOKMARK_FILE" ]]; then
echo '{}' > "$BOOKMARK_FILE"
fi
# jq で追加・上書き
updated=$(jq --arg key "$key" --arg path "$current_path" '.[$key] = $path' "$BOOKMARK_FILE")
# 保存
echo "$updated" > "$BOOKMARK_FILE"
echo "✅ Saved bookmark: $key → $current_path"
🚀 bm.sh
(Zsh 関数)
function bm() {
local bookmark_file="$HOME/.config/bookmark/.bookmark"
local save_script="$HOME/.config/bookmark/saveBookmark.sh"
local editor="code" # VS Code
case "$1" in
-a)
bash "$save_script"
;;
-d)
if [[ ! -f "$bookmark_file" ]]; then
echo "❌ No bookmarks to delete."
return 1
fi
local selected=$(jq -r 'to_entries[] | "\(.key):\(.value)"' "$bookmark_file" | \
fzf --prompt="🗑 Delete bookmark > " --preview="ls -la $(echo {} | cut -d ':' -f 2-)" --preview-window=right:60%)
if [[ -n "$selected" ]]; then
local key="${selected%%:*}"
local updated=$(jq "del(.\"$key\")" "$bookmark_file")
echo "$updated" > "$bookmark_file"
echo "🗑 Deleted bookmark: $key"
fi
;;
-e)
$editor "$bookmark_file"
;;
*)
if [[ ! -f "$bookmark_file" ]]; then
echo "❌ No bookmark file found."
return 1
fi
local selected=$(jq -r 'to_entries[] | "\(.key):\(.value)"' "$bookmark_file" | \
fzf --prompt="📁 Bookmark > " --preview="ls -la $(echo {} | cut -d ':' -f 2-)" --preview-window=right:60%)
if [[ -n "$selected" ]]; then
local dest="${selected#*:}"
cd "$dest"
fi
;;
esac
}
🔧 .zshrc
で読み込む
source ~/.config/bookmark/bm.sh
✅ 利用例
bm # fzfで選んでcd
bm -a # 追加
bm -d # 削除
bm -e # エディタで編集(VS Code)
ChatGTPここまで
🏁 感想
この記事完成まで込みでかかった時間は、だいたい半日ぐらい。
時間がかかった原因は、全てをWezTerm.lua内で、完結させよと粘ったため。
もちろん記事作成もChat GPTさんに頼みました。
その影響で、タイトルにWezTermが入っていますが、中身は、普通にシェルスクリプトです。
で、今後の展望としては、初心貫徹、WezTermでキーバインドを設定すること。
できれば、もっとかっこいいと思うんだけど。今回は、ここまで。
? 追記
ここ動かないという指摘がありましたら、chat GPTさんに直させます。