在Vim中,“:update”和“:w”有什么区别?

23
我发现在gvim中,Control+S相当于:update命令。我通常使用Ctrl+S进行保存,因此我认为:update是另一种说法“刷新更改”的方式。 :update基本上与写:w相同吗?如果将:update替换为:w!,会出现问题吗?
编辑:我想将:update更改为:w!,因为我有一个文件显示“只读,请添加!”。我认为这是唯一的解决方法。

你可以在更新命令中使用感叹号(!)。 - ZyX
4个回答

25
这里有另一种解释: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

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

$ vim test.txt

不要编辑,只需输入: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!

正如您所看到的,只有访问时间改变了,这是因为我们读取(访问)文件中的数据。但修改时间和更改时间仍然相同。


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

$ vim test.txt

请勿编辑,但这次键入: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!

现在我们可以看到:up:w之间的区别!文件的数据已经被修改且文件状态也已更改,尽管文件中实际上没有什么变化。
为了避免这种情况,我们可以使用:map :w :up:w命令映射到:up命令。

有没有使用 :up 的用例,不能仅通过使用 :q 实现?因为您还可以将 vim 进入文件并通过使用 :q 退出而避免更改修改值,假设您仅为阅读 VIM 文件而不进行任何更改。 - Nicholas Cousar

19

:help :update很清楚:

Like ":write", but only write when the buffer has been modified.

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


我总是忘记使用:help,最后只能去StackOverflow上找答案。在这个回答中强调它是很有帮助的。 - Matt Kleinsmith

4

来自帮助文档:

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

2

:help :update的说明:

类似于":write",但仅在缓冲区已被修改时才写入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接