不同的 bash 提示符对应不同的 vi 编辑模式?
Posted
技术标签:
【中文标题】不同的 bash 提示符对应不同的 vi 编辑模式?【英文标题】:Different bash prompt for different vi editing mode? 【发布时间】:2010-11-05 14:22:24 【问题描述】:在 Bash 中使用 vi 模式 (set -o vi) 时,最好有一个取决于您当前处于的模式(插入或命令)的提示。如何找到这种编辑模式?
顺便说一句,这在ZSH 中似乎是可能的:
【问题讨论】:
我也对此感到好奇。一直在寻找 bash 文档,但没有找到任何东西。 Consider toggling a single character in the prompt to indicate the mode. 【参考方案1】:Fresh 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,而是针对我使用的其他基于 readline 的提示)。我一直在谷歌搜索,没有发现任何其他更新(除了这个和文章you referenced) 只是从 eMPee584 添加 - 如果您正在运行 bash 4.3 或更高版本,请将以下内容添加到您的 ~/.inputrc 文件集 show-mode-in-prompt 这会在最左侧添加一个 +如果您处于编辑模式,则提示您,如果您处于命令模式,则为 :。 所以虽然这有效;有没有办法移动这个 vi 模式字符在他提示符中的位置?如果您有多行提示(自定义),则效果不佳:) 对于 4.3,它总是在提示符的开头,不幸的是,readline 只会重绘多行提示符的最后一行。有关解决方法,请参阅“多行提示和 .inputrc”答案,或查看有关使用 4.4 修复此问题修补 bash 4.3 的答案。【参考方案2】:Bash 4.4 / Readline 7.0 will add support for user-settable mode strings.
您可以尝试测试版,但目前它们似乎有点问题。他们还不支持在提示中指定您希望模式指示器出现的位置(我认为这是杀手级功能)。
如果您不想等待,并且不怕一点编译,我已经在 github 上发布了支持此功能的 bash 4.3 和 readline 6.3 的修补版本。
使用补丁版本,您可以执行以下操作:
更多详细信息,包括如何安装,请访问https://github.com/calid/bash
【讨论】:
【参考方案3】:在谷歌搜索后,查看 bash 手册页,然后查看 bash 源代码(lib/readline/vi_mode.c),当从插入模式移动到命令时,似乎没有简单的方法来更改提示模式。看起来有人可能有机会修补 bash 源代码,尽管有人要求启动和停止源代码中的模式。
看到您的帖子后,我对 bash vi 模式设置产生了兴趣。我喜欢 vi,为什么不在命令行上。但是,看起来我们将不得不跟踪我们是否处于插入模式而无需立即更改(许多论坛帖子都这么说)因为值得您始终处于插入模式,除非您按 ESC。让它更容易一些,但并不总是那么直观。
我正在提出你的问题,因为我有兴趣了解它的去向。
【讨论】:
【参考方案4】:多行提示和.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'
通常的提示字符串在 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 _
(Source)
【讨论】:
如果在vi-cmd-mode-string
或vi-ins-mode-string
中使用颜色,则应以\1
为前缀,以\2
为后缀。见here。此外,\[
和 \[
仍应发出,但您需要在 printf 中使用 \\[
和 \\]
。【参考方案5】:
不同的提示和光标样式来自.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)$ ...
【讨论】:
【参考方案6】:这就是我在~/.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
上显示,这意味着它只能在终端模拟器上工作,只有颜色。
【讨论】:
【参考方案7】:Spacemacs 风格的彩色光标
此设置与将dotspacemacs-colorize-cursor-according-to-state
设置为t
的spacemacs 光标匹配。
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
【讨论】:
你能解释一下那些 ansi 术语代码在做什么吗?【参考方案8】:对于像这样的多行提示 image
我的工作环境是这样的
我的 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):"
希望对你有帮助
【讨论】:
【参考方案9】:我也尝试获得 BASH vi 模式的指示器,你们都知道这听起来很简单,只是还没有办法。
我目前的做法是:当我不确定是哪种模式时按“a”。如果在 BASH PROMOT 之后出现“a”,我知道我处于“插入”模式。然后,我点击“返回”并继续。这是我解决小烦恼的一种简单方法。
顺便说一句,我将'alias a='cal' 或其他东西赋予空的命中'a' 一点用处。
【讨论】:
对我来说只点击“esc||c-[”而不是 a.然后你不必看就知道你在什么模式;或插入您必须删除的不需要的字符(或按回车键)以上是关于不同的 bash 提示符对应不同的 vi 编辑模式?的主要内容,如果未能解决你的问题,请参考以下文章