不同的bash提示用于不同的vi编辑模式?


113

当在Bash中使用vi模式(设置-o vi)时,根据您当前所处的模式(插入或命令)进行提示会很不错。如何找到这种编辑模式?

顺便说一句,这似乎在ZSH中是可能的:

bash  prompt 

我对此也很好奇。一直在搜寻bash文档,但没有发现任何东西。
Andrew Ferrier 2010年

Answers:


67

新鲜的bash 4.3和readline 6.3为你们提供了一些..从changelog:

4.  New Features in Readline
j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

所以放

set show-mode-in-prompt on

进入/ etc / inputrc或〜/ .inputrc(thx stooj)应该会影响所有启用了readline的程序;)


对此有何地位?我正在尝试找到类似的内容(不是针对bash,而是针对我使用的其他基于readline的提示)。我一直在使用Google搜索,没有找到任何其他更新(除此和您引用的文章之外)
Mike HR

4
只是从eMPee584添加-如果您正在运行bash 4.3或更高版本,则将以下内容添加到〜/ .inputrc文件集中show-mode-in-prompt如果在编辑模式下,这将在提示符的最左侧添加+ ,和a:如果您处于命令模式。
stooj 2014年

3
因此,尽管这可行;有没有办法移动此vi模式字符在提示下的位置?如果您有多行提示(自定义),那么效果就不太好了:)
James Mills 2015年

对于4.3,它始终在提示的开头,不幸的是,readline只会重绘多行提示的最后一行。请参阅“多行提示和.inputrc”答案以获取解决方法,或参阅有关使用4.4的修补程序修补bash 4.3的答案。
studgeek

20

Bash 4.4 / Readline 7.0 将添加对用户可设置模式字符串的支持

您可以尝试使用Beta版本,但目前它们似乎有问题。他们还不支持在提示中指定希望模式指示器出现的位置(我认为这是杀手级功能)。

如果您不想等待,并且不怕稍作编译,那么我已将支持bash 4.3和readline 6.3的补丁版本发布到支持此功能的github。

使用补丁版本,您可以执行以下操作:

在此处输入图片说明

包括如何安装在内的更多详细信息,请参见https://github.com/calid/bash


19

搜索google之后,浏览bash手册页,然后浏览bash源代码(lib / readline / vi_mode.c),从插入模式转换为命令模式时,似乎没有简便的方法来更改提示。尽管有人呼吁启动和停止源代码中的模式,但似乎有人可能会在这里修补bash源代码。

看到您的帖子后,我对bash vi模式设置产生了兴趣。我喜欢vi,为什么不在命令行上呢?但是,看起来我们将不得不跟踪我们是否处于插入模式而无需及时更改(因此,许多论坛帖子都这么说了)。值得的是,除非您按ESC键,否则始终处于插入模式。使它更容易一些,但并不总是那么直观。

我正在提出您的问题,因为我有兴趣了解进展情况。


7

多行提示和 .inputrc

INPUTRC有一个选项,以显示一个+用于插入和:正常模式中,通过将set show-mode-in-prompt on~/.inputrc作为eMPee584写道,但这并不能很好地多提示(与旧版本的bash和readline的)工作。

解决方案是使用单行PS1>),以及在提示之前回显某些内容的函数。它内置于bash中并称为PROMPT_COMMAND

function prompt {
    PS1=' > '
    echo -e "$(date +%R)  $PWD"
}

PROMPT_COMMAND='prompt' 

通常的提示字符串在printf的回显中不可用。该-e是interprete颜色代码,这是没有必要添加\[\],则无论如何都不起作用。

插入方式:

20:57   /home/sshbio/dotfiles/bash
+ > _

普通模式:

20:57   /home/sshbio/dotfiles/bash
: > _

按下tab,仅重复PS1,这对我来说很有意义:

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

预习 (资源)


如果在vi-cmd-mode-string或中使用颜色vi-ins-mode-string,则这些颜色应以前缀\1和后缀\2。看这里。此外,\[\[仍然应该发出的,但你需要\\[\\]内部的printf。
汤姆·黑尔

1

这就是我所拥有的 ~/.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2

插入模式为蓝色。

└──[ins]

命令模式下它显示为黄色。

└──[cmd]

不利的一面是,它不显示在tty含义上,它仅适用于终端模拟器,仅显示颜色。


0

我也尝试获得BASH vi模式的指示器,并且大家都知道它听起来很简单,而且还没有办法实现。

我当前的方法是:当我不确定哪种模式时,按“ a”。如果BASH PROMOT之后出现“ a”,则表明我处于“插入”模式。然后,我点击“返回”并继续。这是我解决小烦恼的简便方法。

顺便说一句,我“别名a =” cal”或其他给空匹配“ a”有用的东西。


2
对我来说,只打“ esc || c- [”而不是a更有意义。这样,您就不必知道自己的工作模式了;或插入不需要删除的字符(或按回车键)
wom

0

对于多行提示这样 的图像

我的工作环境就是这样

我的bash提示

export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "

.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"

希望这对你有帮助


0

通过不同的提示和光标样式 .inputrc

首先,您应确保运行的bash版本高于4.3

$ bash --version
GNU bash, version 4.4

然后将以下行放入您的~/.inputrc

#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline

# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi

# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on

# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
#   FOR THE NUMBER AFTER `\e[`:
#     0: blinking block
#     1: blinking block (default)
#     2: steady block
#     3: blinking underline
#     4: steady underline
#     5: blinking bar (xterm)
#     6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2

在命令模式下,光标显示为块。
在插入模式下,光标显示为竖线。

然后,根据模式,提示本身将如下所示:

(cmd)$ ... 
(ins)$ ...
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.