VIM交换文件最佳做法?


14

每当我因失去连接而退出vim会话时,我都会感到很满足(但是我仍会继续使用vim ...我必须是受虐狂),因为当我再次打开文件时,会交换一堆-文件正在等待破坏我的工作。使用vim交换文件的最佳实践是什么?您只是选择最新的吗?如果文件按您期望的方式工作,您是否只是删除交换文件?您如何摆脱它们?


5
交换文件在那里可以保护您的工作。考虑使用gnu屏幕。

1
我不想关闭功能;这很烦人,但正如您所说的有用。
leeand00

1
我只想知道如何正确使用它。
leeand00

2
@DrEval我使用tmux
leeand00 '18

2
如果使用tmux,则不必担心失去连接:只需在重新连接时重新连接到会话即可。您可能也对mosh@ChristianBrabandtRecover插件感兴趣。
Rich

Answers:


24

不要惊慌!

恢复文件始终是安全的,因为vim 除非您自己编写文件,否则从不写入任何更改。因此,从交换文件中恢复然后不保存就关闭不会改变任何内容。

整理您的交换文件:

获取vim,将所有交换文件放在同一位置,这样您就始终知道它们在哪里:

set directory^=$HOME/.vim/swap//

或您喜欢的任何地方。//在文件名末尾使用,使vim为交换文件名使用绝对文件路径,因此不会出现名称冲突。确保目录存在,否则vim不会使用它(不会为您创建目录)。

注意:这仅适用于环境变量,如果您想使用vimscript变量,那么我们需要使用一些:execute魔术:

execute "set directory^=".my_vim_home_var."/swap//"

区别差异:

Vim的帮助提出了一种在这种情况下可以使用的非常有用的命令::DiffOrig。这不是默认的vim命令,因此将实现从复制:h :DiffOrig到您的vimrc中。($VIMRUNTIME/defaults.vim如果您有vim8,它也位于其中)。现在,您可以恢复文件,只需运行DiffOrig即可获取未修改版本的更改内容。

如果要比较多个交换文件的内容,请使用每个不同的交换文件恢复文件,然后将结果写入临时文件。现在加载文件并:diffthis在每个文件上运行,进行所需的更改,写回原始文件,并删除临时文件和交换文件。

有用的命令:

:swapname:获取名称vim用于当前缓冲区的交换文件(:h :swapname:recover:恢复所选文件,与启动vim并按R:h :recover)时相同

查看帮助:

Vim有完整的恢复用户手册::usr_11.txt
Vim关于交换文件的参考帮助::h swap-fileh recovery
目录选项的帮助(用于设置交换文件的位置)::h 'directory'

编辑:设置目录的修改示例,如@B Layer的注释中所指出


当您收到多个交换文件时该怎么办?因为有很多断开的连接?
leeand00

1
我在“区分差异”的第二段中提到了这一点。使用diff确定要保留的更改后,请删除所有临时文件和旧的交换文件(现在您知道所有交换文件在哪里)。
flemingfleming

1
仅供参考,您不需要使用exec... set directory^=$HOME/.vim/swap//工作正常,只要$HOME是一个初始化的环境变量。请参阅:h expand-env。还可以与dictionaryundodirbackupdir一起使用。
B层

感谢您提醒我!我在配置中使用了vimscript变量,因此执行和忘记环境变量不需要它。考虑到这一点,我可能应该只使用vim来设置环境变量。
flemingfleming

2

就个人而言,我已关闭交换和备份文件,因为它倾向于在各处创建交换文件和备份文件,并且经常会产生冲突。Vim的持久撤消更加可靠且没有错误。

Vim当前具有持久撤消功能,这是一种更为精细的备份方法。每次按Esc,都会捕获文件的当前状态。

您可以使用:undolist,或gundo之类的插件或undo-tree浏览撤消历史记录。

要以这种方式使用vim:

  • 创建一个目录,您将在其中编辑每个文件的历史记录
  • 告诉vim使用该目录
  • 启用持久撤消

在外壳中:

mkdir ~/.vim/undodir

在Vim中

set undodir=~/.vim/undodir
set undofile

要关闭交换文件: :set noswapfile


1
这个答案有两个相当大的问题。1.永久撤消解决了交换文件的'writebackup'另一个问题(并解决了另一个问题)。如果您的计算机崩溃了,启用永久撤消将无济于事。您可以争辩说交换文件是出于其他原因(现代OS稳定性,UPS的存在)而不必要的,但是您在此答案中没有这样做。2.设置'undodir' 不会启用持久撤消!您需要设置'undofile'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.