当在Bash中使用vi模式(set -o vi)时,希望拥有一个根据当前模式(插入或命令)而变化的提示符。如何找出这个编辑模式?
顺便提一下,在ZSH中似乎可以实现这一点:链接
最新的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
将以下内容添加到 /etc/inputrc 或 ~/.inputrc (感谢 stooj)可以影响所有启用 readline 的程序 ;)
在搜索了Google、查阅了bash man页面和查看了bash源代码(lib/readline/vi_mode.c)后,我发现没有简单的方法可以在从插入模式切换到命令模式时更改提示符。不过,由于源代码中有启动和停止模式的调用,因此可能会有机会让某人修补bash源代码。
看到您的帖子后,我对bash vi模式设置产生了兴趣。我喜欢vi,并且希望在命令行上使用它。但是,很多论坛帖子指出我们必须跟踪是否处于插入模式而没有提示符更改。就其价值而言,除非按ESC键,否则始终处于插入模式。这使得操作变得稍微容易一些,但并不总是那么直观。
我对你的问题产生了兴趣,期待看到进展。
<code>〜/ .inputrc</ code>
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]
.inputrc
.inputrc
有一个选项可以在插入模式下显示 +
,在正常模式下显示 :
,只需在 ~/.inputrc
中添加 set show-mode-in-prompt on
,就像 eMPee584 所写的那样。但是,在具有较旧版本的 bash 和 readline 的多行提示符中,这种方法效果不佳。
解决方案是使用单行 PS1
(>
),并在提示符之前输出一些内容的函数。它内置于 bash 中,称为 PROMPT_COMMAND
。
function prompt {
PS1=' > '
echo -e "$(date +%R) $PWD"
}
PROMPT_COMMAND='prompt'
-e
来解释颜色代码,而且不需要添加\[
或\]
,因为这样做也没有效果。
插入模式:20:57 /home/sshbio/dotfiles/bash
+ > _
正常模式:
20:57 /home/sshbio/dotfiles/bash
: > _
20:57 /home/sshbio/dotfiles/bash
+ > ls _
bashrc bash_profile inputrc
+ > ls _
vi-cmd-mode-string
或 vi-ins-mode-string
中使用颜色,应该在前缀中加上 \1
,在后缀中加上 \2
。请参见此处。另外,在 printf 中仍然需要发出 \[
和 \[
,但是你需要使用 \\[
和 \\]
。 - Tom Hale.inputrc
设置不同的提示符和光标样式首先,确保你正在运行高于4.3
版本的bash:
$ 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)$ ...
set vi-cmd-mode-string \033[1;32m\1\e[1 q\2
,它只会改变你的提示符号的颜色。这正是我想要的!- 不再是另一个 ()
。 - Nealiumexport 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):"
我也尝试为BASH vi模式获取一个指示器,但是你们都知道这听起来很简单,但实际上还没有找到方法。
我的当前方法是:当我不确定处于哪种模式时,按下'a'。如果在BASH提示符后出现'a',则说明我处于“插入”模式。然后,我按下“RETURN”并继续。这对我来说是解决小烦恼的简单方法。
顺便说一句,我将“a = cal”或其他内容设置为别名,以使空白的按键'a'有点用处。