0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WezTerm × fzf でOleOleのディレクトリブックマーク管理システムを構築する

Last updated at Posted at 2025-04-10

❤️動機

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さんに直させます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?