在将文件保存到Vim之前,我能看到更改吗?

tee*_*pap 128 vim diff preview

我用Vim.我打开一个文件.我编辑它,我希望在保存之前看到我编辑的内容.

我怎么能在Vim中这样做?

cha*_*aos 146

:w !diff % -
Run Code Online (Sandbox Code Playgroud)

  • 有人可以解释一下吗?我不明白发生了什么.我知道你正在炮轰`diff`.`%`指当前打开的文件路径.为什么这一切都是`:w`命令的参数?另外,如何将`-`分配给工作缓冲区的内容?在vim中是自动的,缓冲区的内容(或者缓冲区中的特定范围)被分配给stdin用于shell命令吗? (12认同)
  • 或者使用`:w!git diff%-`作为彩色版本,如果你安装了git! (12认同)
  • @NathanWallace:它是`:w`的参数,因为我们正在将文件写入命令(在`stdin`上).在命令中,`-`告诉它从`stdin`读取. (8认同)
  • 有没有办法用vimdiff做到这一点?我试过了:w!vimdiff% - 但没有成功. (4认同)
  • 仅在系统上安装了差异时才有效(读取:不能跨平台工作) (3认同)
  • @Dergachev当我运行`:w!git diff%-`时,我得到错误`fatal:bad flag' - '在文件名之后使用'. (3认同)
  • @Grayscale `:w !git diff --no-index % -` 对我有用。但后来箭头键在 vim 中停止工作,我不得不执行 `:!clear` 来修复它。 (2认同)

Tob*_*cke 89

因为有些人询问了命令的解释

:w !diff % -
Run Code Online (Sandbox Code Playgroud)

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

我假设你正在使用catecho安装一个系统(例如几乎任何GNU/Linux,Mac OS,BSD和其他类UNIX系统).

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

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

    :w <filename>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在vim中执行shell命令的语法是:

    :!<command>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在vim发布的shell环境中,%碰巧指向当前文件名.您可以通过执行以下操作来验证这一点:

    :!echo %
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    :!cat %
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    [...]如果文件是" - ",则读取标准输入.[...]

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

    :w !cat
    
    Run Code Online (Sandbox Code Playgroud)

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

把它放在一起(或tl; dr):文件被"保存"到stdin,diff以文件名和stdin作为输入运行.

知道这个也可以比较文件与vimdiff做这样的事情 - 这只是一个你不想这样做的想法:

:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
Run Code Online (Sandbox Code Playgroud)

(然后打开readonly并关闭vimdiff使用:qall)


Bil*_*nch 55

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()
Run Code Online (Sandbox Code Playgroud)

要退出差异视图,您可以使用该:diffoff命令.

下面是一个类似的功能,适合模仿'cvs diff'命令......

  • 提供链接并不是真正的答案 (12认同)
  • @ luc-hermitte当你在一个不断变化的大量盒子上使用vim而你不能轻易改变.vimrc时,不是替代`:w!diff%-`的优势?(如果他们安装了diff.) (7认同)
  • 混沌的答案是优越的,在托比亚斯的答案中,解释是完整的. (3认同)

Roo*_*ook 10

我总是喜欢差异化 - 好看,简单,有效.


0x8*_*x89 9

来自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
Run Code Online (Sandbox Code Playgroud)


Cyc*_*rse 5

git支持以下命令

:w !git diff --no-index -- % -

通过将以下内容添加到 ~/.vimrc 将其映射到命令

command GitDiff execute "w !git diff --no-index -- % -"

现在执行:GitDiff成为一个方便的小命令,可以在每次保存之前快速显示差异。