有什么区别:更新和:Vim中的w?

ale*_*nco 18 vim

我意识到在gvim中Control+S作为:update命令.我总是保存使用Ctrl+S,所以我认为这:update是另一种说法"刷新变化".是:update基本相同的写:w?如果我更换:update,我会遇到问题:w!吗?

编辑:我想更改:update:w!因为我有一个文件说"准备就绪,请添加" !.我认为这是唯一的解决方案

jkr*_*mer 17

:help :update 非常清楚:

Like ":write", but only write when the buffer has been modified.
Run Code Online (Sandbox Code Playgroud)

因此,只有在实际更改了缓冲区的内容时才会写入文件.因此,如果你使用:update(或在GVim中按Ctrl + S)并且缓冲区中没有未保存的更改,它将不会执行任何操作.


YaO*_*OzI 17

这是另一种解释:write(快捷方式:w)和:update(快捷方式:up)之间区别的方法:

每当我们输入时:w,无论缓冲区是否为空,VIM都会将缓冲区写入文件.这意味着它会将文件的时间戳更新为:w键入的时间,即使文件的内容没有实际更改.

虽然有:up,就像vim的帮助手册称,VIM将只更新时间戳时,该文件已被修改.


例如,当我打开一个文件只是为了阅读,但我可能不小心(或习惯)键入:w:wq,如果我关心文件的时间戳(即最后修改时间),那么就没有回头路了.以下示例(在BASH shell中)显示了效果:

$ touch test.txt
$
$ stat test.txt
      File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828498    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:30:52.159258193 +0800
Modify: 2014-03-15 22:30:52.159258193 +0800
Change: 2014-03-15 22:30:52.159258193 +0800
Run Code Online (Sandbox Code Playgroud)

现在,让我们VIM文件,并尝试:up:w分别命令:

$ vim test.txt
Run Code Online (Sandbox Code Playgroud)

不要编辑,只需键入:up然后:q

$ stat test.txt
  File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828498    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:33:10.002269244 +0800  <--- Different!
Modify: 2014-03-15 22:30:52.159258193 +0800  <--- Didn't Change!
Change: 2014-03-15 22:30:52.159258193 +0800  <--- Didn't Change!
Run Code Online (Sandbox Code Playgroud)

如您所见,仅更改了访问时间,这是因为我们读取(访问)文件中的数据.但修改时间和更改时间仍然相同.


现在让我们再次使用vim并使用该:w命令.

$ vim test.txt
Run Code Online (Sandbox Code Playgroud)

不要编辑,但这个时间类型:w然后:q

$ stat test.txt
  File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828538    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:40:26.728239153 +0800  <--- Different Again!
Modify: 2014-03-15 22:40:26.728239153 +0800  <--- Changed!
Change: 2014-03-15 22:40:26.728239153 +0800  <--- Changed!
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到的区别:up:w!该文件的修改数据和文件状态也发生了变化,虽然没有什么真正的文件中更改.


因此,为了避免这种情况,可以使用:w命令将:up命令映射到命令:map :w :up.


Pas*_*ent 4

来自帮助:

:[range]up[date][!] [++opt] [>>] [file]
                        Like ":write", but only write when the buffer has been
                        modified.  {not in Vi}
Run Code Online (Sandbox Code Playgroud)