Terminalで毎回同じようなコマンドを入力してませんか?
多分誰得でもない自分だけのtipsだけど。
シナリオ
このアプリを開発するには、まず
cd A
cd B
ls
npm install
less package.json
npm run dev
よし開発しよー
となる人が多いと思うのですが
開発するまで叩くコマンドが短いほどいいですよね。あとは、よく使うコマンドなどはちゃんとストックしておくことで、コマンドを忘れてググって調べてコマンドを実行するみたいな手間を省くことができます。
fuzzy finderという選択肢とfzfコマンド
fuzzy finderはあいまいな検索のことですね。曖昧な検索をして最終的に目的にするものまでたどり着けることが重要だと思います。感覚的には検索を絞り込んで最終的に一件を選んでいくようなフローと同じです。対象がコマンドやファイルなので文字列で絞り込んでいくことになります。
fzf の install
golangで作られているので、いろんな環境で動くこと思うので下記のリンクから対象の方法を探してインストールします。
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コマンドは
各種データベースの接続をあいまい検索する: 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