在 shell 中使用 Vi 键绑定时如何显示当前 Vi 模式?

在 shell 中使用 Vi 键绑定时如何显示当前 Vi 模式?

我在 tcsh shell 中使用 vi 键绑定。

现在,我不知道我处于哪种 vi 模式(insert模式或command模式),这导致了很多挫败感。

有人知道如何在 shell 中显示当前的 vi 模式吗?(通过包含在提示符或其他内容中)

答案1

我不相信有任何方法可以直观地确定你处于什么模式,但如果你稍微改变一下你的行为就没关系了。

如果您想进入命令模式,请在输入命令之前按 ESC。

如果您想进入插入模式,请在输入内容之前按 ESC 和 i。

您最终会多次按 ESC,但我遇到的每个 vi 用户都会这样做。

答案2

对于遇到此问题的人(例如我自己),我找到了解决方案堆栈溢出。显然 readline 本身支持此功能,因此您只需将以下内容添加到您的~/.inputrc

set show-mode-in-prompt on

并定制实际的角色使用:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

答案3

我查看了文档,不得不说我找不到任何方法来检测和显​​示当前的 vi 模式。我希望你能有一个惊喜,有人能找到解决方案,但我肯定找不到任何方法来实现你要求的。

我认为有办法做到这一点,但为了一点小麻烦而大费周章,我不认为你在提出这个问题时想到了这一点。如果这是真的,现在就停止阅读并享受你的生活吧。

另一方面,如果这真的是你最讨厌的事情,它让你发疯,你真的非常迫切地想要解决这个问题,那么我的想法是:

  1. 获取副本UNIX(R) 环境下的高级编程作者:W. Richard Stevens。
  2. 阅读以下章节和终端 I/O。
  3. 下载源代码上述书中,包含一个可以分层到终端的流的示例。
  4. 实现对 Esc 组合键(或两种模式更改按键)的处理,并通过当前行的铃声或背景操作来指示它。

简而言之,Unix 将终端 I/O 实现为设备驱动程序和用户进程之间的全双工 I/O 流,模块可以插入其中。它以堆栈的形式组织,因此您可以根据需要分层任意数量的流。注入的流的总和将创建您的终端 I/O 行为。

当输入一个字符时,第一个模块会检查该字符并将其传递下去(如果它愿意的话)。当响应从相反方向到达时,它再次有机会检查并传递该字符。这就是 Ctrl-C 在比普通字符键更高的级别上得到处理的方式。

您可以创建一个实现流模块的二进制文件,当调用时,它会在前台静默运行,检查并传递所有击键,对您关心的击键执行您喜欢的操作。无论出于何种目的,它看起来都像是在 shell 上工作。哦。您可以在 .tcshrc 的最后一行(或第一行,或任何一行)调用此二进制文件,您甚至不知道它在那里。

有一个很好的入门书这里,但我找不到太多关于这个主题的资料,可能是因为它已经过了鼎盛时期。

答案4

使用 tcsh 进行命令行编辑

编辑命令行有两种主要模式,
基于最常用的两个文本编辑器 Emacs 和 vi。

随着绑定,您必须在插入命令模式;
每种模式下都有不同的命令可用。

模式有两个子模式,插入命令模式。

  • 默认模式为插入
  • 您可以通过按以下方式在模式之间切换Esc
  • 或者,在命令模式,
    输入“a”(追加)或“i”(插入)将返回到插入模式

更多注释tcsh定制页面已链接到上方。

相关内容