Vim 拦截 ssh 转义

Vim 拦截 ssh 转义

没有任何问题需要解决(据我所知)。我正在尝试更好地理解 ssh。

在我的系统上,ssh 转义字符是波形符 (~)。如果我在某个地方 ssh 我可以按预期使用它:

me@local$ ssh remote
me@remote$                # here I press tilde, control+z
[1]+  Stopped                 ssh remote
me@local$

一切都很好。但是,如果我vim在遥控器上运行,vim 会突然看到转义字符。好像不再发送转义字符了 ssh但反而通过 ssh,就好像它不是转义字符一样。

me@local$ ssh remote
me@remote$ vim
# vim opens, here I press tilde, control+z
[1]+  Stopped                 vim
me@remote$ 

我的问题是,如何影响 的转义字符vim的行为?ssh

答案1

来自评论:

如果在按波浪号和 Control+Z 键之前按 Return/Enter 键,效果如何? - 低声

如果我这样做,它确实会将 ssh 置于后台。为什么 Return/Enter 会改变行为?这在哪里记录? - 杀死-9

反向回答,因为第二个问题的答案比第一个问题更简洁:

这个(在~之前按回车键)记录在哪里?

Openssh 手册页的转义字符部分描述命令转义序列,使ssh客户端程序执行操作而不是将击键转发到远程服务器。第二段有这样一句话:

转义字符必须始终跟在换行符之后才能被解释为特殊字符。

如果您发现这有点模糊且容易被忽视,我不会责怪您。以前的情况更糟!我第一次遇到~.exit 命令是在 20 世纪 90 年代的 SunOS 4.x 命令中tip,它的手册页说:

作为一行的第一个字符出现的波形符 (~) 是一个转义信号,指示提示执行某些特殊操作。

这个描述让读者推断,对于密钥~来说一行的第一个字符,前面的击键必须是 Return/Enter。在文档中推理并不是一件好事。大多数人都没有抓住要点,并且当tip似乎忽视他们的~.(退出)命令时感到沮丧。手册ssh页改进了描述,使其更加明确。

~这些转义序列(似乎可以追溯到1981 年的 4.1BSD Unix)之所以rlogin要求前面有 Return/Enter 是为了防止~.(可能在上传到远程服务器的文件中)出现无意中断开会话的情况。

为什么运行 vim 的远程会话似乎需要额外的 Return 按键?

(我对你的问题的解释)

我无法准确地告诉您为什么vim与运行其他命令相比,您的远程会话调用需要“额外”的 Return 按键。但我可以提供一些有根据的猜测:

  • vim当您在远程服务器上运行并按回车键时,您在键入 之前已经键入了一些其他按键~Ctrl-Z。也许您按下了箭头或hjkl光标移动键。或者Ctrl-L刷新显示。
  • vim如果您在调用和键入之间没有按任何键~Ctrl-Z,那么vim程序可能正在向您的终端程序发送字符序列以请求状态,并且您的终端程序正在发送回字符作为答案。这种查询和回答通常不会由终端程序显示。答案序列来自您的终端程序,就像您的击键一样,您的 ssh 客户端会看到前面的其他字符~而不是 Return。

第二种猜测的可能性比第一种小,但我在某些情况下也遇到过。

最终...

将转义序列/命令发送到 ssh 客户端程序的最可靠方法是将转义字符视为实际上是两个字符:Return 后跟波形符。对于大多数命令,这使得序列需要击键三次而不是两次。

相关内容