Bashでviモード(set -o vi)を使用する場合、現在のモード(挿入またはコマンド)に応じてプロンプトが表示されると便利です。この編集モードはどのようにしてわかりますか?
B.t.w、これは [〜#〜] 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のエコーでは使用できません。 -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 _
これは私が~/.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
に表示されないことです。つまり、端末エミュレーターでのみ色のみが機能します。
BASH viモードのインジケーターも取得しようとしていますが、皆さんはそれがシンプルであり、まだそれを行う方法がないことを知っています。
私の現在のアプローチは、どのモードかわからないときに「a」を押すことです。 BASH PROMOTの後に「a」が表示される場合、「INSERT」モードになっていることがわかります。その後、「戻る」を押して続行します。これは小さな厄介な問題を解決する簡単な方法です。
ちなみに、私は「alias a = 'cal」、または空のヒットを与える他の何か「a」に少し有用性を与えます。
.inputrc
によるさまざまなプロンプトとカーソルスタイルまず、4.3
よりも高いバージョンのbashを実行していることを確認する必要があります。
$ 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)$ ...
このような複数行プロンプトの場合 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):"
これがお役に立てば幸いです