6

通常,您实际上不会在 vim 中编辑文件。如果您运行vim foo、编辑、写入和退出,vim会取消链接foo并创建一个新文件和一个名为foo. 但是,如果文件有多个链接,则vim实际修改文件。例如:

$ ls -i foo
19428852 foo
$ vi foo
$ ls -i foo
19428857 foo
$ ln foo bar
$ vi bar
$ ls -i bar
19428857 bar

我一直在寻找一种实际编辑文件的方法,似乎有两种选择。使用ed,或使用vim但确保在我编辑之前至少有两个指向该文件的链接。我想这个问题是学术性的,因为如果只有一个链接,vim 创建一个新文件并不重要,如果在编辑过程中创建链接,vim 似乎做了正确的事情,但我很好奇:

是否可以让 vim 始终编辑文件,而不是创建新文件?

4

3 回答 3

11

查看该backupcopy选项的帮助,尤其是有关的注释crontab。简短的回答是

:set backupcopy=yes
于 2012-06-15T01:40:49.437 回答
2

快速谷歌显示此链接 -编辑文件的硬链接。控制它的命令是

set backupcopy=auto,breakhardlink
于 2012-06-15T01:44:01.357 回答
2

诀窍是告诉 Vim 使用备份文件以允许安全地覆盖原始文件,否则 Vim 将写入一个新文件然后重命名它以替换原始文件。

然后告诉 Vim 将备份文件写入任何地方。这样,常规的写入命令将失败,并且必须强制写入。

:set noswapfile
:set backupcopy=yes
:set backupdir=''
:e big
(hit Crtl-C to stopo line count and syntax highlight)
(edit the file)
:w!

为了真正了解文件系统级别的情况,我使用了 inotify 工具:

inotifywait -m -r /path/to/my_test_dir/

但要小心,这对于非常大的文件效果不佳,例如,我试图用这种方法编辑一个 10G 的文件,最终得到一个 1.5GB 的截断文件,其余数据丢失。Vim 最终使用了将近 2GB 的 RAM ......

其他选择是使用 MMap 函数,例如。在 Python 命令行中。

于 2012-11-09T12:18:44.277 回答