{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/more-easy-to-use-npm-scripts/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"2dde9b81-c5d2-5a6e-a34f-da159dc511a0","excerpt":"便乗ネタです。 — peco で npm-scripts を超簡単に実行したい - Qiita という素晴らしい記事が公開されたので実際に使ってみたのですが、 npm runまで打ってから「あれ、コマンドなんだっけ」と思い、入力内容を消しnrun…","html":"<p>便乗ネタです。</p>\n<blockquote>\n<p>— <a href=\"https://qiita.com/hogesuke_1/items/46f009f31b5f2ec8c02c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">peco で npm-scripts を超簡単に実行したい - Qiita</a></p>\n</blockquote>\n<p>という素晴らしい記事が公開されたので実際に使ってみたのですが、<br>\n<code>npm run</code>まで打ってから「あれ、コマンドなんだっけ」と思い、入力内容を消し<code>nrun</code>を実行するという一手間を省略したいと思いました。<br>\nもっと超簡単に実行できるように<code>npm run &#x3C;TAB></code>で peco が起動するようにしてみました。</p>\n<!--more-->\n<h2 id=\"changelog\" style=\"position:relative;\"><a href=\"#changelog\" aria-label=\"changelog permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CHANGELOG</h2>\n<p>2018/06/01: yarn にも対応しました</p>\n<h2 id=\"まえおき\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%88%E3%81%8A%E3%81%8D\" aria-label=\"まえおき permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まえおき</h2>\n<p>Bash でのみ動作確認してます。<br>\nZ や F の方は別途記事書いていただけるとありがたいです。</p>\n<p>また、元記事の通りにセットアップができていることを前提とします。</p>\n<blockquote>\n<p>— <a href=\"https://qiita.com/hogesuke_1/items/46f009f31b5f2ec8c02c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">peco で npm-scripts を超簡単に実行したい - Qiita</a></p>\n</blockquote>\n<h2 id=\"npm-run-tabで-peco-を作動させる\" style=\"position:relative;\"><a href=\"#npm-run-tab%E3%81%A7-peco-%E3%82%92%E4%BD%9C%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B\" aria-label=\"npm run tabで peco を作動させる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code>npm run &#x3C;TAB></code>で peco を作動させる</h2>\n<p>タブ補完に関しては、こちらの記事を参考にしました。</p>\n<blockquote>\n<p>— <a href=\"http://blog.cybozu.io/entry/2016/09/26/080000\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Bash タブ補完自作入門 - Cybozu Inside Out | サイボウズエンジニアのブログ</a></p>\n</blockquote>\n<p>で、実際に書いたシェルがこちら。</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function-name function\">_npm_run_peco</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin class-name\">local</span> cur prev cword\n    _get_comp_words_by_ref -n <span class=\"token builtin class-name\">:</span> cur prev cword\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"<span class=\"token variable\">$prev</span>\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"run\"</span> <span class=\"token punctuation\">]</span> <span class=\"token operator\">||</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"<span class=\"token variable\">$prev</span>\"</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"yarn\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span>\n        <span class=\"token assign-left variable\">COMPREPLY</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">cat</span> package.json <span class=\"token operator\">|</span> jq -r <span class=\"token string\">'.scripts | keys[]'</span> <span class=\"token operator\">|</span> peco --initial-filter<span class=\"token operator\">=</span>Fuzzy --query<span class=\"token operator\">=</span>$cur<span class=\"token variable\">)</span></span>\n    <span class=\"token keyword\">fi</span>\n<span class=\"token punctuation\">}</span>\ncomplete -F _npm_run_peco <span class=\"token function\">npm</span> <span class=\"token function\">yarn</span></code></pre></div>\n<p>このコードを bash_profile などに貼り付け、</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">source ~/.bash_profile</code></pre></div>\n<p>などと実行すれば反映されます。\nコードは短いですが一応解説です。</p>\n<h3 id=\"tab-補完の定義方法\" style=\"position:relative;\"><a href=\"#tab-%E8%A3%9C%E5%AE%8C%E3%81%AE%E5%AE%9A%E7%BE%A9%E6%96%B9%E6%B3%95\" aria-label=\"tab 補完の定義方法 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tab 補完の定義方法</h3>\n<p><code>complete -F フックさせたい関数名 補完対象にするコマンド（可変長）</code>を実行すると、タブ補完が有効になります。<br>\n例えば<code>complete -F hoge npm yarn</code>と書けば<code>npm</code>と<code>yarn</code>コマンドに対して関数<code>hoge</code>をフックするタブ補完になります。</p>\n<h3 id=\"_get_comp_words_by_ref\" style=\"position:relative;\"><a href=\"#_get_comp_words_by_ref\" aria-label=\"_get_comp_words_by_ref permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>_get_comp_words_by_ref</h3>\n<p>便利関数。現在カーソルがある手前の単語が何かわかります。<br>\n例えば、prev が<code>run</code>だった時だけ処理するみたいにフィルタできます。<br>\ncur は現在カーソルがある単語を指すので、入力途中のスクリプト名を peco の初期クエリに渡せます。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm run &lt;TAB>  # Tabの位置に単語はないので、クエリは空文字列。全script一覧が表示される\nnpm run b&lt;TAB> # Tabのいちに`b`があるので、bにマッチするscript一覧が表示される</code></pre></div>\n<h3 id=\"compreply\" style=\"position:relative;\"><a href=\"#compreply\" aria-label=\"compreply permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>COMPREPLY</h3>\n<p><code>COMPREPLY</code>に値をセットすると、補完される文字列になります。<br>\n例えば COMPREPLY に<code>build</code>という値をセットすると、</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm run build</code></pre></div>\n<p>のような補完になります。<br>\nこれに peco を組み合わせて、peco で選ばれた script が COMPREPLY にセットされるようにすれば良い</p>\n<h3 id=\"peco-で-fuzzy-search\" style=\"position:relative;\"><a href=\"#peco-%E3%81%A7-fuzzy-search\" aria-label=\"peco で fuzzy search permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>peco で fuzzy search</h3>\n<p>設定次第ですが、オプション指定なしで peco を呼ぶと<code>IgnoreCase</code>というフィルタになっています。<br>\n個人的には Fuzzy search なら適当にタイプしても見つかるので設定しています。<br>\nこの設定は好みなので、<a href=\"https://github.com/peco/peco#--initial-filter-ignorecasecasesensitivesmartcaseregexpfuzzy\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">peco のオプション</a>を読みつつ、手に馴染む設定をすると良いと思います。</p>\n<h2 id=\"動作デモ\" style=\"position:relative;\"><a href=\"#%E5%8B%95%E4%BD%9C%E3%83%87%E3%83%A2\" aria-label=\"動作デモ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>動作デモ</h2>\n<p><img src=\"/5e54401a35a4f507c19c8baeceafe592/npm-run-tab-completion.gif\" alt=\"動作デモ\"></p>\n<blockquote>\n<p>— <a href=\"https://asciinema.org/a/184718\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">タブ補完で peco で npm-scripts をもっと超簡単に実行したい - asciinema</a></p>\n</blockquote>\n<p>快適 ٩( ‘ω’ )و<br>\n作ってみたら Bash の Tab 補完とても簡単だったので、これからは積極的に補完していきたい</p>","timeToRead":4,"frontmatter":{"title":"タブ補完でpecoでnpm-scriptsをもっと超簡単に実行したい","tags":["npm","Bash","peco"],"date":"June 01, 2018","featuredImage":null}}},"pageContext":{"slug":"/more-easy-to-use-npm-scripts/","previous":{"fields":{"slug":"/why-i-need-redux-with-react-new-context/"},"frontmatter":{"title":"ReactのNew Context APIは便利だけどreduxを使うのはやめないと思った","tags":["JavaScript","React","Redux","React Native"]}},"next":{"fields":{"slug":"/how-to-publish-npm-public-scoped-package-with-lerna/"},"frontmatter":{"title":"lernaでnpmにpublicなscoped packageをpublishする方法","tags":["JavaScript","npm"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}