153

私はヴィムを使っています。ファイルを開きます。編集して、保存する前に編集内容を確認したい。

Vimでこれを行うにはどうすればよいですか?

4

14 に答える 14

181
:w !diff % -
于 2009-04-14T20:45:58.573 に答える
120

コマンドの説明を聞かれたので

:w !diff % -

より詳細な回答を書くための私の試みは次のとおりです。

catがインストールされたシステム (たとえば、ほぼすべての GNU/Linux、Mac OS、BSD、およびechoその他の UNIX ライクなシステム)で作業していると想定しています。

上記のコマンドは次のように機能します。

  1. vim でファイルを保存するための構文は次のとおりです。

    :w <filename>
    
  2. vim でシェル コマンドを実行するための構文は次のとおりです。

    :!<command>
    
  3. vimによって発行されたシェル環境内では、%たまたま現在のファイル名を指しています。これを確認するには、次を実行します。

    :!echo %
    

    これにより、ファイル名が出力されます (または、vim がファイル名なしで実行された場合はエラーになります)。

    cat を使用して、ファイルの内容を出力することもできます。

    :!cat %
    

    これにより、ファイルの内容が最後に保存された状態で返されるか、保存されていない場合はエラーが返されます。

  4. プログラム diff は、標準入力 (stdin) から読み取ることができます。そのマニュアルページには次のように記載されています。

    [...] FILE が「-」の場合、標準入力を読み取ります。[...]

  5. ファイル名を指定せずに save コマンドを実行し、その後ろにシェル コマンドを実行すると、vim はファイルの内容を物理ファイルに保存するのではなく、シェルの stdin に書き込みます。実行することでこれを確認できます

    :w !cat
    

    これにより、ファイルの現在の内容が常に出力されます (代わりにファイルに書き込まれます)。

まとめると (または tl;dr): ファイルは stdin に「保存」され、ファイル名と stdin を入力として diff が実行されます。

これを知っていれば、次のようなことを行う vimdiff でファイルを比較することもできます。

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile

(次に、読み取り専用で開き、vimdiff を使用して閉じます:qall)

于 2014-03-12T18:27:48.067 に答える
60

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'以下は、コマンドを模倣するように適合された同様の関数です...

于 2009-04-14T20:46:31.427 に答える
14

私はいつもdiffchangesが好きです- 素晴らしく、シンプルで、動作します。

于 2009-04-14T21:24:21.040 に答える
11

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
于 2009-09-05T22:15:40.533 に答える
2

ここにさまざまな回答に基づいたプラグインがあります: https://github.com/gangleri/vim-diffsaved

それは:w !diff % -方法とより複雑なdiffthisものを提供します。

その取り消しツリーとは別に、これも可能ですが、それ以上のことも可能です (異なる取り消しチェックポイント間の違い)。群道に 類似。

于 2014-12-18T00:56:23.333 に答える
2

以下をソースし、: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()
于 2009-04-14T20:54:25.200 に答える
2

あなたが探しているものとは正確には異なりますが、SCMDiff.vimは本当にクールです。キーを 1 回押すだけで、現在のファイルがソース管理リポジトリの最新のリビジョンで差分強調表示されます。多くの SCMS で動作するようになっています。私はperforceでそれを使用します。

于 2010-01-19T18:24:37.357 に答える
1

vimdiff のように比較に vim を使用する場合は、次のようにします。

.vimrc を編集して以下を追加します。

nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>

そこから変更がqall表示され、コマンド モードで F8 を押して vimdiff のように使用して差分ビューを終了できます。F8 を任意のキーに置き換えます。

編集:保存されていないため、変更を禁止するために -M を追加しました。

于 2014-03-12T19:01:49.030 に答える
1

histwinプラグインをお勧めします。

現在保存されているファイルのバージョンとは比較されませんが(他の回答のように)、編集を開始してから変更を vimdiff したり、変更を順番に再生したりすることもできます。途中で保存すると違いがわかります。

さらに、すべての元に戻す履歴ブランチのリストを表示し、それらを切り替えたり比較したりできます。

PS: プラグインは、ファイルが変更されるたびに編集履歴の瞬間を自動的に追跡しませんが、必要に応じて後で vimdiff できるように、ファイルを保存する瞬間に明示的に「タグ付け」できます。たぶんこれは自動化できますか?

于 2010-09-23T01:27:03.057 に答える