在将文件保存到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 % -
下面是我写一个更详细的答案的尝试:
我假设你正在使用安装了cat
和echo
系统(例如几乎所有的GNU / Linux,Mac OS,BSD和其他类UNIX系统)。
以上命令的工作原理如下:
-
在vim中保存文件的语法是:
:w <filename>
-
在vim中执行shell命令的语法是:
:!<command>
-
在由vim
%
发布的shell环境中恰好指向当前文件名。 您可以通过执行以下操作来validation这一点::!echo %
这应该输出文件名(或者如果vim运行时没有文件名就会报错)。
使用cat我们也可以输出文件的内容:
:!cat %
这应该返回文件内容的最后保存状态或错误,如果它从来没有被保存。
-
程序diff可以从标准input(stdin)读取。 其手册页面声明如下:
[…]如果文件是“ – ”,请阅读标准input。 […]
-
在没有文件名的情况下执行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 % -