ラベル Vim の投稿を表示しています。 すべての投稿を表示
ラベル Vim の投稿を表示しています。 すべての投稿を表示

2014年10月22日水曜日

vimdiffで単語単位の差分表示: diffchar.vimが超便利

今日もプログラミングや文書作成にvimを巧みに操り続ける全国のvimmerの皆様におかれましては、vimを利用した差分表示であるvimdiffは欠かせないツールであることと思います。

当方も今までvimdiffについては色を見やすくしたり差分計算アルゴリズムを賢くしたりと、カスタマイズによって使い勝手を向上させてきましたが、唯一実現できていなかったのが、「単語単位の差分表示」なのであります。

しかしついに、vimdiffで単語単位の差分を表示できるようにするvimプラグイン「diffchar.vim」を先日見つけました。最初の公開が今年5月という新しいプラグインです。
diffchar.vim - Highlight the exact differences, based on characters and words : vim online

ということで、早速インストール。このプラグインはGithubにもミラーされており、すでにNeoBundleをお使いであれば導入はとっても簡単で次の一行を.vimrcに追加して ":NeoBundleInstall" するだけです。それ以外の場合については省略。

NeoBundle 'vim-scripts/diffchar.vim'

実際サンプルで試してみましょう。まず、vimdiffで差分を表示させると、次のようになりますね。


一つの行に複数箇所の変更が含まれる場合も、最初の変更から最後の変更までを含むような大きな1つの変更として認識されてしまっています。

しかしここで<F7>キーを押すと!


うおおおおぉ!すばらしい。単語単位の差分を表示できました。一行に複数の変更があってもちゃんと認識して表示。しかも、追加部分と変更部分で色分けもされています。

ちなみに、再度<F7>キーを押すと元に戻ります。なお、<F7>キーは文書全体について単語単位の差分表示を切り替えますが、<F8>キーを押すと現在の行のみ単語単位の差分表示を切り替えることができます。

これだけでも便利ですが、欲を言えば、vimdiffコマンド実行時やgit diftoolにvimdiffを使っている時に、いちいち<F7>を押すのは面倒。そんな時には、

" vimdiffで起動した際自動的に単語単位の差分(diffchar.vim)を有効にする
if &diff
  augroup enable_diffchar
    autocmd!
    autocmd VimEnter * execute "%SDChar"
  augroup END
endif

と.vimrcに書いておけばOK。vimdiffコマンドで起動した時には自動的に単語単位の差分が有効になります。(この場合、単語単位の差分をOFFにしたければ<F7>キーを押す、という使い方になります。)

これでvimdiffで差分をチェックする作業が一層はかどりますね。

※補足:autocmdのイベントはFilterWritePost、BufReadPost 、BufWinEnterなども試しましたが、FilterWritePostでは効果がなく、BufReadPostやBufWinEnterだとどうやらdiff表示途中に実行されてしまうらしく余計な箇所まで単語単位で差分表示しようとしてしまい表示が崩れます。VimEnterを指定したら期待した動作になりました。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうぞ。

2014年4月10日木曜日

Vim使いにもお勧めするEclipseの併用方法

もともと昔から開発はEclipseで行っていましたが、今はRubyを書いていくのがVimの方がやりやすいため、コードはVimで書いています。さらに、gitのコミットなどの操作もEclipseからではなく、ターミナル上のgitコマンドで行うようにしています(こちらは、Eclipseはシンボリックリンクを含むgitリポジトリの扱いにバグがあるため)。

逆に、Eclipseを使っていない人もいると思うんですよね。僕の周囲にはそういう人も居ます。確かに、Vimとターミナル上の各種コマンドで全てのことはできるっちゃできるんですが、Eclipseを併用すると色々な場面で効率を上げることができます。

僕がEclipseで活用している機能のうち、特に役立つと思うものをいくつか紹介します。

・ファイル検索

grepコマンドやfindコマンドでも同様のことができますが、Eclipseは結果表示の一覧性が良く、結果からエディターのヒット箇所へジャンプしつつ、結果を次々と見ていけたりできます。検索範囲をファイルツリーから選ぶのも直感的にできますし、使える正規表現もgrepより多いです。
操作方法:プロジェクト・エクスプローラ上で、検索したい範囲を選択した上でメニューから「検索>検索...」を選びます。

・gitヒストリー(コミットグラフ)の閲覧

これがあるからEclipseを併用していると言っても過言ではないです。gitのコミットグラフを可視化するツールはいくつも試しましたが、Eclipse(の標準プラグインEGit)が一番綺麗で見やすいと思います。
操作方法:プロジェクト・エクスプローラ上でプロジェクトのトップディレクトリを右クリックして「チーム>ヒストリーに表示」を選びます。

・gitコミット直前の確認ダイアログ

コミットする際に変更のあったファイル一覧は、ターミナル上でgitコマンドによるコミットを行う場合も出てきますけれども、Eclipseの場合ダイアログが表示されて変更のあったファイルと変更の種類を一覧で出すとともに、その一覧のファイルをダブルクリックすると、コミットしようとしている差分を表示してくれます。僕はここで差分だけ確認したらキャンセルして、実際のコミット操作はターミナル上のgitコマンドで行っています。
操作方法:プロジェクト・エクスプローラ上でプロジェクトのトップディレクトリを右クリックして「チーム>コミット...」を選びます。

・ディレクトリ単位での比較

比較結果がディレクトリ構造にのっとってツリー状に表示されるため、変更箇所が分かりやすいです。
操作方法:プロジェクト・エクスプローラ上で比較したい2つのディレクトリを選択した状態で右クリックして「比較>相互」を選びます。

他にも色々機能はありますが、上で述べた機能が最もよく使いますし、これらだけでも使いこなせば、Vimとターミナルだけで開発を進めるよりも一段高い生産性を発揮できることでしょう。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうぞ。

2014年3月29日土曜日

VimとEmacs両方に慣れておくべき理由

エディタ界の2大巨塔といえば、言わずと知れた Vim と Emacs でございますが、まあ僕は不毛な宗教論争に関わるつもりはありませんので、どっちを使うべきだなんて言うつもりは毛頭ございません。

学生時代にUnix/Linuxに触って最初に使ったエディタがEmacsでした。その頃はVimは全く使わず、Emacsで全てのテキスト編集を行っていた時期が2年くらい続いたと思います。Lispでカスタマイズも色々やりました。

ある時とある先輩にVimを強力にお勧めされて使い始め、慣れるために卒論を全部Vimで書いたことでVim使いになりました。慣れるまでには結構苦労しましたけど、慣れると便利ですよね。プログラミングをするなら断然Vim派です。普段使うエディタはVimになっていきました。

こんな経緯があって、両方のキー操作の流儀を身に付けたんですが、普段エディタとしてはVimを使っていますが、Emacsのキー操作でテキストを編集することも結構あるのです。

例えばメールを書く時は、昔はメーラー、今はGmailを使いますけれども、この時はEmacsのキー操作を使います。WindowsでしたらAutoHotKeyなんかで結構簡単に実現できますし、MacだとデフォルトでEmacs風のキー操作を受け付けてくれます。。それに限らず、テキストエディタ以外の部分でのテキスト入力はほぼすべてEmacsのキー操作でやっています。

その上で、テキストエディタはVimですね。カーソル移動やコピー&ペースト、入力などを使いこなすと非常に便利で、繰り返しになりますけれどもプログラミングをするなら断然Vimが快適です。

ということで、Emacs風のキー操作とVim風のキー操作の両方に慣れておくと、状況に応じて使い分けられて便利ですよ、という話でした。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうぞ。

2014年3月28日金曜日

vimdiffの色設定を変更して見やすくする(黒背景用)

Linuxにおける差分表示ツールとしてはdiffコマンドがありますけれども、複雑な変更になってくるとvimdiffが使いやすい場面も多々あるわけでございます。特に横に並べて比較できるのは大きなメリットですよね。

ところが、デフォルトの設定ですと結構色が見辛いわけで、何とかしたいわけです。ちょっと検索して調べてみましたが、自分が思うような色設定がどっかに載ってたりとかしなかったので、自分で設定してみることにしましたよ。いつも黒背景で使っておりますので、そこに最適化してあることにご注意ください。

というわけで、下記の記述を .vimrc に加えればOKです。

" vimdiffの色設定
highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=22
highlight DiffDelete cterm=bold ctermfg=10 ctermbg=52
highlight DiffChange cterm=bold ctermfg=10 ctermbg=17
highlight DiffText   cterm=bold ctermfg=10 ctermbg=21

これでvimdiffコマンドを実行するとこのようになります。


背景の色を差分の種類によって分けており、追加行は緑、削除行は赤、変更行は青で変更部分が明るい青になってます。

これでだいぶ見やすくなるんじゃないかと思います。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうぞ。