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

110 bash prompt

当使用vi模式(set -o vi)和Bash时,最好有一个取决于你当前所处模式的提示(插入或命令).如何找到这种编辑模式?

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

eMP*_*584 63

新鲜的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.
Run Code Online (Sandbox Code Playgroud)

所以推杆

set show-mode-in-prompt on
Run Code Online (Sandbox Code Playgroud)

进入/ etc/inputrc或〜/ .inputrc(thx stooj)会影响所有启用readline的程序;)

  • 只需从eMPee584添加 - 如果您运行的是bash 4.3或更高版本,请将以下内容添加到〜/ .inputrc文件中set show-mode-in-prompt如果您处于编辑模式,则会在提示的最左侧添加+ ,和a:如果你处于命令模式. (4认同)
  • 所以虽然这有效; 有没有办法移动这个vi模式角色在他提示的位置?如果你有多行提示(自定义)它不能很好地工作:) (3认同)

小智 19

搜索谷歌后,查看bash手册页,然后查看bash源代码(lib/readline/vi_mode.c),看起来没有简单的方法来从插入模式转换到命令模式时更改提示.看起来这里有人有机会修补bash源,因为有人要求启动和停止源中的模式.

看到你的帖子后,它让我对bash vi模式设置感兴趣.我爱vi,为什么不在命令行上.然而,它看起来我们将不得不继续跟踪我们是否处于插入模式,而不提示变化(所以sayeth多少帖子)对于什么是值得你总是在插入模式,除非你打ESC.使它更容易一些,但并不总是那么直观.

我正在提高你的问题,因为我有兴趣看看它的发展方向.


Dyl*_*ali 19

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

您可以尝试测试版本,但目前它们看起来有点儿麻烦.他们还不支持在提示符中指定您希望模式指示符出现的位置(我认为这是杀手级功能).

如果您不想等待,并且不想进行一点编译,我已经将bash 4.3和readline 6.3的修补版本发布到支持此功能的github.

使用修补版本,您可以执行以下操作:

在此输入图像描述

有关详细信息,包括如何安装,请访问https://github.com/calid/bash


win*_*rrr 8

不同的提示和光标样式通过.inputrc

首先,您应该确保您运行的 bash 版本高于4.3

$ bash --version
GNU bash, version 4.4
Run Code Online (Sandbox Code Playgroud)

然后将以下行放入您的~/.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
Run Code Online (Sandbox Code Playgroud)

在命令模式下,光标显示为块。
在插入模式下,光标显示为垂直条。

根据模式,提示本身将如下所示:

(cmd)$ ... 
(ins)$ ...
Run Code Online (Sandbox Code Playgroud)


Jet*_*sel 8

这就是我所拥有的~/.inputrc

\n\n
set show-mode-in-prompt on\nset vi-ins-mode-string \\1\\e[34;1m\\2\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80[ins]\xee\x82\xb0 \\1\\e[0m\\2\nset vi-cmd-mode-string \\1\\e[33;1m\\2\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80[\xee\x82\xa2cmd]\xee\x82\xb0 \\1\\e[0m\\2\n
Run Code Online (Sandbox Code Playgroud)\n\n

插入模式它的颜色为蓝色。

\n\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80[ins]\xee\x82\xb0\n
Run Code Online (Sandbox Code Playgroud)\n\n

命令模式它是黄色的。

\n\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80[\xee\x82\xa2cmd]\xee\x82\xb0\n
Run Code Online (Sandbox Code Playgroud)\n\n

缺点是它不显示,tty只能在终端模拟器上显示颜色。

\n


Sam*_*ler 8

Spacemacs 风格彩色光标

dotspacemacs-colorize-cursor-according-to-state此设置与设置为 的spacemacs 光标相匹配t

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 你能解释一下这些 ansi 术语代码的用途吗? (2认同)

小智 7

多线提示和 .inputrc

INPUTRC有一个选项,以显示一个+插入和:正常模式下,通过增加set show-mode-in-prompt on~/.inputrc作为eMPee584写道,但这并不具有多提示(与旧版本的bash和readline的)很好地工作.

解决方案是有一个line PS1(>),以及一个在提示之前回显一些东西的函数.它被构建为bash并被调用PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 
Run Code Online (Sandbox Code Playgroud)

通常的提示字符串在printf的echo中不可用.该-e是interprete颜色代码,这是没有必要添加\[\],不反正工作.

插入模式:

20:57   /home/sshbio/dotfiles/bash
+ > _
Run Code Online (Sandbox Code Playgroud)

正常模式:

20:57   /home/sshbio/dotfiles/bash
: > _
Run Code Online (Sandbox Code Playgroud)

按下选项卡,只重复PS1,这对我来说很有意义:

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _
Run Code Online (Sandbox Code Playgroud)

预习 (资源)