我用的是 Vim。我打开一个文件。我对其进行了编辑,并希望在保存之前查看已编辑的内容。

我怎样才能在 Vim 中做到这一点?

有帮助吗?

解决方案

http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file

  

下面是一个函数和命令来查看当前编辑的文件,并在文件系统中的未修改版本之间一个diff。只要把这个在你的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'命令...

其他提示

:w !diff % -

因为有人问这个命令的解释

:w !diff % -

这是我尝试写出更详细的答案:

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

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

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

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

    :!<command>
    
  3. vim 发出的 shell 环境里面 % 恰好指向当前文件名。您可以通过执行以下命令来验证这一点:

    :!echo %
    

    这应该输出文件名(如果 vim 在没有文件名的情况下运行,则输出错误)。

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

    :!cat %
    

    这应该返回上次保存状态的文件内容,如果从未保存过,则返回错误。

  4. 程序 diff 能够从标准输入 (stdin) 读取。其手册页说明如下:

    [...] 如果 FILE 为“-”,则读取标准输入。[...]

  5. 执行不带文件名而是后面有 shell 命令的 save 命令会导致 vim 将文件内容写入 shell 的 stdin,而不是将其保存在物理文件中。您可以通过执行来验证这一点

    :w !cat
    

    这应该始终打印文件的当前内容(这将被写入文件)。

将它们放在一起(或 tl;dr):文件被“保存”到标准输入,diff 以文件名和标准输入作为输入运行。

知道这一点还可以将文件与 vimdiff 进行类似的操作 - 这只是您不想这样做的一个想法:

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

(然后打开只读并使用关闭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()

有是一个插件,基于这里不同的答案: https://github.com/gangleri/vim -diffsaved

它提供了:w !diff % -方法和更多地参与diffthis之一。

除此之外 undotree 允许这个问题,以及,也得多(不同撤消检查点之间的差别) 。类似于 Gundo

我推荐 histwin 插件。

虽然它没有差异到的当前保存的文件(如其他答案)的版本,它可以 Vimdiff可以改变,因为你开始edting ,甚至< STRONG>重播为了更改。的差异显示,如果你保存中间。

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

PS:虽然该插件不会自动跟踪编辑历史时刻,因为每一个文件的变化,你可以明确的“标签”,当你保存,这样你可以在以后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  % -
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top