Answers:
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'
命令...
:w !diff % -
diff
。 %
指当前打开的文件路径。为什么所有这些都是:w
命令的参数?另外,如何-
分配给工作缓冲区的内容?这在vim中是自动的,缓冲区的内容(或缓冲区中的特定范围)被分配给shell命令的stdin吗?
:w
因为我们正在将文件写入命令(在上stdin
)。在命令中,-
告诉它从中读取stdin
。
:w !git diff % -
了彩色版本,如果你已经安装的git!
fatal: bad flag '-' used after filename
运行时出现错误:w !git 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):将文件“保存”到stdin,使用文件名和stdin作为输入运行diff。
知道这一点也可以使用vimdiff将文件进行类似的比较-这只是您不希望这样做的想法:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(然后使用来打开只读并关闭vimdiff :qall
)
vim - -c ":vnew $1 |windo diffthis"
,使其成为可执行文件,例如将其保存在PATH中vimdiffWithStdin
,然后与vim中的以下命令进行比较::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
。我不知道Windows是否存在类似的技巧。
我一直喜欢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
w !diff % -
是,它通过远程源太(例如:vim sftp://example.com/foo.txt
)
获取以下内容并使用: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一起使用。
如果要像在vimdiff中一样使用vim进行比较,则可以执行以下操作:
编辑您的.vimrc并添加:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
从那里开始,您将看到qall
所做的更改,并且可以像在vimdiff中一样通过在命令模式下按F8 退出diff视图。用任意键替换F8。
编辑:添加了-M以禁止任何修改,因为它没有保存。
Vim: Error reading input, exiting...
任何提示,这里出了什么问题?
您刚刚编辑的更改[ buffer ],即与上次保存的版本(在工作目录中)不同的更改,这些更改可能与上一个索引版本(Git)不同。我都映射了:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
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()
vimdiff与Gdiff的示例。
此外,要vimdiff
在其他路径中创建简单的同音异义文件:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
Gdiff
如果可能,则执行(否则不是Git项目),然后执行:vimdiff
。用try-catch-endtry
。但是:DiffWithSaved
在Git项目中却缺乏这种方式。
:w !diff % -
且数量众多且无法轻易更改.vimrc的盒子上使用vim时,这不是替代方法吗?(只要提供了差异安装即可。)