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

[Vim]vimdiffで差分を表示・マージして元ファイルとの差分を確認する

よく vimdiff で差分を取るのだけれどマージのコマンドを忘れてしまうので備忘録。

vimdiff file1 file2


まあ、これは基本。
初期設定の vimdiff の配色はすごく目に悪い感じだったので .vimrc に以下の設定をした。
hi DiffAdd    ctermfg=black ctermbg=2
hi DiffChange ctermfg=black ctermbg=3
hi DiffDelete ctermfg=black ctermbg=6
hi DiffText   ctermfg=black ctermbg=7
参考: そんな僕らはコピペプログラマー!: vi・vim : vimdiffの色設定

ココから差分を確認してマージしていくにはマージした行にカーソルを合わせる必要がある。
吹き出しの根本がカーソルのある画面。

新規行の右方向のマージ

左画面の新規行にカーソルを合わせて dp


コマンドさえ覚えていればそこまで問題ない。
diff put で dp

変更行の左方向のマージ

左画面の行にカーソルを合わせて do


こちらもコマンドさえ覚えていれば問題ない。
diff obtain で do

変更行の右方向のマージ

左画面の行にカーソルを合わせて dp


変更行の時も新規行と同様にマージしたい行にカーソルを合わせてコマンドを実行するだけ。

新規行の左方向のマージ

右画面の新規行にカーソルを合わせて dp


コレが一番のクセモノ。
dp, do コマンドを実行するにはマージしたい行にカーソルを合わせる必要があるが、
右画面のファイルで新規の場合は左画面のファイルには存在しない行なのでカーソルを合わせることができない。
そのため、右画面へ移動してマージしたい行にカーソルを合わせて dp コマンドで取り込む必要がある。
左画面から右画面への移動は Ctrl + W, Ctrl + W で行う。逆も同様。

左画面の新規行の下の行にカーソルを合わせて do

この記事を書いていて気がついたのだが、
左画面の新規行(カーソルが置けない)の下の行にカーソルを合わせて do コマンドで取り込むことで、
右画面の新規行を左画面にマージすることができる。
わざわざ左画面から右画面へ移動する必要なんてなかった。

元ファイルとの差分を確認する

:DiffOrig


上の vimdiff 画面で右画面へ移動し、 右画面を :q コマンドなどで終了、閉じた後、
:DiffOrig コマンドを実行すると上の画像のようになる。
左下に [Scratch] と書かれている方が元ファイルである。
先ほどと左右が逆になって左画面だった編集後のファイルが右画面になる。
上のマージ操作で取り込んだもの(変更業の左方向のマージ、新規行の左方向のマージ)が差分として現れている。
これで意図しないマージをしていないか確認することができる。

※注意
Vim のチュートリアルと基本設定 | DevAchieveで解説した
$VIMRUNTIME/vimrc_example.vim の設定をしていないと DiffOrig が使えない。
以下が設定してあれば使用できるので設定しておいたほうが良い。
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis
endif

おまけ

差分のある行への移動

] + c : 次の差分の行へ移動
[ + c : 前の差分の行へ移動

参考
2つのテキストファイルの差分をマージする — 名無しのvim使い
最後に保存してから、どのくらい編集したのかの差分を表示 — 名無しのvim使い
2013/07/13

Vim のチュートリアルと基本設定

もっぱら GUI を使っていますが CUI ともお友達にならなきゃいけないので
CUI のエディタである Vim のチュートリアルをやってみました。
また、その中で出た設定ファイルも組み込んでみました。

Vim のチュートリアルは Vim が入っていればたぶん入っていて、
以下のコマンドを実行すれば良いです。
vimtutor ja
全7章からなる Vim の基本的な使い方のチュートリアルです。
30分くらいでできると思うので使う人は是非やってみることをオススメします。

その中で Vim の設定ファイルである .vimrc の例があったのでこちらに少しいじったのを載せておきます。
原文は適当なファイルで以下のコマンドを実行して確認してください。
:read $VIMRUNTIME/vimrc_example.vim
" :read $VIMRUNTIME/vimrc_example.vim

" When started as "evim", evim.vim will already have done these settings.
" "evim" コマンドで開始した場合は設定済みとして読み込まずに終了する。
if v:progname =~? "evim"
  finish
endif

" Use Vim settings, rather than Vi settings (much better!).
" This must be first, because it changes other options as a side effect.
" Vi の設定よりも Vim の設定を使用する。
" これは副作用として他のオプションを変更するため最初に記述する。
set nocompatible

" allow backspacing over everything in insert mode
" 挿入モードの全てにおいてバックスペースを許可する
set backspace=indent,eol,start

if has("vms")
  set nobackup    " do not keep a backup file, use versions instead
else
  set backup      " keep a backup file
endif
set history=50    " keep 50 lines of command line history
                  " コマンドライン履歴を50行保持する
set ruler         " show the cursor position all the time
                  " 常にカーソルのポジションを表示する
set showcmd       " display incomplete commands
                  " 不完全なコマンドを表示する
set incsearch     " do incremental searching
                  " インクリメンタルサーチをする

" Don't use Ex mode, use Q for formatting
" フォーマットに Q を使用する Ex モードを使用しない。
map Q gq

" CTRL-U in insert mode deletes a lot.  Use CTRL-G u to first break undo,
" so that you can undo CTRL-U after inserting a line break.
" 挿入モードでの CTRL-U で たくさん削除する。
" 改行を入れた後の CTRL-U で元に戻せるようにするために、
" まず CTRL-G u を使ってアンドゥを中断してください。
inoremap <C-U> <C-G>u<C-U>

" In many terminal emulators the mouse works just fine, thus enable it.
" 多くのターミナルエミュレータでマウスは良い働きをするので有効化する。
if has('mouse')
  set mouse=a
endif

" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
" ターミナルに色がある場合、シンタックスハイライトを ON に変更する。
if &t_Co > 2 || has("gui_running")
  syntax on
  set hlsearch
endif

" Only do this part when compiled with support for autocommands.
" autocommands のサポートが有効な場合のみこの部分を実行する
if has("autocmd")

  " Enable file type detection.
  " ファイルタイプ検出を有効にする。
  " Use the default filetype settings, so that mail gets 'tw' set to 72,
  " 'cindent' is on in C files, etc.
  " Also load indent files, to automatically do language-dependent indenting.
  " デフォルトのファイルタイプ設定を使用する。
  " また、言語ごとのインデントを自動実行するためのインデントファイルを読み込む。
  filetype plugin indent on

  " Put these in an autocmd group, so that we can delete them easily.
  " 削除しやすいように autocmd グループにこれらを記述する。
  augroup vimrcEx
  au!

  " For all text files set 'textwidth' to 78 characters.
  " すべてのテキストファイルについてテキスト幅は 78 文字にセットする。
  autocmd FileType text setlocal textwidth=78

  " When editing a file, always jump to the last known cursor position.
  " ファイルの編集中に常に最後のカーソルポジションにファンプできるようにする。
  " Don't do it when the position is invalid or when inside an event handler
  " (happens when dropping a file on gvim).
  " Also don't do it when the mark is in the first line, that is the default
  " position when opening a file.
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

  augroup END

else

  set autoindent    " always set autoindenting on
                    " 常にオートインデントを ON にする。

endif " has("autocmd")

" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
" 変更前と変更後の diff を確認する便利コマンド
" Only define it when not defined already.
" すでに定義されていない場合のみ定義する。
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis
endif
訳文は怪しいところがチラホラ。意味や動きがよくわかってない設定もチラホラ。
とりあえず設定を書いて読み込むと Vim がカラーついて便利になると思います。

僕は直接コレを ~/.vimrc には書きたくなかったので .vimrc.ex を用意して .vimrc から読み込むことにしました。
参考: Vim-users.jp - Hack #108: vimrc で外部ファイルを取り込む
構造は以下のとおりです。
.vimrc
.vim
└── .vimrc.ex
" 基本的な Vim の設定(必ず最初に読み込む)
if filereadable(expand('~/.vim/.vimrc.ex'))
  source ~/.vim/.vimrc.ex
endif

" 以下、その他の自分で追加した設定
使い方も覚えてちょっと便利になったので少しずつ改良していきたいです。

タグ(RSS)