我用Vim.我打开一个文件.我编辑它,我希望在保存之前看到我编辑的内容.
我怎么能在Vim中这样做?
:w !diff % -
因为有些人询问了命令的解释
:w !diff % -
这是我尝试写一个更详细的答案:
我假设你正在使用cat
和echo
安装一个系统(例如几乎任何GNU/Linux,Mac OS,BSD和其他类UNIX系统).
以上命令的工作原理如下:
在vim中保存文件的语法是:
:w
在vim中执行shell命令的语法是:
:!
在vim发布的shell环境中,%
碰巧指向当前文件名.您可以通过执行以下操作来验证这一点:
:!echo %
这应输出文件名(如果vim在没有文件名的情况下运行,则输出错误).
使用cat我们也可以输出文件的内容:
:!cat %
这应该返回上次保存状态的文件内容,如果从未保存过,则返回错误.
程序diff能够从标准输入(stdin)读取.其手册页说明了以下内容:
[...]如果文件是" - ",则读取标准输入.[...]
执行不带文件名的save命令而是后面的shell命令会导致vim将文件内容写入shell的stdin,而不是将其保存在物理文件中.您可以通过执行来验证这一点
:w !cat
这应该始终打印文件当前内容(这将被写入文件).
把它放在一起(或tl; dr):文件被"保存"到stdin,diff以文件名和stdin作为输入运行.
知道这个也可以比较文件与vimdiff做这样的事情 - 这只是一个你不想这样做的想法:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(然后打开readonly并关闭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()要退出差异视图,您可以使用该
:diffoff
命令.下面是一个类似的功能,适合模仿
'cvs diff'
命令......
我总是喜欢差异化 - 好看,简单,有效.
来自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