やったことだけ書く備忘録

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 [ ! -
"${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 -'s/"//g')
  
COMPREPLY=( $(compgen -"${SCRIPTS}${CURRENT}) )
}

complete -F _npm_run_completion npm
 


やってることは下記の通り:




  • カレントディレクトリから一番近いpackage.jsonを探す

  • 見つかったらjqコマンドでscriptsフィールドを加工してリスト化

  • npm runの場合だけ補完(他のサブコマンドは補完しない)


という感じ。というわけで動かすにはjqコマンドが必要です。




$ brew install jq


とかでインストールしてください。手元のMacで動作確認しただけなので他で動くかわからないし、そもそもみんなzshだろうから自分用ということでメモ。shell難しい。

現場からは以上です。

« 前の記事

0件のコメント