不同的 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-stringvi-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 编辑模式?的主要内容,如果未能解决你的问题,请参考以下文章

Vi 和 Vim 编辑器详细使用方法

vi和vim文本编辑器原理参数及快捷键详解

linux vi怎么编辑器删除多行与复制命令

vi文本编辑器有哪三大工作模式,时如何进行转化的?

centos7vi保存退出显示为目录

2018-1-2Linux基础知识(19)vi编辑器及bash算数