😸

Terminalで毎回同じようなコマンドを入力してませんか?

2022/01/19に公開

多分誰得でもない自分だけのtipsだけど。

シナリオ

このアプリを開発するには、まず

    cd A
    cd B
    ls
    npm install 
    less package.json
    npm run dev

よし開発しよー

となる人が多いと思うのですが

開発するまで叩くコマンドが短いほどいいですよね。あとは、よく使うコマンドなどはちゃんとストックしておくことで、コマンドを忘れてググって調べてコマンドを実行するみたいな手間を省くことができます。

fuzzy finderという選択肢とfzfコマンド

fuzzy finderはあいまいな検索のことですね。曖昧な検索をして最終的に目的にするものまでたどり着けることが重要だと思います。感覚的には検索を絞り込んで最終的に一件を選んでいくようなフローと同じです。対象がコマンドやファイルなので文字列で絞り込んでいくことになります。

fzf の install

golangで作られているので、いろんな環境で動くこと思うので下記のリンクから対象の方法を探してインストールします。

https://github.com/junegunn/fzf

macであればbrewをつかってインストールで問題ありません。

brew install fzf

過去のコマンドをあいまい検索+キーバインドの設定で素早い呼び出し: fhistory

ctrl + rで以前使ったコマンドをあいまい検索で調べられます。ただそれでは物足りないのでfhistoryというコマンドを作って、shellのctrl + rを上書きします。

fhistory() {
  command=$( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
  # pbcopyは受け取った標準出力をクリップボードにコピーするための機能です。
  echo $command | pbcopy
}

# zsh line editor でfhistoryをzle ウィジェットとして登録
zle -N fhistory
bindkey '^r' fhistory

上記を.zshrcに追加して下記のコマンドで再読み込みを行ってください。

source ~/.zshrc

terminalでctrl+rを実施して文字列を入力してエンターをしてください。クリップボードにコピーされるのでctrl+vで貼り付けて実行してみてください。

ここでみそなの一度クリップボードに保存することです。これは、コマンドそのまま使うこともあれば、それと同じくらいちょっと修正することがあるのでクリップボードにある方が使い勝手がいいのです。

開発系のディレクトリを絞り込んでvscodeで開く: fcd

cdをfuzzy findしつつ、最終的にはvscodeで開くか訪ねます。というのも私の行動履歴をたどるとほとんどvscodeでひらいていたのでそういうコマンドを作ることにしました。まずは、設定ファイルを用意します。fcdというプレフィックスとよく開くディレクトリを絶対パスで記載してください。

$ touch ~/.project
$ cat ~/.project
fcd /users/${あなたのユーザー名}/workspace/
fcd /users/${あなたのユーザー名}/workspace/public-template
fcd /users/${あなたのユーザー名}/workspace/aws_second_docs

.zshrcにfcdのコマンドを記載します。

fcd() {
    local dir
    dir=$(grep -e '^fcd [^*]' ~/.project | cut -d ' ' -f 2- | fzf)
    cd "$dir"
    echo -n "Open in VsCode (y/n)? "
    read answer
    if [ "$answer" != "${answer#[Yy]}" ] ;then
      code "$dir"
    else
        echo No
    fi
}

~/.zshrcを読み込み直して、コマンドを入力してください。

fcd

Makefileのコマンドをあいまい検索してコマンド実行: fmake fmakel

Makefileにはそのプロジェクトで必要な便利コマンドを配置すると思うのですが、ファイルの中身をみないとなんていうmakeコマンドがあるのかわからない。ということがあります。ただしファイルを開いてしまっては負けです。時間がかかります。

fmakeコマンドは、自分がよく使うコマンドをMakefileに配置しておいてそのコマンドを実行する方法です。

fmakelコマンドは、fuzzy finde make local のような意味で自分が今いるディレクトリのMakefileのコマンドを実行する方法です。

fmakel(){
    command=$(cat ./Makefile | grep : | grep -v ^#|   sed  -e s/://g | awk '{ print $1  }'| fzf)
    if [ -z "$command" ]; then

    else
      make $command
    fi
}

fmake(){
    cd $HOME/dotfiles
    command=$(cat $HOME/dotfiles/Makefile |  grep -v "^#"| grep ":\s"|  awk '{ print $0  }'| sed  -e s/:// | fzf | tr '#' ' ' | awk '{print $(1)}')
    if [ -z "$command" ]; then
      cd -
    else
      make $command && cd -
    fi
}

fmakeコマンドはHOME/dotfilesディレクトリとHOME/dotfiles/Makefileのファイルが存在することが前提なので、よく使っている便利コマンドを配置しているMakefileがあればそちらのパスを参照させてください。

各種データベースの接続をあいまい検索する: fdb

開発をしていると複数のデータベースに接続する必要があることがあります。GUIアプリケーションは、cliで対応すると面倒なときにつかいましょう。立ち上げるのが面倒ですし時間がかかります。

fdb pgcli postgres://postgres:postgres@localhost:5432/dvdrental
fdb pgcli postgres://postgres:postgres@test-dabase.com:5432/dvdrental
fdbcsv psql postgres://postgres@localhost:5432/dvdrental -t -A -F"," -c "select 1"
fdbcsv psql postgres://postgres@test-daabase.com:5432/dvdrental -t -A -F"," -c "select 1"
fdb() {
  command=$(cat ~/.project | grep -e '^fdb [^*]' ~/.project | cut -d ' ' -f 2- | fzf)
  eval $command
}

fdbcsv() {
  command=$(cat ~/.project | grep -e '^fdbcsv [^*]' ~/.project | cut -d ' ' -f 2- | fzf)
  echo $command | pbcopy
}

上記のように.projectファイルに追加して、fuzzy findのコマンドで読み取らせます。fdbは即時実行でfdbcsvは修正することのほうがおおいのでクリップボードにコピーして使用します。

~/.projectの書き込みもコマンドとして作成

このコマンドをいつでも読み出せるようにしておきたい場合にとりあえず、ファイルに書き込んで置くのが良いでしょう。

fproject() {
    echo -n "enter your code: ex) fterraform terraform apply:"
    read answer
    if [ "$answer" != "" ] ;then
      echo "$answer" >> ~/.project
    else
      echo No
    fi
}

さいごにfuzzy find系の自作コマンド自体を忘れないようにキーマップ

ctrl + f にマッピングしてfuzzy findけいのコマンドをまとめておきます。

showfuzzyfindcustom(){
  command=`cat << EOS | fzf
fcd
fdb
fdbcsv
fmake
fmakel
ftmux
fproject
EOS
`
 echo "$command" | pbcopy
}
zle -N showfuzzyfindcustom
bindkey '^f' showfuzzyfindcustom

シンプルにこちらのように記載します。

まとめ

重要なのは、自分がどういうコマンドがあったら作業を効率できるかなと思って小さく改善していくことです。よいterminalライフを

Discussion

ログインするとコメントできます