#
name

ok
dd
..
  • ,
..
.
..
© Copyright 2023 joppot. All rights reserved.

macのzshでよく使うディレクトリをブックマークするコマンドを自作

#
zsh
#
mac
2026年1月14日
thumbnail

概要

開発していると、あっちこっちにプロジェクトが散在するようになります。
ターミナルで移動する度に長いパスをcdで入力するのはかなり面倒です。
この記事では、よく使うディレクトリを登録し、素早くアクセスできる環境を構築する方法を紹介します。
以下の3つのコマンドに加えてcdを上書きする方法も紹介します。
  • bookmark: 現在のディレクトリを~/.bookmarks/@{name}というシンボリックリンクとして作成
  • goto: CDPATHを活用して、ブックマークされたディレクトリへ素早く移動
  • showbookmarks: 登録されているすべてのブックマークを一覧表示
  • cd: cd -Pのエイリアスとして設定し、シンボリックリンク先の物理パスに移動。cdを上書きしたくない場合はgotoを使う
ブックマークにはシンボリックリンクを使うので、特別何かをインストールする必要はありません。

完成品のコード

.zshrc(またはシェル設定ファイル)に以下のコードを追加します。
if [ -d "$HOME/.bookmarks" ]; then
    export CDPATH=".:$HOME/.bookmarks:/"
    alias cd="cd -P"

    # gotoを関数として定義(補完を効かせるため)
    goto() {
      cd -P "$@"
    }

    bookmark() {
      local bookmark_name="@${1:-$(basename "$PWD")}"
      local target_dir="$PWD"
      local bookmark_path="$HOME/.bookmarks/$bookmark_name"

      if [ -L "$bookmark_path" ] || [ -e "$bookmark_path" ]; then
        echo "Bookmark '$bookmark_name' already exists"
        return 1
      fi

      ln -s "$target_dir" "$bookmark_path"
      echo "Bookmarked: $bookmark_name -> $target_dir"
    }

    showbookmarks() {
      if [ ! -d "$HOME/.bookmarks" ]; then
        echo "No bookmarks directory"
        return 1
      fi

      local bookmarks_found=0
      for link in "$HOME/.bookmarks"/*; do
        if [ -L "$link" ]; then
          bookmarks_found=1
          local name=$(basename "$link")
          local target=$(readlink "$link")
          printf "%-20s -> %s\\n" "$name" "$target"
        fi
      done

      if [ $bookmarks_found -eq 0 ]; then
        echo "No bookmarks registered"
      fi
    }
fi

# gotoとcdコマンドの補完(globパターンで直接指定)
# goto: bookmarksディレクトリのみ
compctl -/ -W ~/.bookmarks goto

# cd: 通常のディレクトリ + bookmarksディレクトリ
compctl -/ + -W ~/.bookmarks -/ cd
macのターミナルアプリケーションがzshを使用している場合(macOS Catalina以降はデフォルト)、.zshrcに追加するだけで動作します。

セットアップ

最初にホームディレクトリに.bookmarksフォルダを作成します。 このフォルダがない場合、上のzshスクリプトはbookmark関連の設定を読み込みません。
mkdir ~/.bookmarks

bookmarkコマンドの使い方

ブックマークしたいディレクトリに移動して、bookmarkコマンドを実行します。
第一引数を与えない場合は、カレントディレクトリ名がブックマークの名前になります。
cd ~/Documents/blog
bookmark  # @blogというブックマークが作成される
引数を指定すると、その名前がブックマークの名前になります。
cd ~/my-important-project
bookmark myproject
~/.bookmarks/@myprojectというシンボリックリンクが作成されます。

gotoコマンドの使い方

ブックマークされたディレクトリへ素早く移動します。
goto @myproject
CDPATHに.bookmarksが含まれているため、@で始まる名前を指定するだけで、自動的に.bookmarksディレクトリ内が検索されます。

cdコマンドでブックマークに移動

cdコマンドのエイリアスがcd -Pに設定されているため、cdでもブックマークに直接移動できます。
cd @myproject
# または
cd @blog
cdを上書きしたくない場合は.zshrcのcdをコメントアウトしてgotoを使ってみてください。

zshでの補完設定

zshを使用している場合、以下を.zshrcに追加することでブックマーク名の補完が機能します:
# gotoとcdコマンドの補完(globパターンで直接指定)
# goto: bookmarksディレクトリのみ
compctl -/ -W ~/.bookmarks goto

# cd: 通常のディレクトリ + bookmarksディレクトリ
compctl -/ + -W ~/.bookmarks -/ cd
こうすることで、goto @と入力した後にTabキーを押すと、登録されているブックマークが補完されます。

showbookmarksコマンドの使い方

登録されているすべてのブックマークを一覧表示します:
showbookmarks
出力例
@blog               -> /Users/alice/Documents/blog
@myproject          -> /Users/alice/my-important-project

ブックマークの削除

ブックマークを削除する場合は、以下のコマンドで対象のシンボリックリンクを削除してください:
rm ~/.bookmarks/@myproject

まとめ

bookmarkとgotoを使えば、長いパス入力が不要になり、移動のストレスがかなり軽くなります。 zshのスクリプトとシンボリックリンクだけで動くので、外部ライブラリもなくセキュアです。 ぜひ活用してみてください。

参考文献

https://dev.to/threkk/how-to-use-bookmarks-in-bash-zsh-57a7
© Copyright 2023 joppot. All rights reserved.