我在某处听说如果禁用backup并启用了writebackup,Vim将在编辑会话期间创建备份文件,然后将其删除。但是,即使进行了这些设置,即

set nobackup
set writebackup " Enabled!
set noswapfile
set noundofile  


我也看不到创建任何其他文件。

评论

您到底在寻找什么行为?使用nobackup进行writebackup意味着成功写入后将立即删除备份文件。

@ZeroKnight因此,据我了解,此处有关nowritebackup的信息不正确?

关于备份文件持续到会话结束的一行是不正确的。它们是临时的或一直保留到您删除它们为止,具体取决于备份设置。看看:h备份表。

#1 楼

backupwritebackup是两个独立但相互交织的选项;它们本质上是同一整体的两半。我认为,解释这两个选项的最简单方法是详细说明当您尝试使用这些选项的某些组合覆盖文件时发生的情况。现有文件foo.txt。您对其进行了一些更改(不只是附加到其上),然后发出:write命令...

如果启用了backupwritebackup(或同时启用了两者),则在写入文件之前,Vim将创建备份(位置取决于backupdir设置)。之后,Vim将尝试写入原始文件。此时,行为取决于backup设置:


如果nobackup,则在成功写入原始文件后立即删除备份文件。
如果backup,则备份文件将被保留,以后将被覆盖。

就这样;行为确实取决于backup的设置。应当注意,在启用前者而禁用后者的情况下,例如,backup将覆盖writebackup:set backup nowritebackup。换句话说,它与:set backup writebackup相同。

:h backup-table的这张表概述了同一件事:

                            *backup-table*
'backup' 'writebackup'  action
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file



关于选项名称

您可能会认为这些选项的名称应该互换,因为每个选项的名称似乎可以更准确地描述另一个选项的名称。我最初持有相同的观点,但我将在此处反映KRyan的有见地的评论:为了帮助理解命名约定,请考虑以下问题:backup始终产生备份,而writebackup产生备份写入过程中的备份。换句话说,write并不是动词,而是形容您要启用的备份类型的形容词。


评论


为了帮助理解命名约定,请考虑以下事项:备份始终会生成一个备份,而写备份则会在写过程中生成一个备份。换句话说,write并不是动词,而是形容您要启用的备份类型的形容词。

– KRyan
18年7月22日在22:35



“ write不是用作动词,而是形容词”。太精彩了。

–零骑士
18年7月22日在22:39

很高兴你喜欢!如果愿意,可以将其合并到您的答案中。

– KRyan
18年7月22日在22:40

#2 楼

就像@ZeroKnight在:set nobackup writebackup中说的那样,备份文件将在:write期间使用,但之后将被删除。官方文档在这里:backupwritebackup

问题(我的重点)


nowritebackup实际做什么?


您可以使用inotify进行查找。进行测试,然后将上面指定的设置保存为测试vimrc文件,然后将文件写入该测试目录,并查看inotify的输出。像这样:

第一个终端窗口

mkdir test-dir
cat > test-dir/vimrc <<EOF
set nobackup
set writebackup " Enabled!
set noswapfile
set noundofile
EOF
inotifywait -m -r test-dir


第二个终端窗口

vim test-dir/foo
:w


>对于我来说,输出看起来像这样:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
test-dir/ OPEN foo
test-dir/ CREATE foo~
test-dir/ OPEN foo~
test-dir/ ATTRIB foo~
test-dir/ CLOSE_WRITE,CLOSE foo~
test-dir/ ATTRIB foo~
test-dir/ CLOSE_NOWRITE,CLOSE foo
test-dir/ OPEN foo
test-dir/ MODIFY foo
test-dir/ ATTRIB foo
test-dir/ CLOSE_WRITE,CLOSE foo
test-dir/ DELETE foo~