The way to distinguish command-mode and insert-mode in Bash's Vi command line editing

BashViCommand Line-Interface

Bash Problem Overview


I'm always little bit confused when bash in vi-mode is switched to insert-mode, because it doesn't give any tip about used mode (command or edit). Is there any way to distinguish mods? May be automatic change of cursor color or something like that?

Bash Solutions


Solution 1 - Bash

in /etc/inputrc (or ~/.inputrc) add this:

set show-mode-in-prompt on

this will prefix your prompt with + while in insert-mode, and : while in command mode in bash 4.3

EDIT: in the latest version of bash 4.4, you will instead get a prompt prefixed with "(ins)" or "(cmd)" by default. but, you can change that:

set vi-ins-mode-string "+"
set vi-cmd-mode-string ":"

also, you can use color codes like '\e[1;31m', but surround them with '\1' and '\2' to keep readline happy:

set vi-cmd-mode-string "\1\e[1;31m\2:\1\e[0m\2"

Solution 2 - Bash

Building on @Isaac Hanson's answer you can set the cursor style to reflect the mode (just like in VIM) by setting these in your .inputrc:

set editing-mode vi
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2

# optionally:
# switch to block cursor before executing a command
set keymap vi-insert
RETURN: "\e\n"

This will give you a beam cursor in insert mode or a block cursor for normal mode.

Other options (replace the number after \e[):

        Ps = 0  -> blinking block.
        Ps = 1  -> blinking block (default).
        Ps = 2  -> steady block.
        Ps = 3  -> blinking underline.
        Ps = 4  -> steady underline.
        Ps = 5  -> blinking bar (xterm).
        Ps = 6  -> steady bar (xterm).

Your terminal must support DECSCURSR (like xterm, urxvt, iTerm2). TMUX also supports these (if you set TERM=xterm-256color outside tmux).

Solution 3 - Bash

After years of using vi mode in korn shell, I have basically trained myself to just tap ESC a few times before I type any commands, and ESC then i to start typing.

The basic premise being that if you just hit ESC, you know precisely what mode you are in.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionchuwyView Question on Stackoverflow
Solution 1 - BashIsaac HansonView Answer on Stackoverflow
Solution 2 - BashlaktakView Answer on Stackoverflow
Solution 3 - BashClarkeyView Answer on Stackoverflow