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

在 Bash 中使用 vi 模式(set-o vi)时,最好有一个依赖于当前模式(插入或命令)的提示符。如何找到这种编辑模式?

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

21840 次浏览

在搜索 google,查看 bash 手册页面,然后查看 bash 源代码(lib/readline/vi _ mode.c)之后,似乎没有简单的方法来更改从插入模式到命令模式的提示符。这里看起来似乎有一个机会让人们修补 bash 源代码,尽管在源代码中有启动和停止模式的调用。

看到你的帖子后,我对 bash vi 模式设置产生了兴趣。我喜欢 vi,为什么不在命令行上。然而,它看起来像我们必须保持轨道,如果我们在插入模式没有一个迅速的变化(所以说,许多论坛帖子)为什么它是值得的,你总是在插入模式,除非你打 ESC。这样会容易一点,但并不总是那么直观。

我提高了你的问题,因为我很想知道事情的进展。

我尝试得到一个指示器的 BASH vi 模式也,你们都知道这听起来很简单,只是没有办法做到这一点。

我目前的做法是: 当我不确定哪个模式时按“ a”。如果“ a”出现在 BASH PROMOT 之后,我知道我处于“ INSERT”模式。然后,我点击“返回”继续。这对我来说是个解决小烦恼的简单方法。

顺便说一下,我‘ alias a = ‘ cal’,或者其他什么东西来给空命中‘ a’一点用处。

新的 bash 4.3和 readline 6.3有些东西给你们. . 来自更新日志:

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

Into/etc/inputrc 或 ~/. inputrc (thx stooj)应该会影响所有启用 readline 的程序;)

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

你可以试试 beta 版本,但是它们现在看起来有点毛病。它们还不支持在提示符中指定模式指示器的位置(我认为这是杀手级的特性)。

If you don't want to wait, and aren't afraid of a little compilation, I've published patched versions of bash 4.3 and readline 6.3 to github that support this functionality.

使用补丁版本,你可以做这样的事情:

enter image description here

更多细节,包括如何安装,可在 https://github.com/calid/bash

多行提示和 .inputrc

Inputrc 有一个选项可以显示插入的 +和正常模式的 :,方法是像 eMPee584所写的那样在 ~/.inputrc中添加 set show-mode-in-prompt on,但是这对于多行提示符(使用旧版本的 bash 和 readline)不能很好地工作。

解决方案是使用一行 PS1(>)和一个在提示符之前回显内容的函数。它内置在 bash 中,称为 PROMPT_COMMAND

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


PROMPT_COMMAND='prompt'

通常的提示字符串在 printf 的 echo 中不可用。-e是用来解释颜色代码的,不需要添加 \[\],因为它们无论如何都不起作用。

插入 模式:

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 _

Preview (资料来源)

这样的多行提示符 形象

my work arround is like this

我的 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):"

希望这对你有帮助

通过 .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

In command mode, the cursor is displayed as block.
In insert mode, the cursor is displayed as vertical bar.

然后,根据模式的不同,提示符本身看起来会是这样的:

(cmd)$ ...
(ins)$ ...

这就是我在 ~/.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]

Command mode it is colored yellow.

└──[cmd]

缺点是它不能显示在 abc0上,这意味着它只能在虚拟终端上显示颜色。

Spacemacs 样式彩色光标

这个设置将 space emacs 光标与设置为 tdotspacemacs-colorize-cursor-according-to-state匹配。

set editing-mode vi


set vi-ins-mode-string \1\e[5 q\e]12;green\a\2
set vi-cmd-mode-string \1\e[1 q\e]12;orange\a\2


set show-mode-in-prompt on

enter image description here