在将文件保存到Vim之前,能否看到更改?

我用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命令。

下面是一个类似的function,适合模仿'cvs diff'命令…

 :w !diff % - 

因为有人问关于命令的解释

 :w !diff % - 

下面是我写一个更详细的答案的尝试:

我假设你正在使用安装了catecho系统(例如几乎所有的GNU / Linux,Mac OS,BSD和其他类UNIX系统)。

以上命令的工作原理如下:

  1. 在vim中保存文件的语法是:

     :w <filename> 
  2. 在vim中执行shell命令的语法是:

     :!<command> 
  3. 在由vim %发布的shell环境中恰好指向当前文件名。 您可以通过执行以下操作来validation这一点:

     :!echo % 

    这应该输出文件名(或者如果vim运行时没有文件名就会报错)。

    使用cat我们也可以输出文件的内容:

     :!cat % 

    这应该返回文件内容的最后保存状态或错误,如果它从来没有被保存。

  4. 程序diff可以从标准input(stdin)读取。 其手册页面声明如下:

    […]如果文件是“ – ”,请阅读标准input。 […]

  5. 在没有文件名的情况下执行save命令,而是使用shell命令执行save命令会导致vim将文件内容写入shell的stdin,而不是将其保存在物理文件中。 你可以通过执行来validation

     :w !cat 

    这应该总是打印文件当前内容(而不是写入文件)。

放在一起(或tl;博士):文件被“保存”到标准input,比较运行与文件名和标准input。

知道这个也可以比较文件与vimdiff做这样的事情 – 这只是一个想法,你不想这样做:

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

(然后打开readonly并closuresvimdiff使用: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 

请input以下内容并使用: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。

我可以推荐histwin插件。

虽然它不会影响到当前保存的文件版本(如其他答案),但它可以在开始编辑之后进行vimdiff更改 ,甚至可以按顺序重播更改。 不同之处在于您是否中间保存。

此外,它显示所有撤消历史分支的列表,并允许您在它们之间切换或区分。

PS:虽然插件不会自动跟踪编辑历史logging中的每一个文件更改后的时刻,但是您可以明确地“标记”保存文件的时刻,以便以后可以使用vimdiff,如果需要的话。 也许这可能是自动的?

如果你想像vimdiff一样使用vim进行比较,你可以这样做:

编辑.vimrc并添加:

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

从那里你会看到你的变化,并可以退出比较视图使用qall就像vimdiff在命令模式下按F8。 用你喜欢的任何键replaceF8。

编辑:添加-M禁止任何修改,因为它不是保存。

有一个插件,根据不同的答案在这里: https : //github.com/gangleri/vim-diffsaved

它提供了:w !diff % -方法和更多的涉及diffthis之一。

除此之外,无动机也允许这样做,但也有更多(不同的撤销检查点之间的差异)。 类似于Gundo 。

按照上面的build议我使用git diff,我很喜欢:

 :w !git diff % -