1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>[Vim] autocmd events の BufWrite/BufWritePre の違い | REPL: Rest-Eat-Program Loop</title>
<meta name="description" content="この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/79ab4db8564032de0b25 TL; DR 違いはない。ただのエイリアス。 調査記録 Vim の autocmd events には似通った名前のものがいくつかある。大抵は :help">
<meta name="author" content="">
<link href="https://blog.nsfisis.dev/an-old-hope.min.css" rel="stylesheet">
<link href="https://blog.nsfisis.dev/style.css" rel="stylesheet">
<link href="https://blog.nsfisis.dev/custom.css" rel="stylesheet">
<link rel="icon" href="https://blog.nsfisis.dev/favicon.svg">
<meta name="generator" content="Hugo 0.88.1" />
</head>
<body class="single">
<header class="header">
<nav class="nav">
<p class="logo"><a href="https://blog.nsfisis.dev">REPL: Rest-Eat-Program Loop</a></p>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">[Vim] autocmd events の BufWrite/BufWritePre の違い</h1>
<div class="post-meta">2021-10-02</div>
<ul class="post-tags">
<li><a href="https://blog.nsfisis.dev/tags/vim">vim</a></li>
</ul>
</header>
<div class="post-content"><p>この記事は Qiita から移植してきたものです。
元 URL: <a href="https://qiita.com/nsfisis/items/79ab4db8564032de0b25">https://qiita.com/nsfisis/items/79ab4db8564032de0b25</a></p>
<hr>
<h1 id="tl-dr">TL; DR</h1>
<p>違いはない。ただのエイリアス。</p>
<h1 id="調査記録">調査記録</h1>
<p>Vim の autocmd events には似通った名前のものがいくつかある。大抵は <code>:help</code> に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。</p>
<ul>
<li><code>BufRead</code>/<code>BufReadPost</code></li>
<li><code>BufWrite</code>/<code>BufWritePre</code></li>
<li><code>BufAdd</code>/<code>BufCreate</code></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 href="https://github.com/vim/vim/tree/8e6be34338f13a6a625f19bcef82019c9adc65f2">vim (調査時点での master branch)</a>
<a href="https://github.com/neovim/neovim/tree/71d4f5851f068eeb432af34850dddda8cc1c71e3">neovim (上に同じ)</a></p>
</blockquote>
<h2 id="vim-のソースコード">vim のソースコード</h2>
<p>以下は、autocmd events の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。</p>
<p><a 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>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c" data-lang="c"> {<span style="color:#e6db74">"BufAdd"</span>, EVENT_BUFADD},
{<span style="color:#e6db74">"BufCreate"</span>, EVENT_BUFADD},
</code></pre></div><p><a 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>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c" data-lang="c"> {<span style="color:#e6db74">"BufRead"</span>, EVENT_BUFREADPOST},
{<span style="color:#e6db74">"BufReadCmd"</span>, EVENT_BUFREADCMD},
{<span style="color:#e6db74">"BufReadPost"</span>, EVENT_BUFREADPOST},
</code></pre></div><p><a 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>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c" data-lang="c"> {<span style="color:#e6db74">"BufWrite"</span>, EVENT_BUFWRITEPRE},
{<span style="color:#e6db74">"BufWritePost"</span>, EVENT_BUFWRITEPOST},
{<span style="color:#e6db74">"BufWritePre"</span>, EVENT_BUFWRITEPRE},
</code></pre></div><h2 id="neovim-のソースコード">neovim のソースコード</h2>
<p>neovim の場合でも同様のマッピングが定義されているが、こちらの場合は Lua で書かれている。以下にある通り、はっきり <code>aliases</code> と書かれている。</p>
<p><a 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>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-lua" data-lang="lua"> aliases <span style="color:#f92672">=</span> {
BufCreate <span style="color:#f92672">=</span> <span style="color:#e6db74">'BufAdd'</span>,
BufRead <span style="color:#f92672">=</span> <span style="color:#e6db74">'BufReadPost'</span>,
BufWrite <span style="color:#f92672">=</span> <span style="color:#e6db74">'BufWritePre'</span>,
FileEncoding <span style="color:#f92672">=</span> <span style="color:#e6db74">'EncodingChanged'</span>,
},
</code></pre></div><p>ところで、上では取り上げなかった <code>FileEncoding</code> だが、これは <code>:help FileEncoding</code> にしっかりと書いてある。</p>
<pre tabindex="0"><code> *FileEncoding*
FileEncoding Obsolete. It still works and is equivalent
to |EncodingChanged|.
</code></pre><h2 id="まとめ">まとめ</h2>
<p>記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。</p>
<ul>
<li><code>BufAdd</code>/<code>BufCreate</code>
<ul>
<li>→ <code>BufCreate</code> は歴史的な理由により (“for historic reasons”) 存在しているため、新しい方 (<code>BufAdd</code>) を使う</li>
</ul>
</li>
<li><code>BufRead</code>/<code>BufReadPost</code>
<ul>
<li>→ <code>BufReadPre</code> との対称性のため、あるいは <code>BufWritePost</code> との対称性のため <code>BufReadPost</code> を使う</li>
</ul>
</li>
<li><code>BufWrite</code>/<code>BufWritePre</code>
<ul>
<li>→ <code>BufWritePost</code> との対称性のため、あるいは <code>BufReadPre</code> との対称性のため <code>BufWritePre</code> を使う</li>
</ul>
</li>
<li><code>FileEncoding</code>/<code>EncodingChanged</code>
<ul>
<li>→ <code>FileEncoding</code> は “Obsolete” と明言されているので、<code>EncodingChanged</code> を使う</li>
</ul>
</li>
</ul>
<p>ところでこの調査で知ったのだが、<code>BufRead</code> と <code>BufWrite</code> は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら <code>Pre</code>/<code>Post</code> 付きのものを使った方が分かりやすいだろう。</p>
</div>
</article></main>
<footer class="footer">
<span>© 2022 <a href="https://blog.nsfisis.dev">REPL: Rest-Eat-Program Loop</a></span>
<span>·</span>
<span>Powered by <a href="https://gohugo.io/" rel="noopener" target="_blank">Hugo️️</a>️</span>
</footer>
<script src="https://blog.nsfisis.dev/highlight.min.js"></script>
<script>
hljs.initHighlightingOnLoad();
</script>
</body>
</html>
|