题
我用的是 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 % -
这是我尝试写出更详细的答案:
我假设您正在使用一个系统 cat
和 echo
安装(例如几乎所有 GNU/Linux、Mac OS、BSD 和其他类 UNIX 系统)。
上述命令的工作原理如下:
在 vim 中保存文件的语法是:
:w <filename>
在 vim 中执行 shell 命令的语法是:
:!<command>
vim 发出的 shell 环境里面
%
恰好指向当前文件名。您可以通过执行以下命令来验证这一点::!echo %
这应该输出文件名(如果 vim 在没有文件名的情况下运行,则输出错误)。
使用 cat 我们还可以输出文件的内容:
:!cat %
这应该返回上次保存状态的文件内容,如果从未保存过,则返回错误。
程序 diff 能够从标准输入 (stdin) 读取。其手册页说明如下:
[...] 如果 FILE 为“-”,则读取标准输入。[...]
执行不带文件名而是后面有 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
之一。
我推荐 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 % -