在 vim 中就地编辑文件

Edit a file in-place in vim

提问人:William Pursell 提问时间:6/15/2012 最后编辑:bmarguliesWilliam Pursell 更新时间:11/9/2012 访问量:4285

问:

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

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

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

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

vim

评论

0赞 Don Hatch 12/13/2014
它有所作为的一些原因......创建新文件和交换链接的优点:防止其他程序看到部分写入的文件。就地写入文件的优点:fileschanged 程序(使用 fam)似乎更快地看到更改(立即,而删除文件和交换链接时延迟 6 秒左右,出于某种原因......可以说,这只是 fam 或 fileschanged 中的一种特质)
0赞 Mark 8/31/2020
例如,如果将单个文件绑定到Docker容器中,则通过创建新文件并交换链接来更改文件意味着绑定挂载继续通过inode ID指向旧文件。在这种情况下,下面的答案帮助了我。

答:

13赞 evil otto 6/15/2012 #1

查看该选项的帮助,特别是有关该选项的说明。简短的回答是backupcopycrontab

:set backupcopy=yes

评论

1赞 William Pursell 6/15/2012
谢谢。不过,我发现该文档不清楚。“当文件是链接时,新文件将不是链接”。跆拳道??!!每个链接都是一个链接,访问文件的唯一方法就是通过链接!
2赞 Doncho Gunchev 6/15/2012 #2

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

set backupcopy=auto,breakhardlink
3赞 Tiago 11/9/2012 #3

诀窍是告诉 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 命令行中。