All Articles

npm scriptsをbash-completionで補完する

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難しい。

現場からは以上です。