fzfを使いMacのアプリを簡単に起動する


前提条件

  • macOS 11.4
  • bash 4.4.12
  • fzf 0.17.1

ターミナルから(一般的な方法)

 Macでターミナル(端末エミュレータ)を使い込んでいくとGUIアプリをコマンドラインで起動したいと考えないだろうか。
(GUIアプリを起動したしても、その操作はマウスを使わなければならない。すくなくともターミナルで引きこもりたい人間からすれば相当気持ち良いはずである。)
 MacのGUIアプリは以下のコマンドで起動できる。

> open -a <アプリの名前>

 システム環境設定の場合、以下のようになる。

> open -a "System Preferences"

 .bashrcに以下の記述しエイリアスを作成し、

.bashrc
alias syspref='open -a "System Preferences"'

 タイプ数を短くしてもよい。

> syspref

 上記方法はタイプ数も多く、エイリアスを張ったとしてもあまりスマートでない。とはいえ、アプリ起動するのに専用のランチャーアプリの導入をするのには躊躇いがある。

選択的インターフェイス

 ターミナルを使っている方には選択的インターフェイスを提供する(easy finder)というジャンルのソフトを利用している方もいるのではないだろうか。ディレクトリパスを移動したり特定のファイルを書き換えたり、なにかと便利である。
 以下のスクリプトを.bashrcに加えると簡単に選択的インターフェイスを使ったランチャーが実現できる。

.bashrc
  # app - osx appluncher
  app() {
    app_path=$(find /Applications -maxdepth 3 -type d  | grep '\.app$' | sed 's/\/Applications\///' | sed 's/\.app$//' | fzf --query="$1" --prompt="App > " --exit-0)
    if [ -n "$app_path" ]; then
      open -a "/Applications/$app_path.app/"
    fi
  }

最近の macOS ではフォルダの構成が変わっているため以下のほうが使いやすいかもしれない

.bashrc
  app() {
    sapp_list=$(find /System/Applications -maxdepth 3 -type d |
                 grep '\.app$' |
                 sed 's/\/System\/Applications\///' |
                 sed 's/\.app$//' |
                 sed 's/^/S::/')
    aapp_list=$(find /Applications -maxdepth 3 -type d |
                 grep '\.app$' |
                 sed 's/\/Applications\///' |
                 sed 's/\.app$//' |
                 sed 's/^/A::/')
    uapp_dest="/Users/$(whoami)/Applications"
    uapp_dest_sed="s/\/Users\/$(whoami)\/Applications\///"
    # echo $uapp_dest_sed
    uapp_list=$(find $uapp_dest -maxdepth 3 -type d |
                 grep '\.app$' |
                 sed $uapp_dest_sed |
                 sed 's/\.app$//' |
                 sed 's/^/U::/')
    # echo -e $uapp_list
    app_path=$(echo -e "$sapp_list\n$aapp_list\n$uapp_list" | fzf --query="$1" --prompt="App > " --exit-0)
    if [ -n "$app_path" ]; then
      open_path_u="s/U::/\/Users\/$(whoami)\/Applications\//"
      open_path=$(echo "$app_path" |
                    sed 's/S::/\/System\/Applications\//' |
                    sed 's/A::/\/Applications\//' |
                    sed $open_path_u)
      # echo $open_path
      open -a "$open_path.app"
      # preventing open command returns not 0
      :
    fi
  }

 上記設定を行うと、

> app

と入力すれば以下のようなインターフェイスで、アプリが起動できる。

補足

 fzf以外の選択的インターフェイスを実現する方法でも同様のことが実現できる。

fzf:https://github.com/junegunn/fzf