読者です 読者をやめる 読者になる 読者になる

Vimと日本語編集(2): 修正前後の原稿の差分を一瞬でチェックする

Vimと日本語編集シリーズ第2回。
前回はこちら。
note103.hateblo.jp

けっこうニッチな内容だったと思うが、今回はもう少し使用頻度&汎用性が高いかもしれない。

前提・状況設定

複数人で利用・共有するドキュメントがあるとして、それをまず自分が書いたとしよう。

大体内容がまとまったのでデータを他のメンバーに渡し、「気になるところがあったら適当に手を入れといて」なんて言っておいたら、しばらくして修正版が届いたとしよう。

でもパッと見たところ、どこが修正されたのかわからない。

たとえば、これが修正前。*1

f:id:note103:20160907004614p:plain

そして修正後。

f:id:note103:20160907004624p:plain

そのようなときに、どうするか。

よくある解決策・その何が問題か

一番容易な選択肢としては、「じっくり見る」。
まあ、数百字程度ならありかもしれない。
とはいえ、人間に向いた作業かは微妙。避けられるなら、あまりやりたくない。

次に容易な選択肢としては、「どこ直したの?」と相手に聞く。
でも面倒くさい。すぐに返答があるとは限らないし、本人だからといって正確な差分を示せる保証もない。(だから最初の選択肢が「とりあえずじっくり見る」になってしまう)

これがエンジニア同士なら、最初からそのドキュメントはGit管理されていて、すべての差分を簡単にチェックできるようになっているかもしれない。
さらにそれがGitHubやBitbucketで共有されているなら、その視認性はさらに高まるだろう。

しかし仮に自分がエンジニアだったとしても、相手がGitを使えない人だったり、ドキュメントの性質としてGit管理の必要がないテンポラリなものだから、といった理由で差分管理が成されていなかったらどうだろう?

僕は普段の作業でGitを使っているけど、それでも既存のリポジトリには入っていない、突発的で一時的なちょっとしたドキュメントの差分を見たい、という状況にちょくちょく陥る。
そのようなとき、そのちょっとした差分を見るためだけにわざわざリポジトリを作るとか、GitHubなどにpushするというのも面倒である。

解決策

というわけで、やっているのは次のこと。

1. 白紙のバッファに差分を見たいドキュメントの「修正前」の文章をコピペ。

2. 新規で無名の分割バッファを出して、「修正後」の文章をコピペ。
この際、新規バッファを水平分割で出すなら

:new

タテ分割なら

:vnew

とすればよい。

3. おもむろに以下を打ち込む。

:windo diffthis

差分が出る。

f:id:note103:20160906231653p:plain

左が修正前。右が修正後。
変更が生じた行だけでなく、文字単位で出てくるのがよい。

差分表示を消すには以下。

:windo diffoff

上記についてはすべてVimcastsのこちらから学んだ。
Comparing buffers with vimdiff

目的の内容以外にも、その過程で次々と小ネタが繰り出されるので目が離せない。すごいコンテンツ力……。

なお、上記のexコマンドを毎回打つのは面倒なので、このようなマッピングを入れている。

nnoremap <silent> <Leader>dt :<C-u>windo diffthis<CR>
nnoremap <silent> <Leader>do :<C-u>windo diffoff<CR>

上では二つのバッファをどちらも無名ファイルにしたが、無名である必要はとくにない。
既存のファイルを二つ並べるのでも、片方だけ無名にするのでもよい。(上述のVimcastsでは片方だけ無名だった)

別解

fugitive.vim / Gdiff

もしリポジトリ管理しているファイルで同様のことをやるなら、fugitive.vimの「:Gdiff」も便利だと思う。
GitHub - tpope/vim-fugitive: fugitive.vim: a Git wrapper so awesome, it should be illegal

というか、上で紹介した方法を知るまではずっとこれでやってた。

fugitive.vimの使い方に関しては、以下の記事がとてもわかりやすい。
blog.yuku-t.com
cohama.hateblo.jp

diffsplit, VDSplit

また、今回の記事を書くためにいろいろ確認するうちにたまたま辿りついたのだけど、以下で紹介されている「:diffsplit」や「:VDSplit」でも同様のことをできるみたい。(後者はKaoriya版限定)
nanasi.jp

用途によってどれがより適している、といったこともありそうだが、そこまでは把握できていない。

まとめ

GitHubなどで色付きの、人に優しいdiffを見慣れていると、差分を知らされず変更後のドキュメントだけを渡されたときにある種の禁断症状に陥ってしまいそうな気になる。

差分を目視で確認するのも、口頭で教えてもらうのも、メールやチャットのテキストで説明を聞くのも、すべて「異様に長い箸で数メートル先の豆をつまむ」ようなもどかしさを感じる。

パパッとコマンドを打って、どの行のどの文字が変更されたのか。そして(もしかしたら変更箇所以上に)「どこが変更されていないのか」といったことがわかると、こみ上げかかったストレスが急速に収まってよい。