diff options
Diffstat (limited to 'public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html')
| -rw-r--r-- | public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html | 452 |
1 files changed, 210 insertions, 242 deletions
diff --git a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html index 9b040ee..8144f03 100644 --- a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html +++ b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html @@ -4,18 +4,14 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="nsfisis"> - <meta name="copyright" content="© nsfisis"> - <meta name="description" content="Vim の autocmd events における BufWrite/BufWritePre がどう違うのかを調べた結果、 違いはないことがわかった。"> + <meta name="copyright" content="© 2021 nsfisis"> + <meta name="description" content="Vim の autocmd events における BufWrite/BufWritePre がどう違うのかを調べた結果、違いはないことがわかった。"> <meta name="keywords" content="Vim"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> - <title>【Vim】autocmd events の BufWrite/BufWritePre の違い | REPL: Rest-Eat-Program Loop</title> - - <link rel="stylesheet" href="/hl.css?208c52e3b7c9db1cad782c5d30b4698f"> - - <link rel="stylesheet" href="/style.css?779b1a3debcaeba619f6fe500e93d525"> - - <link rel="stylesheet" href="/custom.css?a649ea3528d4b626fb636505d94c1144"> - + <title>【Vim】 autocmd events の BufWrite/BufWritePre の違い | REPL: Rest-Eat-Program Loop</title> + <link rel="stylesheet" href="/hl.css?h=208c52e3b7c9db1cad782c5d30b4698f"> + <link rel="stylesheet" href="/style.css?h=779b1a3debcaeba619f6fe500e93d525"> + <link rel="stylesheet" href="/custom.css?h=a649ea3528d4b626fb636505d94c1144"> </head> <body class="single"> <header class="header"> @@ -28,248 +24,220 @@ <main class="main"> <article class="post-single"> <header class="post-header"> - <h1 class="post-title">【Vim】autocmd events の BufWrite/BufWritePre の違い</h1> - - <ul class="post-tags"> - - <li class="tag"> - <a href="/tags/vim/">Vim</a> - </li> - - </ul> - + <h1 class="post-title">【Vim】 autocmd events の BufWrite/BufWritePre の違い</h1> + <ul class="post-tags"> + <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="2021-10-02">2021-10-02</time>: Qiita から移植 + </li> + </ol> + </section> + <p> + この記事は Qiita から移植してきたものです。 元 URL:<a xl:href="https://qiita.com/nsfisis/items/79ab4db8564032de0b25">https://qiita.com/nsfisis/items/79ab4db8564032de0b25</a> + </p> + + <p> + <hr> + </hr> + </p> + + <section id="section--_tl_dr"> + <h2><a href="#section--_tl_dr">TL; DR</a></h2> + <p> + 違いはない。ただのエイリアス。 + </p> + </section> + + <section id="section--_調査記録"> + <h2><a href="#section--_調査記録">調査記録</a></h2> + <p> + Vim の autocmd events には似通った名前のものがいくつかある。大抵は<code>:help</code>に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。 + </p> + + <ul> + <li> + <p> + <code>BufRead</code>/<code>BufReadPost</code> + </p> + </li> + + <li> + <p> + <code>BufWrite</code>/<code>BufWritePre</code> + </p> + </li> + + <li> + <p> + <code>BufAdd</code>/<code>BufCreate</code> + </p> + </li> + </ul> + + <p> + このうち、<code>BufAdd</code>/<code>BufCreate</code>に関しては、<code>:help BufCreate</code>に + </p> + + <blockquote> + <p> + The BufCreate event is for historic reasons. + </p> + </blockquote> + + <p> + とあり、おそらくは<code>BufAdd</code>のエイリアスであろうということがわかる。他の2組も同様ではないかと予想されるが、確認のため vim と neovim のソースコードを調査した。 + </p> + + <blockquote> + <p> + ソースコードへのリンク<a xl:href="https://github.com/vim/vim/tree/8e6be34338f13a6a625f19bcef82019c9adc65f2">vim (調査時点での master branch)</a><a xl:href="https://github.com/neovim/neovim/tree/71d4f5851f068eeb432af34850dddda8cc1c71e3">neovim (上に同じ)</a> + </p> + </blockquote> + + <section id="section--_vim_のソースコード"> + <h3><a href="#section--_vim_のソースコード">vim のソースコード</a></h3> + <p> + 以下は、autocmd events の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。 + </p> + + <p> + <a xl:href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86</a> + </p> - <li class="revision"> - <time datetime="2021-10-02">2021-10-02</time>: Qiita から移植 + <pre language="c" linenumbering="unnumbered"> + <code> {"BufAdd", EVENT_BUFADD}, +{"BufCreate", EVENT_BUFADD},</code> + </pre> + + <p> + <a xl:href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97</a> + </p> + + <pre language="c" linenumbering="unnumbered"> + <code> {"BufRead", EVENT_BUFREADPOST}, +{"BufReadCmd", EVENT_BUFREADCMD}, +{"BufReadPost", EVENT_BUFREADPOST},</code> + </pre> + + <p> + <a xl:href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105</a> + </p> + + <pre language="c" linenumbering="unnumbered"> + <code> {"BufWrite", EVENT_BUFWRITEPRE}, +{"BufWritePost", EVENT_BUFWRITEPOST}, +{"BufWritePre", EVENT_BUFWRITEPRE},</code> + </pre> + </section> + + <section id="section--_neovim_のソースコード"> + <h3><a href="#section--_neovim_のソースコード">neovim のソースコード</a></h3> + <p> + neovim の場合でも同様のマッピングが定義されているが、こちらの場合は Lua で書かれている。以下にある通り、はっきり<code>aliases</code>と書かれている。 + </p> + + <p> + <a xl:href="https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124">https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124</a> + </p> + + <pre language="lua" linenumbering="unnumbered"> + <code> aliases = { +BufCreate = 'BufAdd', +BufRead = 'BufReadPost', +BufWrite = 'BufWritePre', +FileEncoding = 'EncodingChanged', +},</code> + </pre> + + <p> + ところで、上では取り上げなかった<code>FileEncoding</code>だが、これは<code>:help FileEncoding</code>にしっかりと書いてある。 + </p> + + <pre class="monospaced"> + <code> *FileEncoding* +FileEncoding Obsolete. It still works and is equivalent +to |EncodingChanged|.</code> + </pre> + </section> + + <section id="section--_まとめ"> + <h3><a href="#section--_まとめ">まとめ</a></h3> + <p> + 記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。 + </p> + + <ul> + <li> + <p> + <code>BufAdd</code>/<code>BufCreate</code> + </p> + + <ul> + <li> + <p> + →<code>BufCreate</code>は歴史的な理由により (<code>`for historic reasons'') 存在しているため、新しい方 (`BufAdd</code>) を使う + </p> + </li> + </ul> + </li> + + <li> + <p> + <code>BufRead</code>/<code>BufReadPost</code> + </p> + + <ul> + <li> + <p> + →<code>BufReadPre</code>との対称性のため、あるいは<code>BufWritePost</code>との対称性のため<code>BufReadPost</code>を使う + </p> + </li> + </ul> + </li> + + <li> + <p> + <code>BufWrite</code>/<code>BufWritePre</code> + </p> + + <ul> + <li> + <p> + →<code>BufWritePost</code>との対称性のため、あるいは<code>BufReadPre</code>との対称性のため<code>BufWritePre</code>を使う + </p> + </li> + </ul> </li> + + <li> + <p> + <code>FileEncoding</code>/<code>EncodingChanged</code> + </p> + + <ul> + <li> + <p> + →<code>FileEncoding</code>は<code>`Obsolete'' と明言されているので、`EncodingChanged</code>を使う + </p> + </li> + </ul> + </li> + </ul> - </ol> + <p> + ところでこの調査で知ったのだが、<code>BufRead</code>と<code>BufWrite</code>は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら<code>Pre</code>/<code>Post</code>付きのものを使った方が分かりやすいだろう。 + </p> + </section> </section> - <div id="preamble"> -<div class="sectionbody"> -<div class="paragraph"> -<p>この記事は Qiita から移植してきたものです。 元 URL: -<a href="https://qiita.com/nsfisis/items/79ab4db8564032de0b25" class="bare">https://qiita.com/nsfisis/items/79ab4db8564032de0b25</a></p> -</div> -<hr> -</div> -</div> -<section class="section-1"> - <h2 id="" class="section-header"> - - TL; DR - - </h2> - <div class="section-body"> - <div class="paragraph"> -<p>違いはない。ただのエイリアス。</p> -</div> - </div> -</section> -<section class="section-1"> - <h2 id="" class="section-header"> - - 調査記録 - - </h2> - <div class="section-body"> - <div class="paragraph"> -<p>Vim の autocmd events には似通った名前のものがいくつかある。大抵は -<code>:help</code> -に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。</p> -</div> -<div class="ulist"> -<ul> -<li> -<p><code>BufRead</code>/<code>BufReadPost</code></p> -</li> -<li> -<p><code>BufWrite</code>/<code>BufWritePre</code></p> -</li> -<li> -<p><code>BufAdd</code>/<code>BufCreate</code></p> -</li> -</ul> -</div> -<div class="paragraph"> -<p>このうち、<code>BufAdd</code>/<code>BufCreate</code> に関しては、<code>:help BufCreate</code> に</p> -</div> -<div class="quoteblock"> -<blockquote> -<div class="paragraph"> -<p>The BufCreate event is for historic reasons.</p> -</div> -</blockquote> -</div> -<div class="paragraph"> -<p>とあり、おそらくは <code>BufAdd</code> -のエイリアスであろうということがわかる。他の2組も同様ではないかと予想されるが、確認のため -vim と neovim のソースコードを調査した。</p> -</div> -<div class="quoteblock"> -<blockquote> -<div class="paragraph"> -<p>ソースコードへのリンク -<a href="https://github.com/vim/vim/tree/8e6be34338f13a6a625f19bcef82019c9adc65f2">vim -(調査時点での master branch)</a> -<a href="https://github.com/neovim/neovim/tree/71d4f5851f068eeb432af34850dddda8cc1c71e3">neovim -(上に同じ)</a></p> -</div> -</blockquote> -</div> -<section class="section-2"> - <h3 id="" class="section-header"> - - vim のソースコード - - </h3> - <div class="section-body"> - <div class="paragraph"> -<p>以下は、autocmd events -の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。</p> -</div> -<div class="paragraph"> -<p><a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86" class="bare">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86</a></p> -</div> -<div id="source." class="listingblock"> -<div class="content"> -<pre class="rouge highlight"><code data-lang="c"> <span class="p">{</span><span class="s">"BufAdd"</span><span class="p">,</span> <span class="n">EVENT_BUFADD</span><span class="p">},</span> - <span class="p">{</span><span class="s">"BufCreate"</span><span class="p">,</span> <span class="n">EVENT_BUFADD</span><span class="p">},</span></code></pre> -</div> -</div> -<div class="paragraph"> -<p><a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97" class="bare">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97</a></p> -</div> -<div id="source." class="listingblock"> -<div class="content"> -<pre class="rouge highlight"><code data-lang="c"> <span class="p">{</span><span class="s">"BufRead"</span><span class="p">,</span> <span class="n">EVENT_BUFREADPOST</span><span class="p">},</span> - <span class="p">{</span><span class="s">"BufReadCmd"</span><span class="p">,</span> <span class="n">EVENT_BUFREADCMD</span><span class="p">},</span> - <span class="p">{</span><span class="s">"BufReadPost"</span><span class="p">,</span> <span class="n">EVENT_BUFREADPOST</span><span class="p">},</span></code></pre> -</div> -</div> -<div class="paragraph"> -<p><a href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105" class="bare">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105</a></p> -</div> -<div id="source." class="listingblock"> -<div class="content"> -<pre class="rouge highlight"><code data-lang="c"> <span class="p">{</span><span class="s">"BufWrite"</span><span class="p">,</span> <span class="n">EVENT_BUFWRITEPRE</span><span class="p">},</span> - <span class="p">{</span><span class="s">"BufWritePost"</span><span class="p">,</span> <span class="n">EVENT_BUFWRITEPOST</span><span class="p">},</span> - <span class="p">{</span><span class="s">"BufWritePre"</span><span class="p">,</span> <span class="n">EVENT_BUFWRITEPRE</span><span class="p">},</span></code></pre> -</div> -</div> - </div> -</section> -<section class="section-2"> - <h3 id="" class="section-header"> - - neovim のソースコード - - </h3> - <div class="section-body"> - <div class="paragraph"> -<p>neovim の場合でも同様のマッピングが定義されているが、こちらの場合は Lua -で書かれている。以下にある通り、はっきり <code>aliases</code> と書かれている。</p> -</div> -<div class="paragraph"> -<p><a href="https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124" class="bare">https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124</a></p> -</div> -<div id="source." class="listingblock"> -<div class="content"> -<pre class="rouge highlight"><code data-lang="lua"> <span class="n">aliases</span> <span class="o">=</span> <span class="p">{</span> - <span class="n">BufCreate</span> <span class="o">=</span> <span class="s1">'BufAdd'</span><span class="p">,</span> - <span class="n">BufRead</span> <span class="o">=</span> <span class="s1">'BufReadPost'</span><span class="p">,</span> - <span class="n">BufWrite</span> <span class="o">=</span> <span class="s1">'BufWritePre'</span><span class="p">,</span> - <span class="n">FileEncoding</span> <span class="o">=</span> <span class="s1">'EncodingChanged'</span><span class="p">,</span> - <span class="p">},</span></code></pre> -</div> -</div> -<div class="paragraph"> -<p>ところで、上では取り上げなかった <code>FileEncoding</code> だが、これは -<code>:help FileEncoding</code> にしっかりと書いてある。</p> -</div> -<div class="literalblock"> -<div class="content"> -<pre> *FileEncoding* -FileEncoding Obsolete. It still works and is equivalent - to |EncodingChanged|.</pre> -</div> -</div> - </div> -</section> -<section class="section-2"> - <h3 id="" class="section-header"> - - まとめ - - </h3> - <div class="section-body"> - <div class="paragraph"> -<p>記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。</p> -</div> -<div class="ulist"> -<ul> -<li> -<p><code>BufAdd</code>/<code>BufCreate</code></p> -<div class="ulist"> -<ul> -<li> -<p>→ <code>BufCreate</code> は歴史的な理由により (<code>`for historic reasons'') -存在しているため、新しい方 (`BufAdd</code>) を使う</p> -</li> -</ul> -</div> -</li> -<li> -<p><code>BufRead</code>/<code>BufReadPost</code></p> -<div class="ulist"> -<ul> -<li> -<p>→ <code>BufReadPre</code> との対称性のため、あるいは <code>BufWritePost</code> -との対称性のため <code>BufReadPost</code> を使う</p> -</li> -</ul> -</div> -</li> -<li> -<p><code>BufWrite</code>/<code>BufWritePre</code></p> -<div class="ulist"> -<ul> -<li> -<p>→ <code>BufWritePost</code> との対称性のため、あるいは <code>BufReadPre</code> -との対称性のため <code>BufWritePre</code> を使う</p> -</li> -</ul> -</div> -</li> -<li> -<p><code>FileEncoding</code>/<code>EncodingChanged</code></p> -<div class="ulist"> -<ul> -<li> -<p>→ <code>FileEncoding</code> は <code>`Obsolete'' -と明言されているので、`EncodingChanged</code> を使う</p> -</li> -</ul> -</div> -</li> -</ul> -</div> -<div class="paragraph"> -<p>ところでこの調査で知ったのだが、<code>BufRead</code> と <code>BufWrite</code> -は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら -<code>Pre</code>/<code>Post</code> 付きのものを使った方が分かりやすいだろう。</p> -</div> - </div> -</section> - </div> -</section> </div> - </article> </main> <footer class="footer"> |
