0

vim 手册页包含两个类似-r类型的命令。我将在下面提供更多背景知识,这个问题实际上是如何调用第一种类型的 -r 来列出交换文件,但避免调用恢复的第二种 -r

   -r          List swap files, with information about using them for  re‐
               covery.

   -r {file}   Recovery  mode.  The swap file is used to recover a crashed
               editing session.  The swap file is a  file  with  the  same
               filename as the text file with ".swp" appended.  See ":help
               recovery".

没有文件名的 -r (上面的第一个 -r )也报告其他文件的交换文件,包括其他目录中的交换文件

背景:

我试图让 vim 报告特定文件的交换文件(主要是确定 vim 是否仍在编辑文件)。如果正在编辑文件(在另一个窗口中,在 linux 或 cygwin 上),我可以将该窗口“提升”到顶部,"\e[2t\e[1t"因为我已经成功地做到了,这要归功于将窗口置于前面

Vim 有多个交换文件名,以及它可以放置文件的多个目录,所以我想问 vim,请告诉我当前用于给定文件的交换文件的名称,以及当前是否有 vim处理文件。不幸的是,有时 vim 会以意想不到的方式在恢复模式下打开命令文件。

我正在像这样调用 vim vim -r -c :q file,实际上,我是从 调用它script,因为我希望 vim 看到更像终端的东西,然后我查看输出文件,所以它更像script -q -c "vim -r -c :q foo" fooscript,然后我查看 fooscript 文件对于像这样的消息/Note: process STILL RUNNING: (\d+)/

它开始看起来像我需要在vim -r没有文件名的情况下使用,并解析-r报告的输出,并且没有办法将报告预过滤到有问题的单个文件中。

4

1 回答 1

1

将我的焦点切换到 just 之后vim -r,并且

  • 知道 vim 会尝试将交换文件放入与它正在编辑的文件相同的目录中(感谢@romainl 的指针:help swap-file

  • 首先观察vim -r报告当前目录中的文件,

  • 观察与交换文件关联的文件名在vim进程的进程id之前报告,并且

  • 观察 vim (STILL RUNNING)如果找到活动进程则追加

  • 我适当地更改了当前目录并在插入名称后运行此代码file-to-search-for

     perl -lne '
       last if /^\s+In directory/;
       undef $f if /^\d+/;
       $f = $1 if /^\s+file name:\s+(.*)\s*$/;
       if ( $f =~ m#/file-to-search-for# && /^\s+ process ID:\s(\d+).*?STILL RUNNING/ ) {
         print $1;
         $pid //= $1;
       }
       END { exit !$pid; } '
    

打印正在运行的 vim 进程的 pid,当找到适当的交换文件时退出状态为零,如果文件未被编辑,则退出状态为非零

于 2022-01-11T03:53:36.253 回答