如何检测swp文件是否包含未保存的更改?


11

使用gvim(v.7.4.488)编辑源代码时,我想对vcs进行一些更改(我在Ubuntu linux中从命令行使用git 2.1.4)。

git --status

显示我更改了哪些文件。但是,它还会显示.*.swp当前可见缓冲区的vim (如果文件包含未保存的更改,以及所编辑的文件与.*.swp-file 相同)。当然,git可以忽略这些文件,或者vim可以将交换文件存储在其他位置(请参见vim.wikiastackoverflow上的此问题)。但是,我喜欢.*.swp-files git --status包含未保存的更改时显示的内容,因为它表明我正在以与我认为的状态不同的状态提交文件。

当保存的文件与-file相同时,如何避免出现.*.swp-files 的误报,同时能够看到要提交的文件与我用vim编辑的文件处于不同的状态?git --status.*.swp

  • .*.swp当磁盘上的文件和vim中的文件不同时,是否只能使用-files?
  • 还有其他方法可以检测未保存的文件吗?

与检测交换文件是否暗含未保存的文件相比,将@elyashiv@VanLaser的注释组合起来导致更简单的方法:

  1. 不要让git忽略。*。sw [po]文件;
  2. 提交时,如果git --status显示.*.sw[po]-files ,则:wa在vi中执行;和,
  3. 添加并提交。

1
您可以:wa用来确保没有未保存的文件。
elyashiv 2015年

2
真的,要确保在您保存所有文件之前,这要“精打细算” git commit……
VanLaser

Answers:


8

vim -r在命令行中将列出当前目录和临时目录中的所有交换文件,以及它们是否包含任何未保存的更改。寻找说的那条线modified: no/YES

我不知道如何告诉Vim在不同的目录中查找,因此您需要切换到包含交换文件的每个目录并运行vim -r。您可以想出一个脚本来解析git status或使用的输出,find -name '.*.sw[po]'然后vim -r在每个目录中运行,以显示所有未保存更改的交换文件。

(我用.*.sw[po]代替.*.swp,因为有时.swo.swp编辑具有交换文件的.swn文件时会创建除文件之外的文件。如果您使用两个现有交换文件编辑文件,也可以创建文件,但是我认为我曾经在野外见过一个。如果您真的很偏执,可以使用.*.sw[a-p]或简单地使用.*.sw?。)

请参阅:help -r(一点)有关该-r选项:help recover.txt的更多信息,或有关恢复和交换文件名的更多信息。


1
好吧,Vim的交换文件是隐藏文件(.以文件名开头),因此正确的模式将是.*.sw[a-p](尽管在病理情况下,您实际上可以一直使用.foo.saa)。这也应该排除匹配的Flash文件,因为我怀疑这些文件通常是隐藏文件。
jamessan

@jamessan .在外壳程序glob中需要前导,但*.swp可作为的参数find。但是领导.使事情变得更简单。谢谢!
Lithis

8
  • .*.swp当磁盘上的文件和vim中的文件不同时,是否只能使用-files?

是。下面的代码片段(改编自tpope的vimrc)在未修改缓冲区时将禁用该缓冲区的交换文件,因此交换文件仅适用于修改后的文件。

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

注意:由于交换文件仅在修改缓冲区后才存在,因此您将失去使用交换文件作为咨询锁定的功能。如果缓冲区没有被修改,则另一个Vim可以开始编辑它而不会通知它已经打开。如果第二个Vim在第一个进行更多更改之前保存,则直到用户尝试保存或某些触发Vim来检查文件是否被修改后,它们才会被注意到。

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.