Вопрос по vim – Редактировать файл на месте в Vim

5

Обычно вы фактически не редактируете файл в vim. Если вы бежитеvim foo, редактировать, писать и выходить, vim unlinksfoo и создает новый файл и новую ссылку с именем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 всегда редактировать файл, а не создавать новый?

Некоторые причины, по которым это имеет значение ... преимущество создания нового файла и замены ссылки: не позволяет другим программам видеть частично записанный файл. Преимущество записи файла на месте: программа с измененными файлами (которая использует fam), похоже, быстрее видит изменение (немедленно, по сравнению с 6 секундами или около того, задержка, когда файл удален и по какой-то причине произошла перестановка ссылки ... это возможно просто своеобразие в фам или файлообменник) Don Hatch

Ваш Ответ

3   ответа
1

Редактирование жесткой ссылки на файл, Команда, которая контролирует это

set backupcopy=auto,breakhardlink
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,5 ГБ, а остальные данные были потеряны. И Vim использовал почти 2 ГБ оперативной памяти ...

Другой вариант будет использовать функции MMap, например. в командной строке Python.

9

Проверьте помощь дляbackupcopy вариант и заметки оcrontab особенно. Краткий ответ:

:set backupcopy=yes
Благодарю. Однако я нахожу эту документацию неясной. & quot; Когда файл является ссылкой, новый файл не будет ссылкой & quot ;. WTF ?? !! Каждая ссылка является ссылкой, и единственный способ получить доступ к файлу - через ссылку! William Pursell

Похожие вопросы