私はヴィムを使っています。ファイルを開きます。編集して、保存する前に編集内容を確認したい。
Vimでこれを行うにはどうすればよいですか?
:w !diff % -
コマンドの説明を聞かれたので
:w !diff % -
より詳細な回答を書くための私の試みは次のとおりです。
cat
がインストールされたシステム (たとえば、ほぼすべての GNU/Linux、Mac OS、BSD、およびecho
その他の UNIX ライクなシステム)で作業していると想定しています。
上記のコマンドは次のように機能します。
vim でファイルを保存するための構文は次のとおりです。
:w <filename>
vim でシェル コマンドを実行するための構文は次のとおりです。
:!<command>
vimによって発行されたシェル環境内では、%
たまたま現在のファイル名を指しています。これを確認するには、次を実行します。
:!echo %
これにより、ファイル名が出力されます (または、vim がファイル名なしで実行された場合はエラーになります)。
cat を使用して、ファイルの内容を出力することもできます。
:!cat %
これにより、ファイルの内容が最後に保存された状態で返されるか、保存されていない場合はエラーが返されます。
プログラム diff は、標準入力 (stdin) から読み取ることができます。そのマニュアルページには次のように記載されています。
[...] FILE が「-」の場合、標準入力を読み取ります。[...]
ファイル名を指定せずに save コマンドを実行し、その後ろにシェル コマンドを実行すると、vim はファイルの内容を物理ファイルに保存するのではなく、シェルの stdin に書き込みます。実行することでこれを確認できます
:w !cat
これにより、ファイルの現在の内容が常に出力されます (代わりにファイルに書き込まれます)。
まとめると (または tl;dr): ファイルは stdin に「保存」され、ファイル名と stdin を入力として diff が実行されます。
これを知っていれば、次のようなことを行う vimdiff でファイルを比較することもできます。
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(次に、読み取り専用で開き、vimdiff を使用して閉じます:qall
)
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()
diff ビューから抜け出すには、
:diffoff
コマンドを使用できます。
'cvs diff'
以下は、コマンドを模倣するように適合された同様の関数です...
私はいつも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
ここにさまざまな回答に基づいたプラグインがあります: https://github.com/gangleri/vim-diffsaved
それは:w !diff % -
方法とより複雑なdiffthis
ものを提供します。
その取り消しツリーとは別に、これも可能ですが、それ以上のことも可能です (異なる取り消しチェックポイント間の違い)。群道に 類似。
以下をソースし、: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は本当にクールです。キーを 1 回押すだけで、現在のファイルがソース管理リポジトリの最新のリビジョンで差分強調表示されます。多くの SCMS で動作するようになっています。私はperforceでそれを使用します。
vimdiff のように比較に vim を使用する場合は、次のようにします。
.vimrc を編集して以下を追加します。
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
そこから変更がqall
表示され、コマンド モードで F8 を押して vimdiff のように使用して差分ビューを終了できます。F8 を任意のキーに置き換えます。
編集:保存されていないため、変更を禁止するために -M を追加しました。
histwinプラグインをお勧めします。
現在保存されているファイルのバージョンとは比較されませんが(他の回答のように)、編集を開始してから変更を vimdiff したり、変更を順番に再生したりすることもできます。途中で保存すると違いがわかります。
さらに、すべての元に戻す履歴ブランチのリストを表示し、それらを切り替えたり比較したりできます。
PS: プラグインは、ファイルが変更されるたびに編集履歴の瞬間を自動的に追跡しませんが、必要に応じて後で vimdiff できるように、ファイルを保存する瞬間に明示的に「タグ付け」できます。たぶんこれは自動化できますか?