我在 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 模式。我希望你能有一个惊喜,有人能找到解决方案,但我肯定找不到任何方法来实现你要求的。
我认为有办法做到这一点,但为了一点小麻烦而大费周章,我不认为你在提出这个问题时想到了这一点。如果这是真的,现在就停止阅读并享受你的生活吧。
另一方面,如果这真的是你最讨厌的事情,它让你发疯,你真的非常迫切地想要解决这个问题,那么我的想法是:
- 获取副本UNIX(R) 环境下的高级编程作者:W. Richard Stevens。
- 阅读以下章节流和终端 I/O。
- 下载源代码上述书中,包含一个可以分层到终端的流的示例。
- 实现对 Esc 组合键(或两种模式更改按键)的处理,并通过当前行的铃声或背景操作来指示它。
简而言之,Unix 将终端 I/O 实现为设备驱动程序和用户进程之间的全双工 I/O 流,模块可以插入其中。它以堆栈的形式组织,因此您可以根据需要分层任意数量的流。注入的流的总和将创建您的终端 I/O 行为。
当输入一个字符时,第一个模块会检查该字符并将其传递下去(如果它愿意的话)。当响应从相反方向到达时,它再次有机会检查并传递该字符。这就是 Ctrl-C 在比普通字符键更高的级别上得到处理的方式。
您可以创建一个实现流模块的二进制文件,当调用时,它会在前台静默运行,检查并传递所有击键,对您关心的击键执行您喜欢的操作。无论出于何种目的,它看起来都像是在 shell 上工作。哦。您可以在 .tcshrc 的最后一行(或第一行,或任何一行)调用此二进制文件,您甚至不知道它在那里。
有一个很好的入门书这里,但我找不到太多关于这个主题的资料,可能是因为它已经过了鼎盛时期。
答案4
编辑命令行有两种主要模式,
基于最常用的两个文本编辑器 Emacs 和 vi。随着六绑定,您必须在插入和命令模式;
每种模式下都有不同的命令可用。六模式有两个子模式,插入和命令模式。
- 默认模式为插入。
- 您可以通过按以下方式在模式之间切换
Esc
。- 或者,在命令模式,
输入“a”(追加)或“i”(插入)将返回到插入模式。
更多注释tcsh
定制页面已链接到上方。