1

我想通过 Screen 的复制模式打开一条到 vim 的路径

Ctrl-A f

就像我可以在 Vim 中打开外部文件一样

Ctrl-W f

如何在 Screen 的复制模式下在 Vim 中打开路径?


--- 感谢 Samuil 解决问题

假设鼠标位于以下代码中的 PATH/file 处,表示屏幕开启时的显示

text[space]PATH/file[space]text

我在 PATH/file 处按 ^A f。它应该将文件的 PATH 保存到 /tmp/screenCopyFile 以便我们可以cat在以下^A f应该启动的命令中使用:

^A: exec vim `cat PATH/file`

我手动运行命令失败。它没有扩展 cat 命令,但它打开了一个名为 cat 的文件。

换句话说,我们想让字母f代表

exec vim `cat /tmp/screenCopyFile`

通过在 .screenrc 中绑定。

感谢 Rampion 的回答!

4

2 回答 2

1

我不知道 vim 太好了,但是用一些命令应该很容易完成。当您的粘贴缓冲区中已有文件名时,您可以使用这些有用的命令:

^A : writebuf /tmp/.screenpomfile
^A : exec vim parameters

我不知道如何vim从文件中读取文件名(我认为这是可能的),但你可以:exec用你自己的脚本编写一个能够解析`expr` 表达式的 shell:

#!/bin/sh
vim `cat /tmp/.screenpomfile`

稍后您可以将自己的键绑定到这些操作,并非常有效地使用它们。

于 2009-06-26T11:03:31.277 回答
1

好的,这是一个解决方案:

将以下内容放入/path/to/edit-file-under-cursor.screen

# edit-file-under-cursor.screen

# prevent messages from slowing this down
msgminwait 0
# copy path starting at cursor
stuff " Ebe "
# write the path to a file
writebuf /tmp/screen-copied-path
# open that file in vim in a new screen window
screen /bin/sh -c 'vim `cat /tmp/screen-copied-path`'
# turn message waiting back on
msgminwait 1

# vi: ft=screen

然后将此行添加到您的.screenrc

# bind CTRL-f to open the file starting at the cursor
# when in copy mode
bindkey -m ^f source /path/to/edit-file-under-cursor.screen

/path/to/适当地改变)

然后,要使用,请确保您重新启动screen(或重新加载.screenrc)。使用 进入复制模式^A[,将光标移至文件名的第一个字符,然后按CTRL-f

我已经对此进行了测试,它对我有用,所以如果您有任何问题,请告诉我。

如果您想了解我是如何知道如何执行此操作的,请man screen查看所有各种命令是如何工作的。

可以进行的一项改进是能够找到路径的开头,但仅使用屏幕的复制模式移动命令(例如,移动到“”的第一个/移动/a/path||/a/path”的任何东西)我无法可靠地做到这一点)

这是由于screen复制模式下的移动命令的限制:

移动键:
  h, j, k, l 逐行或逐列移动光标。
  0、^ 和 $ 移动到最左边的列,移动到该行的第一个或最后一个非空白字符。
  H、M 和 L 将光标移动到窗口顶部、中心或底部线的最左列。
  + 和 - 上下放置一行。
  G 移动到指定的绝对行(默认:缓冲区结束)。
  | 移动到指定的绝对列。
  w, b, e 逐字移动光标。
  B、E 逐字移动光标(如在 vi 中)。
  Cu 和 Cd 将显示向上/向下滚动指定的行数,同时保留光标位置。(默认:半屏全屏)。
  Cb 和 Cf 向上/向下滚动显示全屏。
  g 移动到缓冲区的开头。
  % 跳转到缓冲区的指定百分比。
...
搜索:
  /vi 似的向前搜索。
  ? 类似 vi 的向后搜索。
  Ca s Emacs 风格的增量搜索向前。
  Cr Emacs 风格的反向 i-search。

因此,如果我们将stuff上面的行更改为

stuff "Bw Ebe "

它将移动到路径的开头,但它也将包括路径之前的任何非空白垃圾。因此,只要您的所有路径都是用空格分隔的(在两边),这应该可以工作。

实际上

stuff "B//^M E?/^Me "

似乎工作得很好,因为它使用搜索来查找第一个和最后一个/^M通过按 CTRL-v 在 vi​​m 中键入,然后输入)。我还没有测试所有的边缘情况,但它似乎适用于:

/一条路径
 #/一条路径
 /一条路径#

但是,它会失败

一个/相对/路径
于 2009-07-02T07:18:59.407 回答