在 vim 中就地编辑文件

  • 本文关键字:编辑文件 vim vim
  • 更新时间 :
  • 英文 :


通常,您实际上不会在 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 始终编辑文件,而不创建新文件?

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

:set backupcopy=yes

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

set backupcopy=auto,breakhardlink

诀窍是告诉 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!

为了真正了解文件系统级别发生了什么,我使用了inotice工具:

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

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

另一种选择是使用MMap函数,例如在Python命令行中。

最新更新