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


15

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

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

有人知道在shell中显示当前vi模式的方法吗?(通过在提示中包含内容)

Answers:


4

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

如果要进入命令模式,请在键入命令之前按ESC。

如果要进入插入模式,请在键入内容之前按ESC和i。

您最终将需要频繁按ESC,但是我遇到的每个vi用户仍然会这样做。


1
问题在于,在外壳程序中,多余的ESC不会被忽略-当我给出额外的ESC,然后键入命令(例如h向左移动)时,它只会发出蜂鸣声,并且不执行任何操作。
sundar-恢复莫妮卡

2
通过“额外ESC”,我的意思是当按下我已经在命令模式ESC -我做了很多,因为我不知道我在什么模式。
恢复莫妮卡-孙大信

你是对的。我已经使用了很长时间,以至于我什至不再注意到这种行为。同样,最简单的答案。如果您按ESC键却没有任何反应,请再次按h。我认为这提出了另一个问题。为什么在vi键绑定的“命令”模式下按ESC会导致下一个字符无法正确解释?vi本身不这样做。我可以键入ESC 10次,并且下一个命令仍然可以正常工作。
Bob Weber

另一个提示,请关闭铃。仅仅因为您描述的原因而令人讨厌,并且因为它在制表符完成时发出蜂鸣声。有多种方法可以执行此操作,具体取决于您的环境。
鲍勃·韦伯

1
好的,我目前正在尝试此解决方案。将Caps Lock映射到Escape使实现此操作更加容易,但是我还不习惯ESC-i的插入模式。我希望我会很快。>如果您按ESC键却没有任何反应,请再按一次h的问题是,它非常令人沮丧,并且中断了很多流程。除了要形成的命令外,我还必须考虑另外一件事。我更喜欢使用vi键绑定,原因是它们位于我的肌肉记忆中,因此无需多想-这种中断本身就是目的...
sundar-恢复莫妮卡2009年

3

我浏览了文档,不得不说我找不到任何检测和显示当前vi模式的方法。我确实希望您有一个令人惊喜的惊喜,并且有人提出了解决方案,但是我当然找不到解决您要求的方法。

我认为有办法做到这一点,但是对于一个小小的烦恼来说,这是巨大的矫kill过正,而且我不认为这是您提出这个问题时想到的。如果属实,请立即停止阅读并享受生活。

太太,如果这真的是您的宠儿,并且让您发疯,并且您确实绝对希望解决这个问题,以下是我的解决方法:

  1. 由W. Richard Stevens 获得UNIX(R)环境中Advanced Programming的副本。
  2. 阅读有关和终端I / O 的章节。
  3. 源代码下载到上述书籍中,其中包括可以分层到终端上的流的示例。
  4. 对Esc组合键(或两个模式更改按键)实施处理,并通过响铃或当前行的背景操作进行指示。

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

输入字符后,第一个模块将对其进行检查并将其继续传递(如果需要)。当响应以相反的方向到达时,它又有机会检查并继续传递。这是Ctrl-C在比普通字符键更高的级别上得到处理的方式。

您可以创建一个实现流模块的二进制文件,该流模块在被调用时会在前台静默运行,检查并传递所有击键,并对您关心的击键执行首选操作。出于所有目的和目的,它看起来就像您在使用Shell一样。哦 您可以在.tcshrc的最后一行(或第一行或任何行)上调用此二进制文件,甚至不知道它在那里。

有一个很好的入门这里,但我无法找到很多关于这个话题,可能是因为它是过去它的首要。


2

该页面有一个相当详细的脚本,用于在zsh中设置您想要的内容(以及更多内容)。也许可以将其修改为与tcsh一起使用(我对该shell并不十分熟悉)。


我也不熟悉tcsh,但是我认为您显示的页面使用zsh小部件(带有zle)。我不认为其他外壳具有这种功能,但是如果确实如此,那绝对可以解决问题。
BrianH

1

对于任何有这个确切问题的人(例如我自己):我在stackoverflow找到了一个解决方案。显然,readline中对此提供了本机支持,因此您可以将以下内容添加到您的~/.inputrc

set show-mode-in-prompt on

并自定义实际角色使用:

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

0

使用tcsh进行命令行编辑


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

使用vi绑定,必须在插入命令模式之间切换;
在每种模式下,不同的命令很有用。

vi模式有两个子模式, insert模式和 command模式。

  • 默认模式是insert
  • 您可以通过按在模式之间切换Esc
  • 或者,在命令模式下,
    键入“ a”(附加)或“ i”(插入)将使您返回插入模式

上面已链接的tcsh自定义页面上的更多注释。


2
您的链接将转到受版权保护的O'Reilly书...
BrianH,2009年

0

我遇到了同样的问题,偶然发现了解决方案。尽管此线程很旧,但是我找不到其他提供解决方案的网站,因此我认为在此线程上发布是可以的。

只需重置终端程序或外壳程序的设置即可。我当前正在使用PuTTY,我只是删除了已保存的连接的已保存设置,并重新创建了已保存的会话。像魅力一样工作。

希望这可以帮助!


0

请参阅我对SO的回答。Bash 4.4 / Readline 7.0将添加对此功能的支持,在此期间,我已将Bash 4.3 / Readline 6.3的补丁版本发布到github

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.