如果在Vim外部编辑文件,则保留撤消历史记录

3lxsmp7m  于 2023-03-02  发布在  其他
关注(0)|答案(3)|浏览(126)

在编辑器外部编辑Vim撤消文件时,该文件将被清除。
我怎样才能得到它,这样我就可以恢复到旧版本的文件,即使它是编辑以外的Vim?这是可能的吗?

6rqinv9w

6rqinv9w1#

您可以使用vim备份:

set backup                   " enable backup file
set backupdir=~/.vim/backups " backup directory

然后你可以去获取保存的最后一个备份vim,以防你想在外部编辑后恢复,但这不像undofile.From vim wiki
但是,请注意,如果在没有Vim的情况下从外部修改文件,那么当您再次编辑文件时,Vim将无法读取撤消历史,撤消树信息也将丢失,无法恢复。

m0rkklqb

m0rkklqb2#

看看我自2015年以来一直在驾驶的设置:

let vimtmp = $HOME . '/.tmp/' . getpid()
silent! call mkdir(vimtmp, "p", 0700)
let &backupdir=vimtmp
let &directory=vimtmp
set backup

我正在考虑将这个功能提前到我的新2023 lua nvim配置中。
我在这里所做的事情有几个特性:

  • 每个vim进程将交换和备份存储到以其pid命名的新目录中
  • 在实践中,这使我避免了遇到swapfile found, do you want to edit anyway or abort的“现在使用我的新配置”对话框,这是因为一个新进程将在它自己的pid特定目录中获得directory,而vim的工作方式与任何典型的编辑器一样。当你保存的时候文件会被破坏。这是预料之中的。现在我可以选择在系统崩溃的情况下找到所有过去的交换和备份文件,这些文件可能已经被留下了。在近10年的实践中,我从来没有利用过这个功能,但感觉很好,有它可用。
  • 虽然这并没有解决外部文件修改事件导致的撤销文件“损坏”问题,但至少从概念上讲,如果没有内部撤销机制获得智能来检测此类事件并插入非基于diff的日志记录,我甚至不认为这是可能的。例如,我在我的配置中有一个au FileChangedShell * echo "Warning: File changed on disk!!",它在实践中工作得很好,总是能立即发现一个变化,但是阅读vim自己关于这个aucmd的文档,我们不清楚我们是否应该期望它总是能检测到实际的文件变化...

因此,我仍然不确定是否将此行为应用到我的新配置中,但它确实很诱人。我可以说的是,vim/nvim在编辑文件之前检查是否存在交换文件对我来说不是有帮助的行为,因为在实践中,无论何时,它总是能够立即用文件的状态重新加载缓冲区(通常是vim的第二个示例),它在下面被修改了,所以在vim里面我永远不会看到文件的旧的影子版本,这会很烦人(以及默认的交换检查行为是为了防止什么)。
我想我接下来几天要做的是考虑实际的行为,这意味着找出是否有一个更现代的基于lua的撤销树插件的替代品,我一直很高兴到现在,这是mbbill/undotree.此外,我想调查我已经驾驶了十年的配置如何处理更改的文件,是否正在以良好的方式管理外部文件更改事件之后的撤消,以及是否存在改进它的简单方式。
除了上面粘贴的配置,我还设置了

set undodir=~/.tmp
set undolevels=10000
set undofile

这意味着,尽管交换文件和备份位置在pid特定的文件中是隔离的(所以,对于每个VIM示例都是新鲜的),undofile不是。我觉得我的经验是,这真的工作得很好(撤销过去的外部变化实际上显示了外部变化,只是没有我想要的那么好(某种差异),但它的行为足够正确,让我满意)。但是这只是从记忆中,因为这种事情不会发生太多。通常只有当我有两个vim与一个文件打开和交替编辑,从每个,因为健忘。

jslywgbw

jslywgbw3#

如果您指的是由字母u调用的撤销操作,在我的系统上,我看不到由undofile(@%)返回的文件,即使我看到了,我也不认为我能够删除它。它不影响我使用u键的能力。
如果你的意思是其他人/程序修改了你当前在vim中打开的文件,你应该得到一个文件已经更改的通知。选项是OKLoad File。如果你按OK,你可以按u键并强制写入:w!。这将清除其他人/程序的更改。
如果这些答案都不适用于您,请更详细地解释。

相关问题