回答:
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
以下は、現在編集されているファイルとファイルシステム内の未変更のバージョンとの違いを確認するための関数とコマンドです。これをvimrcまたはプラグインディレクトリに配置し、ファイルを開いて、保存せずに変更を加えてください
:DiffSaved
。function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
差分ビューから抜け出すには、
:diffoff
コマンドを使用できます。以下は、
'cvs diff'
コマンドを模倣するように適合された同様の関数です...
:w !diff % -
diff
。 %
現在開いているファイルパスを参照します。なぜこれが:w
コマンドの引数なのですか?また、どのように-
作業バッファーの内容に割り当てられますか?それはvimで自動ですか、バッファーの内容(またはおそらくバッファー内の特定の範囲)がシェルコマンドの標準入力に割り当てられますか?
:w
コマンド(stdin
)にファイルを書き込んでいるため、これは引数です。コマンドで、-
から読み取るように指示しますstdin
。
:w !git diff % -
、gitがインストールされている場合は、カラーバージョンに使用します。
fatal: bad flag '-' used after filename
実行するとエラーが発生します:w !git diff % -
。
一部の人々はコマンドの説明について尋ねたので
:w !diff % -
これが、より詳細な回答を書くための私の試みです。
私はあなたがシステム上で作業していると仮定していますcat
し、echo
(例えば、ほぼすべてのGNU / Linuxの、マックOS、BSDや他のUNIXライクなシステム)をインストール。
上記のコマンドは次のように機能します。
vimでファイルを保存するための構文は次のとおりです。
:w <filename>
vimでシェルコマンドを実行するための構文は次のとおりです。
:!<command>
vimによって発行されたシェル環境内では、%
たまたま現在のファイル名を指しています。これを確認するには、次のコマンドを実行します。
:!echo %
これにより、ファイル名(または、ファイル名なしでvimが実行された場合はエラー)が出力されます。
catを使用して、ファイルの内容を出力することもできます。
:!cat %
これは、最後に保存された状態のファイルコンテンツ、または一度も保存されていない場合はエラーを返します。
プログラムdiffは標準入力(stdin)から読み取ることができます。マニュアルページには次のように記載されています。
[...] FILEが '-'の場合、標準入力を読み取ります。[...]
ファイル名なしでsaveコマンドを実行すると、その背後でシェルコマンドが実行されるため、vimはファイルの内容を物理ファイルに保存するのではなく、シェルのstdinに書き込みます。これを確認するには、
:w !cat
これにより、常にファイルの現在のコンテンツが印刷されます(代わりにファイルに書き込まれます)。
まとめる(またはtl; dr):ファイルはstdinに「保存」され、diffはファイル名とstdinを入力として実行されます。
これを知っていれば、ファイルをvimdiffと比較して次のようなことを行うこともできます。これは、これを実行したくないアイデアにすぎません。
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(次に、読み取り専用で開き、vimdiffを閉じます:qall
)
vim - -c ":vnew $1 |windo diffthis"
例えばようPATHにそれを保存し、それを実行作製vimdiffWithStdin
し、次いでVIMで次のコマンドと比較する::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
。Windowsにも同様のトリックが存在するかどうかはわかりません。
私はいつもdiffchangesが好きです -素晴らしく、シンプルで、うまくいきます。
:DiffChangesDiffToggle
。
vimrc_example.vimから:
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
w !diff % -
リモートソースに対しても機能することです(例:vim sftp://example.com/foo.txt
)
あなたが探しているものと完全に一致しているわけではありませんが、SCMDiff.vimは本当にクールです。キーを1回押すと、ソース管理リポジトリの現在のファイルの最新リビジョンが差分ハイライト表示されます。多くのSCMSで動作することを意味します。perforceで使用します。
vimdiffのように比較にvimを使用したい場合は、次のようにすることができます。
.vimrcを編集して、以下を追加します。
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
そこから変更qall
が表示され、コマンドモードでF8を押すことにより、vimdiffのようにdiffビューを終了できます。F8を任意のキーに置き換えます。
編集:保存されていないため、変更を許可しない-Mが追加されました。
Vim: Error reading input, exiting...
しましたが、ここで何が問題になっていますか?
gitは次のコマンドをサポートしています
:w !git diff --no-index -- % -
〜/ .vimrcに以下を追加してコマンドにマッピングします
command GitDiff execute "w !git diff --no-index -- % -"
これで、実行:GitDiff
は便利な小さなコマンドになり、保存する前に差分をすばやく表示できます。
vimに最後のバックアップと元のバックアップを作成させることができます:
:set backup
:set patchmode=.orig
その後、それらを分割して開くことができます。
:vsp %:p~ or :vsp %:.orig
そしてそこから:
:vimdiff in each buffer
残り物がまったくなくてもvimdiffが必要な場合は、次のようにすることもできます。
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
そして、分割ごとに:diffthisを実行します
編集した変更[ buffer ]、つまり最後に保存されたバージョン(作業ディレクトリ内)と異なる変更は、最後のインデックスバージョン(Git)と異なる場合があります。私は両方をマッピングしました:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
function! s:DiffWithSaved()
let filetype=&ft
diffthis
vnew | r # | normal! 1Gdd
diffthis
exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction
com! DiffSaved call s:DiffWithSaved()
vimdiffとGdiffの例。
さらに、vimdiff
他のパスにある同音異義語ファイルを簡単にするには:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
Gdiff
可能であれば、(Gitプロジェクトではないなどの)それからを実行し:vimdiff
ます。とtry-catch-endtry
。しかし:DiffWithSaved
、Gitプロジェクトではこの方法が欠けています。
:w !diff % -
.vimrcを簡単に変更できない、絶え間なく変化する多数のボックスでvimを使用している場合、代替の優れた方法ではありませんか?(diffがインストールされている場合)