linux - 我如何处理 vim 的交换文件系统?

标签 linux bash unix vim terminal

在 ubuntu 中使用 vim 时,我不小心按下了 ctrl-z,这暂停了我的 vim session 。我正在编辑一个未保存的文件(我将其称为 test)。

当我在 vim 中再次打开文件时,出现交换文件错误:

E325: ATTENTION
Found a swap file by the name ".test.swp"


Swap file ".test.swp" already exists!

根据 Found a swap file by the name问题,我有两个选择:

  1. 找到 session 并完成它(最好)。
  2. 删除 .swp 文件(如果您确定其他 git session 已经消失)。

我将如何做这两件事?如果我执行 rm test.swp 它看不到文件:

rm: cannot remove `test.swp': No such file or directory

我在删除交换文件时做错了什么,我该如何完成 session ?


编辑:我忘记了 test.swp 中的句号 所以删除swp文件的正确方法是rm .test.swp

我剩下的问题是如何恢复/完成暂停的 vim session 。

最佳答案

这与 Ubuntu 无关,因为发生的是 Ubuntu 的基 native 制 几乎每个 Unix 操作系统。 按 ^Z 可以暂停(而不是结束)当前运行的 vim session 。 vim session 仍然存在,等待信号再次将其置于前台。

要重新激活 session : 如果 vim 是直接从命令行启动的——使用命令“fg”(用于“ForeGroung”),vim 将再次出现。这适用于所有 ksh/bourne 类 shell。对于 t/csh,我不知道。这仅在与启动 vim 的同一终端 session 的控制台上给出命令“fg”时有效(这是与 vim session 相关的“控制终端”)。

如果 vim 是从窗口管理器的菜单启动的(主要是在名称 gvim 下),那么您在这里有点不走运,因为 (g)vim 与其控制终端分离。

您的恢复选项: 如果上述条件有效,则使用“fg”。这是最干净的方式。

如果 (g)vim session 与控制终端分离,可以通过执行“ps -ef | grep vim”来检查。如果 TTY 列(请参阅输出标题)显示 一个 ”?”不再有控制终端,我建议发送流程 一个 SIGHUB(请参阅命令“kill”/“killall”的联机帮助页),然后是一个 SIGKILL(如果它仍然存在)。 杀死 vim(或任何其他任务)可能会导致数据不一致,因为在它被杀死之前没有对 vim 的“保存”命令。

之后,使用相同的文件启动一个新的 vim,首先执行“恢复”(由 vim 提供,它会看到相应的 swp 文件),保存文件,结束 vim 并使用该文件再次启动它,然后做一个“删除交换文件”。这是杀死 vim 后最省事的方法。

为了避免在不需要的情况下不小心将 vim 置于后台,请将 ^Z 映射到另一个,更多 “复杂”的键序列,很难意外按下。您可以停用 ^Z 命令,将以下行添加到您的 .vimrc 中:

map <C-z> ;

补充:您的 rm 命令错过了 .test.swp 前面的点,导致 rm 不 找到文件...或删除另一个名为 test.swp 而不是“.test.swp”的文件。通过 vim 删除 swp 文件,您一定会删除正确的文件。 在类 UNIX 系统上,Swp 文件始终以点(隐藏文件)开头。

关于linux - 我如何处理 vim 的交换文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794235/

相关文章:

mysql - 奇怪的 ubuntu bash 问题

linux - CGI 脚本未通过 .sh 脚本执行或调用

unix - 关闭子进程中打开的文件描述符

C fork 循环执行无限命令(事件文件上的 urandom/tail)

regex - 如何使用ansible更改文件中的特定值

linux - Cron Job 电子邮件查找 : missing argument to `-exec'

linux - Sed 替换日期

bash - bash 中如何表示小于但不等于?

c - semget : how to avoid concurrent access to semaphore group on its creating/initialization?

linux - 在awk中使用外部变量传递给bash中的ssh