在 Bash 中使用 vi 模式 (set -o vi) 时,最好有一个取决于您当前处于的模式(插入或命令)的提示。如何找到这种编辑模式?
顺便说一句,这在ZSH中似乎是可能的:
在 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 (thx stooj) 应该会影响所有启用 readline 的程序;)
Bash 4.4 / Readline 7.0将增加对用户可设置模式字符串的支持。
您可以尝试测试版,但目前它们似乎有点错误。他们还不支持在提示中指定您希望模式指示器出现的位置(我认为这是杀手级功能)。
如果您不想等待,并且不怕一点编译,我已经在 github 上发布了支持此功能的 bash 4.3 和 readline 6.3 的修补版本。
使用修补版本,您可以执行以下操作:
更多详细信息,包括如何安装,请访问https://github.com/calid/bash
在搜索谷歌后,查看 bash 手册页,然后查看 bash 源代码(lib/readline/vi_mode.c),当从插入模式移动到命令模式时,似乎没有简单的方法来更改提示。看起来有人可能有机会修补 bash 源代码,尽管有人要求启动和停止源代码中的模式。
看到您的帖子后,我对 bash vi 模式设置产生了兴趣。我喜欢 vi,为什么不在命令行上。然而,看起来我们将不得不跟踪我们是否处于插入模式而无需立即更改(许多论坛帖子都这么说)因为值得您始终处于插入模式,除非您按 ESC。使它更容易一些,但并不总是那么直观。
我正在提高你的问题,因为我有兴趣看看它的去向。
.inputrc
Inputrc 有一个选项来显示+
插入和:
正常模式,通过添加如 eMPee584 所写set show-mode-in-prompt on
的~/.inputrc
那样,但这不适用于多行提示(旧版本的 bash 和 readline)。
一个解决方案是有一个单行PS1
( >
) 和一个在提示之前回显某些内容的函数。它内置在 bash 中并称为PROMPT_COMMAND
.
function prompt {
PS1=' > '
echo -e "$(date +%R) $PWD"
}
PROMPT_COMMAND='prompt'
通常的提示字符串在 printf 的 echo 中不可用。是用来解释颜色代码的-e
,不用加\[
or \]
,反正也不管用。
插入模式:
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 _
这就是我所拥有的~/.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
它仅在终端仿真器上仅适用于颜色的含义。
.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)$ ...
对于像这张图片这样的多行提示
我的工作是这样的
我的 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):"
希望这对你有帮助
我也尝试获得 BASH vi 模式的指示器,你们都知道这听起来很简单,只是还没有办法做到这一点。
我目前的做法是:当我不确定是哪种模式时按“a”。如果在 BASH PROMOT 之后出现“a”,我知道我处于“插入”模式。然后,我点击“返回”并继续。这是我解决小烦恼的简单方法。
顺便说一句,我'alias a='cal',或者别的东西给空的命中'a'一点用处。