summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2024-04-29 13:01:44 +0900
committernsfisis <nsfisis@gmail.com>2024-04-29 13:01:57 +0900
commitb082f01c144df6c9d4da358ffc054c69b4b4405c (patch)
tree45effdae08520e8402b607d09435a7ca3b02c8bc
parent9954c86c34b5096697453ee072a4dcc34aeb7401 (diff)
downloadnsfisis.dev-b082f01c144df6c9d4da358ffc054c69b4b4405c.tar.gz
nsfisis.dev-b082f01c144df6c9d4da358ffc054c69b4b4405c.tar.zst
nsfisis.dev-b082f01c144df6c9d4da358ffc054c69b4b4405c.zip
feat(blog/content): new post /posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/
-rw-r--r--vhosts/blog/content/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands.ndoc103
-rw-r--r--vhosts/blog/nuldoc-src/config.ts2
-rw-r--r--vhosts/blog/nuldoc-src/ndoc/to_html.ts7
-rw-r--r--vhosts/blog/nuldoc-src/types/highlight-js.d.ts5
-rw-r--r--vhosts/blog/public/atom.xml10
-rw-r--r--vhosts/blog/public/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html157
-rw-r--r--vhosts/blog/public/posts/atom.xml10
-rw-r--r--vhosts/blog/public/posts/index.html15
-rw-r--r--vhosts/blog/public/tags/composer/atom.xml19
-rw-r--r--vhosts/blog/public/tags/composer/index.html66
-rw-r--r--vhosts/blog/public/tags/index.html22
-rw-r--r--vhosts/blog/public/tags/php/atom.xml10
-rw-r--r--vhosts/blog/public/tags/php/index.html15
-rw-r--r--vhosts/blog/public/tags/zsh/atom.xml19
-rw-r--r--vhosts/blog/public/tags/zsh/index.html66
15 files changed, 521 insertions, 5 deletions
diff --git a/vhosts/blog/content/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands.ndoc b/vhosts/blog/content/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands.ndoc
new file mode 100644
index 00000000..33ef19d2
--- /dev/null
+++ b/vhosts/blog/content/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands.ndoc
@@ -0,0 +1,103 @@
+---
+[article]
+uuid = "9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7"
+title = "【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる"
+description = "Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。"
+tags = [
+ "composer",
+ "php",
+ "zsh",
+]
+
+[[article.revisions]]
+date = "2024-04-29"
+remark = "公開"
+---
+<article>
+ <section id="version-info">
+ <h>バージョン情報</h>
+ <ul>
+ <li>Composer: 2.7.4</li>
+ <li>PHP: 8.3.6</li>
+ <li>Zsh: 5.9</li>
+ </ul>
+ </section>
+ <section id="intro">
+ <h>はじめに</h>
+ <p>
+ <a href="https://getcomposer.org/">Composer</a> は PHP のデファクトスタンダードなパッケージマネージャである。
+ Zsh では、<code>composer</code> コマンドに対する補完が提供されており、<code>composer</code> と入力してタブキーを押すと、利用可能なコマンドやオプションが補完される。
+ Zsh の補完はシェル関数の形で実装されており、<code>composer</code> コマンドに対応した補完をおこなうのは <code>_composer</code> である。
+ <a href="https://github.com/zsh-users/zsh/blob/a66e92918568881af110a3e2e3018b317c054e4a/Completion/Unix/Command/_composer">記事執筆時点での補完関数の定義は、GitHub のミラーリポジトリから参照できる。</a>
+ </p>
+ </section>
+ <section id="problem">
+ <h>発生していた問題</h>
+ <p>
+ <code>composer</code> コマンドはカスタムコマンド (<code>composer.json</code> の <code>scripts</code> で定義されたコマンド) に対して補完をおこなわない。
+ つまり、途中まで入力されたカスタムコマンドを補完しないし、カスタムコマンドの引数も補完しない。
+ 例えば、PHPUnit を呼び出す <code>phpunit</code> というカスタムコマンドを定義し <code>composer phpu</code> まで打ってタブキーを押しても、<code>composer phpunit</code> にはならない。
+ また、<code>composer phpunit -- --</code> まで打ってタブキーを押しても、<code>phpunit</code> コマンドのオプションは補完されない。
+ </p>
+ <p>
+ このことは、先ほどリンクを載せた <code>_composer</code> 関数を定義しているファイルの冒頭にも書かれている。
+ </p>
+ <codeblock language="zsh">
+ <![CDATA[
+ # - @todo We don't complete custom commands (including script aliases). This is
+ # easy to do in the general case, but it probably requires some clever caching
+ # to avoid introducing a noticeable lag to every completion operation, due to
+ # the way command resolution works and the fact that discovering custom
+ # commands requires making slow calls to Composer
+ ]]>
+ </codeblock>
+ </section>
+ <section id="what-i-want-to-achive">
+ <h>やりたいこと</h>
+ <p>
+ 確かに、カスタムコマンドに対して完全な補完を提供するのは不可能か、あるいは実現できても遅くなりすぎるだろう。
+ しかし、不完全なフォールバックを提供するくらいなら可能なはずだ。
+ </p>
+ <p>
+ この記事では、これらのカスタムコマンドについて、Zsh が提供するデフォルトのファイル・ディレクトリ補完を適用する。
+ つまり、<code>composer phpunit -- tests/</code> まで打ってタブキーを押すと、<code>tests</code> ディレクトリの下にあるテストファイルまたはディレクトリが補完される。
+ </p>
+ </section>
+ <section id="solution">
+ <h>解決策</h>
+ <p>
+ まずは、Zsh で補完関数を提供する場合のボイラープレートコードを書く。
+ 以下は <code>~/.zshrc</code> にすべて書く前提だが、<code>autoload</code> を設定するなどすれば別ファイルに分離できる (詳細な手順は割愛)。
+ </p>
+ <codeblock language="zsh">
+ <![CDATA[
+ compdef _my_composer composer composer.phar
+ ]]>
+ </codeblock>
+ <p>
+ <code>compdef</code> は Zsh が用意している関数で、第一引数に補完関数の名前、第二引数以降に補完を適用するコマンド名を並べる。
+ この場合は、<code>composer</code> コマンドや <code>composer.phar</code> コマンドに対して <code>_my_composer</code> を使って補完をおこなうよう定義している。
+ </p>
+ <p>
+ 次に <code>_my_composer</code> を定義する。基本的にはデフォルトの <code>composer</code> コマンドの補完関数 (つまり <code>_composer</code> 関数) を使い、それが何も返さなかった場合に限り、Zsh のファイル・ディレクトリ補完へフォールバックする。
+ </p>
+ <codeblock language="zsh">
+ <![CDATA[
+ function _my_composer() {
+ _composer "$@" || _files "$@"
+ }
+ ]]>
+ </codeblock>
+ <p>
+ <code>_composer</code> コマンドは何も補完候補がなかったとき非ゼロな exit status で終了するので、そうであったなら <code>_files</code> を呼び出す。
+ <code>_files</code> は、Zsh がデフォルトで用意しているファイル・ディレクトリの補完をおこなう関数である。
+ </p>
+ </section>
+ <section id="conclusion">
+ <h>まとめ</h>
+ <p>
+ これらの設定をおこなうことで、部分的ながら Composer のカスタムコマンドに対して補完をおこなうことができる。
+ 特に、PHPUnit や PHPStan などの対象ファイル・ディレクトリを引数に取るようなコマンドを使う場合に有用であろう。
+ </p>
+ </section>
+</article>
diff --git a/vhosts/blog/nuldoc-src/config.ts b/vhosts/blog/nuldoc-src/config.ts
index a4f582e7..00fc686a 100644
--- a/vhosts/blog/nuldoc-src/config.ts
+++ b/vhosts/blog/nuldoc-src/config.ts
@@ -16,6 +16,7 @@ export const config = {
siteCopyrightYear: 2021,
tagLabels: {
"ci-cd": "CI/CD",
+ "composer": "Composer",
"conference": "カンファレンス",
"cpp": "C++",
"cpp17": "C++ 17",
@@ -42,6 +43,7 @@ export const config = {
"wireguard": "WireGuard",
"ya8": "Ya8",
"yapc": "YAPC",
+ "zsh": "Zsh",
},
},
};
diff --git a/vhosts/blog/nuldoc-src/ndoc/to_html.ts b/vhosts/blog/nuldoc-src/ndoc/to_html.ts
index dc39919b..926a0455 100644
--- a/vhosts/blog/nuldoc-src/ndoc/to_html.ts
+++ b/vhosts/blog/nuldoc-src/ndoc/to_html.ts
@@ -222,7 +222,12 @@ function highlightPrograms(doc: Document) {
const sourceCode = sourceCodeNode.content;
if (!hljs.getLanguage(language)) {
- return;
+ if (language === "zsh") {
+ // highlight.js does not have a language definition for zsh.
+ hljs.registerAliases("zsh", { languageName: "bash" });
+ } else {
+ return;
+ }
}
const highlighted =
diff --git a/vhosts/blog/nuldoc-src/types/highlight-js.d.ts b/vhosts/blog/nuldoc-src/types/highlight-js.d.ts
index d7bd0b50..67007b53 100644
--- a/vhosts/blog/nuldoc-src/types/highlight-js.d.ts
+++ b/vhosts/blog/nuldoc-src/types/highlight-js.d.ts
@@ -1,4 +1,9 @@
declare module "highlight.js" {
+ function registerAliases(
+ aliases: string | string[],
+ language: { languageName: string },
+ ): void;
+
function getLanguage(
name: string,
): string | undefined;
diff --git a/vhosts/blog/public/atom.xml b/vhosts/blog/public/atom.xml
index 3c360c54..592fd54f 100644
--- a/vhosts/blog/public/atom.xml
+++ b/vhosts/blog/public/atom.xml
@@ -7,7 +7,15 @@
<author>
<name>nsfisis</name>
</author>
- <updated>2024-04-25T00:00:00+09:00</updated>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/"></link>
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</title>
+ <summary>Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。</summary>
+ <published>2024-04-29T00:00:00+09:00</published>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ </entry>
<entry>
<id>urn:uuid:6cf84106-cc69-4d87-b957-9d58d7e585bb</id>
<link rel="alternate" href="https://blog.nsfisis.dev/slides/2024-04-25/phpstudy-tokyo-163/"></link>
diff --git a/vhosts/blog/public/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html b/vhosts/blog/public/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html
new file mode 100644
index 00000000..387df733
--- /dev/null
+++ b/vhosts/blog/public/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/index.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。">
+ <meta name="keywords" content="Composer,PHP,Zsh">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ <link rel="stylesheet" href="/hl.css?h=340e65ffd5c17713efc9107c06304f7b">
+ </head>
+ <body class="single">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <article class="post-single">
+ <header class="post-header">
+ <h1 class="post-title">【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</h1>
+ <ul class="post-tags">
+ <li class="tag">
+ <a href="/tags/composer/">Composer</a>
+ </li>
+ <li class="tag">
+ <a href="/tags/php/">PHP</a>
+ </li>
+ <li class="tag">
+ <a href="/tags/zsh/">Zsh</a>
+ </li>
+ </ul>
+ </header>
+ <div class="post-content">
+ <section>
+ <h2 id="changelog">更新履歴</h2>
+ <ol>
+ <li class="revision">
+ <time datetime="2024-04-29">2024-04-29</time>: 公開
+ </li>
+ </ol>
+ </section>
+ <section id="section--version-info">
+ <h2><a href="#section--version-info">バージョン情報</a></h2>
+ <ul>
+ <li>
+ Composer: 2.7.4
+ </li>
+
+ <li>
+ PHP: 8.3.6
+ </li>
+
+ <li>
+ Zsh: 5.9
+ </li>
+ </ul>
+ </section>
+
+ <section id="section--intro">
+ <h2><a href="#section--intro">はじめに</a></h2>
+ <p>
+ <a href="https://getcomposer.org/">Composer</a> は PHP のデファクトスタンダードなパッケージマネージャである。 Zsh では、<code>composer</code> コマンドに対する補完が提供されており、<code>composer</code> と入力してタブキーを押すと、利用可能なコマンドやオプションが補完される。 Zsh の補完はシェル関数の形で実装されており、<code>composer</code> コマンドに対応した補完をおこなうのは <code>_composer</code> である。 <a href="https://github.com/zsh-users/zsh/blob/a66e92918568881af110a3e2e3018b317c054e4a/Completion/Unix/Command/_composer">記事執筆時点での補完関数の定義は、GitHub のミラーリポジトリから参照できる。</a>
+ </p>
+ </section>
+
+ <section id="section--problem">
+ <h2><a href="#section--problem">発生していた問題</a></h2>
+ <p>
+ <code>composer</code> コマンドはカスタムコマンド (<code>composer.json</code> の <code>scripts</code> で定義されたコマンド) に対して補完をおこなわない。 つまり、途中まで入力されたカスタムコマンドを補完しないし、カスタムコマンドの引数も補完しない。 例えば、PHPUnit を呼び出す <code>phpunit</code> というカスタムコマンドを定義し <code>composer phpu</code> まで打ってタブキーを押しても、<code>composer phpunit</code> にはならない。 また、<code>composer phpunit -- --</code> まで打ってタブキーを押しても、<code>phpunit</code> コマンドのオプションは補完されない。
+ </p>
+
+ <p>
+ このことは、先ほどリンクを載せた <code>_composer</code> 関数を定義しているファイルの冒頭にも書かれている。
+ </p>
+
+ <pre class="highlight" language="zsh"><code class="highlight"><span class="hljs-comment"># - @todo We don&#x27;t complete custom commands (including script aliases). This is</span>
+<span class="hljs-comment"># easy to do in the general case, but it probably requires some clever caching</span>
+<span class="hljs-comment"># to avoid introducing a noticeable lag to every completion operation, due to</span>
+<span class="hljs-comment"># the way command resolution works and the fact that discovering custom</span>
+<span class="hljs-comment"># commands requires making slow calls to Composer</span></code></pre>
+ </section>
+
+ <section id="section--what-i-want-to-achive">
+ <h2><a href="#section--what-i-want-to-achive">やりたいこと</a></h2>
+ <p>
+ 確かに、カスタムコマンドに対して完全な補完を提供するのは不可能か、あるいは実現できても遅くなりすぎるだろう。 しかし、不完全なフォールバックを提供するくらいなら可能なはずだ。
+ </p>
+
+ <p>
+ この記事では、これらのカスタムコマンドについて、Zsh が提供するデフォルトのファイル・ディレクトリ補完を適用する。 つまり、<code>composer phpunit -- tests/</code> まで打ってタブキーを押すと、<code>tests</code> ディレクトリの下にあるテストファイルまたはディレクトリが補完される。
+ </p>
+ </section>
+
+ <section id="section--solution">
+ <h2><a href="#section--solution">解決策</a></h2>
+ <p>
+ まずは、Zsh で補完関数を提供する場合のボイラープレートコードを書く。 以下は <code>~/.zshrc</code> にすべて書く前提だが、<code>autoload</code> を設定するなどすれば別ファイルに分離できる (詳細な手順は割愛)。
+ </p>
+
+ <pre class="highlight" language="zsh"><code class="highlight">compdef _my_composer composer composer.phar</code></pre>
+
+ <p>
+ <code>compdef</code> は Zsh が用意している関数で、第一引数に補完関数の名前、第二引数以降に補完を適用するコマンド名を並べる。 この場合は、<code>composer</code> コマンドや <code>composer.phar</code> コマンドに対して <code>_my_composer</code> を使って補完をおこなうよう定義している。
+ </p>
+
+ <p>
+ 次に <code>_my_composer</code> を定義する。基本的にはデフォルトの <code>composer</code> コマンドの補完関数 (つまり <code>_composer</code> 関数) を使い、それが何も返さなかった場合に限り、Zsh のファイル・ディレクトリ補完へフォールバックする。
+ </p>
+
+ <pre class="highlight" language="zsh"><code class="highlight"><span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">_my_composer</span></span>() {
+ _composer <span class="hljs-string">&quot;<span class="hljs-variable">$@</span>&quot;</span> || _files <span class="hljs-string">&quot;<span class="hljs-variable">$@</span>&quot;</span>
+}</code></pre>
+
+ <p>
+ <code>_composer</code> コマンドは何も補完候補がなかったとき非ゼロな exit status で終了するので、そうであったなら <code>_files</code> を呼び出す。 <code>_files</code> は、Zsh がデフォルトで用意しているファイル・ディレクトリの補完をおこなう関数である。
+ </p>
+ </section>
+
+ <section id="section--conclusion">
+ <h2><a href="#section--conclusion">まとめ</a></h2>
+ <p>
+ これらの設定をおこなうことで、部分的ながら Composer のカスタムコマンドに対して補完をおこなうことができる。 特に、PHPUnit や PHPStan などの対象ファイル・ディレクトリを引数に取るようなコマンドを使う場合に有用であろう。
+ </p>
+ </section>
+ </div>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>
diff --git a/vhosts/blog/public/posts/atom.xml b/vhosts/blog/public/posts/atom.xml
index fbeae0a4..12cc04ef 100644
--- a/vhosts/blog/public/posts/atom.xml
+++ b/vhosts/blog/public/posts/atom.xml
@@ -7,7 +7,15 @@
<author>
<name>nsfisis</name>
</author>
- <updated>2024-04-21T00:00:00+09:00</updated>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/"></link>
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</title>
+ <summary>Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。</summary>
+ <published>2024-04-29T00:00:00+09:00</published>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ </entry>
<entry>
<id>urn:uuid:a4c326a6-5ffe-450c-abf2-45833c5efb6a</id>
<link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/"></link>
diff --git a/vhosts/blog/public/posts/index.html b/vhosts/blog/public/posts/index.html
index fc4af85e..815b24e0 100644
--- a/vhosts/blog/public/posts/index.html
+++ b/vhosts/blog/public/posts/index.html
@@ -43,6 +43,21 @@
<h1>投稿一覧</h1>
</header>
<article class="post-entry">
+ <a href="/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/">
+ <header class="entry-header">
+ <h2>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-29">2024-04-29</time> 投稿
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/">
<header class="entry-header">
<h2>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</h2>
diff --git a/vhosts/blog/public/tags/composer/atom.xml b/vhosts/blog/public/tags/composer/atom.xml
new file mode 100644
index 00000000..7fa3a210
--- /dev/null
+++ b/vhosts/blog/public/tags/composer/atom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>tag:blog.nsfisis.dev,2021:tag-composer</id>
+ <title>タグ「Composer」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="alternate" href="https://blog.nsfisis.dev/tags/composer/"></link>
+ <link rel="self" href="https://blog.nsfisis.dev/tags/composer/atom.xml"></link>
+ <author>
+ <name>nsfisis</name>
+ </author>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/"></link>
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</title>
+ <summary>Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。</summary>
+ <published>2024-04-29T00:00:00+09:00</published>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ </entry>
+</feed>
diff --git a/vhosts/blog/public/tags/composer/index.html b/vhosts/blog/public/tags/composer/index.html
new file mode 100644
index 00000000..8169c7ff
--- /dev/null
+++ b/vhosts/blog/public/tags/composer/index.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="タグ「Composer」のついた記事またはスライドの一覧">
+ <meta name="keywords" content="Composer">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="タグ「Composer」一覧|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="タグ「Composer」のついた記事またはスライドの一覧">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/composer/atom.xml">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>タグ「Composer」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ </head>
+ <body class="list">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <header class="page-header">
+ <h1>タグ「Composer」一覧</h1>
+ </header>
+ <article class="post-entry">
+ <a href="/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/">
+ <header class="entry-header">
+ <h2>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-29">2024-04-29</time> 投稿
+ </footer>
+ </a>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>
diff --git a/vhosts/blog/public/tags/index.html b/vhosts/blog/public/tags/index.html
index 83c20f8e..21a7bc0d 100644
--- a/vhosts/blog/public/tags/index.html
+++ b/vhosts/blog/public/tags/index.html
@@ -52,6 +52,16 @@
</a>
</article>
<article class="post-entry">
+ <a href="/tags/composer/">
+ <header class="entry-header">
+ <h2>Composer</h2>
+ </header>
+ <footer class="entry-footer">
+ 1件の記事
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/tags/conference/">
<header class="entry-header">
<h2>カンファレンス</h2>
@@ -147,7 +157,7 @@
<h2>PHP</h2>
</header>
<footer class="entry-footer">
- 15件の記事、15件のスライド
+ 16件の記事、15件のスライド
</footer>
</a>
</article>
@@ -311,6 +321,16 @@
</footer>
</a>
</article>
+ <article class="post-entry">
+ <a href="/tags/zsh/">
+ <header class="entry-header">
+ <h2>Zsh</h2>
+ </header>
+ <footer class="entry-footer">
+ 1件の記事
+ </footer>
+ </a>
+ </article>
</main>
<footer class="footer">
&copy; 2021 nsfisis
diff --git a/vhosts/blog/public/tags/php/atom.xml b/vhosts/blog/public/tags/php/atom.xml
index 033054f9..237e135c 100644
--- a/vhosts/blog/public/tags/php/atom.xml
+++ b/vhosts/blog/public/tags/php/atom.xml
@@ -7,7 +7,15 @@
<author>
<name>nsfisis</name>
</author>
- <updated>2024-04-25T00:00:00+09:00</updated>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/"></link>
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</title>
+ <summary>Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。</summary>
+ <published>2024-04-29T00:00:00+09:00</published>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ </entry>
<entry>
<id>urn:uuid:6cf84106-cc69-4d87-b957-9d58d7e585bb</id>
<link rel="alternate" href="https://blog.nsfisis.dev/slides/2024-04-25/phpstudy-tokyo-163/"></link>
diff --git a/vhosts/blog/public/tags/php/index.html b/vhosts/blog/public/tags/php/index.html
index 0d41b5c6..2784e2f8 100644
--- a/vhosts/blog/public/tags/php/index.html
+++ b/vhosts/blog/public/tags/php/index.html
@@ -44,6 +44,21 @@
<h1>タグ「PHP」一覧</h1>
</header>
<article class="post-entry">
+ <a href="/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/">
+ <header class="entry-header">
+ <h2>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-29">2024-04-29</time> 投稿
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/slides/2024-04-25/phpstudy-tokyo-163/">
<header class="entry-header">
<h2>登壇: PHP 勉強会@東京 第163回 (LT)</h2>
diff --git a/vhosts/blog/public/tags/zsh/atom.xml b/vhosts/blog/public/tags/zsh/atom.xml
new file mode 100644
index 00000000..9100fff5
--- /dev/null
+++ b/vhosts/blog/public/tags/zsh/atom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>tag:blog.nsfisis.dev,2021:tag-zsh</id>
+ <title>タグ「Zsh」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="alternate" href="https://blog.nsfisis.dev/tags/zsh/"></link>
+ <link rel="self" href="https://blog.nsfisis.dev/tags/zsh/atom.xml"></link>
+ <author>
+ <name>nsfisis</name>
+ </author>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:9b26c1ed-45c3-4cad-9476-cbf2cf2e4de7</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/"></link>
+ <title>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</title>
+ <summary>Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。</summary>
+ <published>2024-04-29T00:00:00+09:00</published>
+ <updated>2024-04-29T00:00:00+09:00</updated>
+ </entry>
+</feed>
diff --git a/vhosts/blog/public/tags/zsh/index.html b/vhosts/blog/public/tags/zsh/index.html
new file mode 100644
index 00000000..e180515c
--- /dev/null
+++ b/vhosts/blog/public/tags/zsh/index.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="タグ「Zsh」のついた記事またはスライドの一覧">
+ <meta name="keywords" content="Zsh">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="タグ「Zsh」一覧|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="タグ「Zsh」のついた記事またはスライドの一覧">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/zsh/atom.xml">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>タグ「Zsh」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ </head>
+ <body class="list">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <header class="page-header">
+ <h1>タグ「Zsh」一覧</h1>
+ </header>
+ <article class="post-entry">
+ <a href="/posts/2024-04-29/zsh-file-completion-for-composer-custom-commands/">
+ <header class="entry-header">
+ <h2>【Zsh】 Composer のカスタムコマンドに対する Zsh 補完で引数にファイルを補完させる</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ Zsh の Composer に対する補完はカスタムコマンドやその引数を補完しない。カスタムコマンドの引数としてファイルを補完させる方法を調べた。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-29">2024-04-29</time> 投稿
+ </footer>
+ </a>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>