diff options
Diffstat (limited to 'vhosts/blog/public/posts')
| -rw-r--r-- | vhosts/blog/public/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html | 216 | ||||
| -rw-r--r-- | vhosts/blog/public/posts/atom.xml | 10 | ||||
| -rw-r--r-- | vhosts/blog/public/posts/index.html | 15 |
3 files changed, 240 insertions, 1 deletions
diff --git a/vhosts/blog/public/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html b/vhosts/blog/public/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html new file mode 100644 index 00000000..8b23b678 --- /dev/null +++ b/vhosts/blog/public/posts/2024-07-19/reparojson-fix-only-json-formatter/index.html @@ -0,0 +1,216 @@ +<!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="© 2024 nsfisis"> + <meta name="description" content="文法エラーだけを直し、空白の削除や挿入といった整形処理を一切おこなわない JSON フォーマッタを作成した。Neovim と連携させる設定例も紹介する。"> + <meta name="keywords" content="Neovim,Vim"> + <meta property="og:type" content="article"> + <meta property="og:title" content="reparojson: 文法エラーを直すだけの JSON フォーマッタを作った|REPL: Rest-Eat-Program Loop"> + <meta property="og:description" content="文法エラーだけを直し、空白の削除や挿入といった整形処理を一切おこなわない JSON フォーマッタを作成した。Neovim と連携させる設定例も紹介する。"> + <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>reparojson: 文法エラーを直すだけの JSON フォーマッタを作った|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">reparojson: 文法エラーを直すだけの JSON フォーマッタを作った</h1> + <ul class="post-tags"> + <li class="tag"> + <a href="/tags/neovim/">Neovim</a> + </li> + <li class="tag"> + <a href="/tags/vim/">Vim</a> + </li> + </ul> + </header> + <div class="post-content"> + <section> + <h2 id="changelog">更新履歴</h2> + <ol> + <li class="revision"> + <time datetime="2024-07-19">2024-07-19</time>: 公開 + </li> + </ol> + </section> + <div class="admonition"> + <div class="admonition-label"> + NOTE + </div> + <div class="admonition-content"> + この記事は <a href="https://vim-jp.org/ekiden/">Vim 駅伝</a> #218 の記事です。 + </div> + </div> + + <section id="section--intro"> + <h2><a href="#section--intro">欲しかったもの</a></h2> + <p> + Vim で JSON を編集しているときに、文法エラー (末尾カンマやカンマの不足) のみを修正して一切の整形をおこなわないプラグインが欲しかった。 整形も同時におこなうプラグインは見つかっただけでも多数あったのだが、整形しないものは見つけられなかったので自作することにした。 + </p> + + <p> + なお、作成したツール自体は単体の CLI として動作し、Vim とは無関係に使うことができる。 この記事では Neovim と組み合わせる場合の設定を紹介するが、およそ任意のエディタで使えるだろう。 + </p> + </section> + + <section id="section--reparojson"> + <h2><a href="#section--reparojson">作ったもの</a></h2> + <p> + 作成したものがこちら: <a href="https://github.com/nsfisis/reparojson">ReparoJSON</a> + </p> + + <p> + 次のように動作する。 + </p> + + <pre class="highlight"><code>$ echo '[ 1 2 ]' | reparojson +[ 1, 2 ] + +$ echo '[ 1, 2, ]' | reparojson +[ 1, 2 ] + +$ echo '{ "foo": 1 "bar": 2 }' | reparojson +{ "foo": 1, "bar": 2 } + +$ echo '{ "foo": 1, "bar": 2, }' | reparojson +{ "foo": 1, "bar": 2 }</code></pre> + + <p> + バージョン 0.1.1 時点で修正対象の文法エラーは次のとおり: + </p> + + <ul> + <li> + 配列末尾の余計なカンマ (削除する) + </li> + + <li> + 配列内のカンマ不足 (挿入する) + </li> + + <li> + オブジェクト末尾の余計なカンマ (削除する) + </li> + + <li> + オブジェクト内のカンマ不足 (挿入する) + </li> + </ul> + + <p> + 他にも自動で直せそうなエラーはいくつか思いつくが (オブジェクトのキーがクォートされていない等)、私自身があまり困っていないので優先度は低い。 + </p> + </section> + + <section id="section--itegration-with-neovim"> + <h2><a href="#section--itegration-with-neovim">Neovim との連携</a></h2> + <p> + Neovim で JSON ファイルを保存したときに、上記のツールを自動で走らせるように設定する。 + </p> + + <p> + ここでは、<a href="https://github.com/neovim/nvim-lspconfig">nvim-lspconfig</a> と <a href="https://github.com/mattn/efm-langserver">efm-langserver</a> を用いた設定例を紹介する。 + </p> + + <pre class="highlight" language="lua"><code class="highlight"><span class="hljs-keyword">local</span> lspconfig = <span class="hljs-built_in">require</span>(<span class="hljs-string">'lspconfig'</span>) + +lspconfig.efm.setup({ + init_options = { documentFormatting = <span class="hljs-literal">true</span> }, + settings = { + rootMarkers = {<span class="hljs-string">".git/"</span>}, + languages = { + json = { + { + formatCommand = <span class="hljs-string">"reparojson -q"</span>, + formatStdin = <span class="hljs-literal">true</span>, + }, + }, + }, + } +}) + +vim.api.nvim_create_autocmd(<span class="hljs-string">'LspAttach'</span>, { + callback = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(e)</span></span> + vim.api.nvim_create_autocmd(<span class="hljs-string">'BufWritePre'</span>, { + buffer = e.buf, + callback = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span> + vim.lsp.buf.<span class="hljs-built_in">format</span>({ async = <span class="hljs-literal">false</span> }) + <span class="hljs-keyword">end</span> + }) + <span class="hljs-keyword">end</span>, +})</code></pre> + + <p> + ほとんどは nvim-lspconfig と efm-langserver を使う際のボイラープレートだが、<code>formatCommand</code> で <code>-q</code> フラグを指定していることに注意してほしい。 このツールは、デフォルトでは JSON が修正された場合 exit code 1 で終了する。 これは、入力が最初から正しかった場合と修正して正しくなった場合を区別するためだが、異常終了してしまうと置き換えが発生しない。 そのため、<code>-q</code> フラグを指定して、修正されたときも exit code 0 で終了するようにしている。 + </p> + </section> + + <section id="section--outro"> + <h2><a href="#section--outro">おわりに</a></h2> + <p> + このツールが威力を発揮するのは、行の入れ換え時である。次のような JSON があり、 + </p> + + <pre class="highlight" language="json"><code class="highlight"><span class="hljs-punctuation">{</span> + <span class="hljs-attr">"a"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span> + <span class="hljs-attr">"b"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span> +<span class="hljs-punctuation">}</span></code></pre> + + <p> + 2行目と3行目を入れ換えて以下のように編集した。 + </p> + + <pre class="highlight" language="json"><code class="highlight"><span class="hljs-punctuation">{</span> + <span class="hljs-attr">"b"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span> + <span class="hljs-attr">"a"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span> +<span class="hljs-punctuation">}</span></code></pre> + + <p> + これは不正な JSON だが、このツールを通せば次のようになる。 + </p> + + <pre class="highlight" language="json"><code class="highlight"><span class="hljs-punctuation">{</span> + <span class="hljs-attr">"b"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span><span class="hljs-punctuation">,</span> + <span class="hljs-attr">"a"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span> +<span class="hljs-punctuation">}</span></code></pre> + + <p> + もちろん、このような操作を文法を壊さずにおこなう Vim プラグインは存在する。 しかし、単なる行の入れ換えであれば <code>ddp</code> の3ストロークでおこなうことができ、専用のキーバインドを覚える必要もない。 このツールを用いることで、より Vimmer-friendly な JSON 編集が可能となる。 + </p> + </section> + </div> + </article> + </main> + <footer class="footer"> + © 2021 nsfisis + </footer> + </body> +</html> diff --git a/vhosts/blog/public/posts/atom.xml b/vhosts/blog/public/posts/atom.xml index 6d2f9e51..5c4a94b4 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-07-07T00:00:00+09:00</updated> + <updated>2024-07-19T00:00:00+09:00</updated> + <entry> + <id>urn:uuid:222488dd-cf07-4961-83aa-a014b05369ff</id> + <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-07-19/reparojson-fix-only-json-formatter/"></link> + <title>reparojson: 文法エラーを直すだけの JSON フォーマッタを作った</title> + <summary>文法エラーだけを直し、空白の削除や挿入といった整形処理を一切おこなわない JSON フォーマッタを作成した。Neovim と連携させる設定例も紹介する。</summary> + <published>2024-07-19T00:00:00+09:00</published> + <updated>2024-07-19T00:00:00+09:00</updated> + </entry> <entry> <id>urn:uuid:8d6f3690-3da3-4235-a81b-b9707cee22ad</id> <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-06-19/scalamatsuri-2024-report/"></link> diff --git a/vhosts/blog/public/posts/index.html b/vhosts/blog/public/posts/index.html index c2c4005c..4a64804b 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-07-19/reparojson-fix-only-json-formatter/"> + <header class="entry-header"> + <h2>reparojson: 文法エラーを直すだけの JSON フォーマッタを作った</h2> + </header> + <section class="entry-content"> + <p> + 文法エラーだけを直し、空白の削除や挿入といった整形処理を一切おこなわない JSON フォーマッタを作成した。Neovim と連携させる設定例も紹介する。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2024-07-19">2024-07-19</time> 投稿 + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2024-06-19/scalamatsuri-2024-report/"> <header class="entry-header"> <h2>ScalaMatsuri 2024 参加レポ</h2> |
