ファイルを Vim に保存する前に変更を確認できますか?
質問
私はヴィムを使っています。ファイルを開きます。編集したのですが、保存する前に編集内容を確認したいと考えています。
Vim でこれを行うにはどうすればよいでしょうか?
解決
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 % -
コマンドの説明について質問する人がいたため、
:w !diff % -
より詳細な回答を書こうとする私の試みは次のとおりです。
次のシステムで作業していると仮定します。 cat
そして echo
インストールされています(例:ほぼすべての GNU/Linux、Mac OS、BSD、およびその他の UNIX 系システム)。
上記のコマンドは次のように機能します。
vim でファイルを保存するための構文は次のとおりです。
:w <filename>
vim でシェル コマンドを実行するための構文は次のとおりです。
:!<command>
vimが発行するシェル環境内
%
たまたま現在のファイル名を指していました。これを確認するには、次のコマンドを実行します。:!echo %
これによりファイル名が出力されるはずです (ファイル名なしで vim が実行された場合はエラーが発生します)。
cat を使用すると、ファイルの内容を出力することもできます。
:!cat %
これにより、ファイルの内容が最後に保存された状態で返されるか、一度も保存されていない場合はエラーが返されます。
プログラム diff は標準入力 (stdin) から読み取ることができます。そのマニュアルページには次のように記載されています。
[...] FILE が '-' の場合、標準入力を読み取ります。[...]
ファイル名を指定せずにシェルコマンドを使用して save コマンドを実行すると、vim はファイルの内容を物理ファイルに保存する代わりにシェルの標準入力に書き込みます。これを確認するには、次のコマンドを実行します。
:w !cat
これにより、ファイルの現在の内容が常に出力されます (代わりにファイルに書き込まれます)。
それをまとめる (または tl;dr):ファイルは標準入力に「保存」され、ファイル名と標準入力を入力として diff が実行されます。
これを知っていれば、次のようなことを行う vimdiff を使用してファイルを比較することもできます。これは単なるアイデアであり、これを実行したくないです。
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(その後、readonly を開いて vimdiff を閉じます。 :qall
)
私はいつも diffchanges に好きしましたます。
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
ソース以下と使用:DIFFコマンド
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
あなたが探しているれていない正確に何が、 SCMDiff.vim 本当にクールです。一つのキー押下、それデフハイライトソースコントロールレポのヘッドリビジョンを使用して現在のファイル。多くのSCMSで動作するように意図しています。私はPERFORCEのとそれを使用します。
ここでは異なる回答に基づいて、プラグインがあります: https://github.com/gangleri/vim -diffsavedする
これは:w !diff % -
方法とより複雑diffthis
いずれかを提供する。
を除けば undotree のからも、これを可能にするだけでなく、より多くの(異なるアンドゥチェックポイント間の差分) 。 Gundo のに似ています。
お勧めできます ヒストウィン プラグイン。
それは違いはありませんが、 現在保存されている ファイルのバージョン(他の回答と同様)、それは可能です 編集を開始してから vimdiff が変更されました, 、さらには リプレイ 順番に変更してください。途中で保存すると違いが現れます。
さらに、次のリストが表示されます。 すべての元に戻す履歴ブランチ それらを切り替えたり、比較したりすることができます。
追伸:プラグインは、ファイルが変更されるたびに編集履歴の瞬間を自動的に追跡しませんが、必要に応じて、ファイルを保存するときにその瞬間を明示的に「タグ付け」して、後でそのファイルを vimdiff できるようにすることができます。おそらくこれは自動化できるでしょうか?
あなたははvimdiffでのように、比較のためのvimを使用したい場合は、あなたがこのような何かを行うことができます:
あなたの.vimrcを編集し、追加します:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
にそこから、あなたの変更を確認し、コマンドモードでF8キーを押すことではvimdiffのようqall
を使用して差分ビューを終了することができます。あなたが好きな任意のキーとF8を交換します。
編集:それは保存されていないため、追加-Mは、任意の変更を禁止する
。上記の私はあまり好きではGitの差分を使用し示唆従います:
:w !git diff % -