npm scriptsを補完するやつ
Nodeのプロジェクトをやってて一番実行するのがnpm run xxxxだと思うんだけど、 自身で定義したscriptsも補完して実行するようにしてタイプ数を減らした。bash-completionをやってみたかったのもある。
npm completion
npmには元々npm completionが用意されていて、
$ source <(npm completion)
で有効にできるけど、なんか内部で色々やってるのか補完が遅くて結果もやもやして、もっと軽い補完にしたかったので書いてみた。Gistはこちら
#!/bin/bash
# This is bash-completion for 'npm run' command.
# Find up package.json and completion 'npm scripts'.
_npm_run_completion() {
CURRENT="${COMP_WORDS[COMP_CWORD]}"
SUBCOMMAND="${COMP_WORDS[COMP_CWORD-1]}"
if [ "${SUBCOMMAND}" != "run" ]; then
return
fi
DIR=$(pwd)
while [ ! -f "${DIR}/package.json" ]; do
if [ "${DIR}" = "/" ]; then
return
fi
DIR=$(cd $(dirname $(readlink $DIR || echo $DIR)) || exit;pwd)
done
SCRIPTS=$(cat "${DIR}/package.json" | jq '.scripts | keys[]' | sed -e 's/"//g')
COMPREPLY=( $(compgen -W "${SCRIPTS}" ${CURRENT}) )
}
complete -F _npm_run_completion npm
やってることは下記の通り:
- カレントディレクトリから一番近いpackage.jsonを探す
- 見つかったらjqコマンドでscriptsフィールドを加工してリスト化
- npm runの場合だけ補完(他のサブコマンドは補完しない)
という感じ。というわけで動かすにはjqコマンドが必要です。
$ brew install jq
とかでインストールしてください。手元のMacで動作確認しただけなので他で動くかわからないし、そもそもみんなzshだろうから自分用ということでメモ。shell難しい。
現場からは以上です。