別のvi編集モードの別のbashプロンプト?


113

Bashでviモード(set -o vi)を使用する場合、現在のモード(挿入またはコマンド)に応じてプロンプトを表示すると便利です。この編集モードをどのようにして見つけますか?

ところで、これはZSHで可能であるようです

bash  prompt 

これについても興味があります。bashのドキュメントを探していましたが、何も見つかりませんでした。
Andrew Ferrier

回答:


67

新鮮な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ベースのプロンプト)。私はググリングしていて、他の更新を見つけていません(これとあなたが参照した記事除いて)
Mike HR

4
eMPee584から追加するだけ-bash 4.3以降を実行している場合は、〜/ .inputrcファイルセットに以下を追加します。show-mode-in-promptこれにより、編集モードの場合、プロンプトの左端に+が追加されます。 、およびa:コマンドモードの場合。
stooj 14年

3
したがって、これは機能しますが、このviモードのキャラクターがプロンプトに座っている場所に移動する方法はありますか?複数行のプロンプト(カスタム)がある場合、それほどうまく機能しません:)
James Mills

4.3では、常にプロンプ​​トの先頭にあり、残念ながら、readlineは複数行のプロンプトの最後の行のみを再描画します。回避策については「マルチラインプロンプトと.inputrc」の回答を参照するか、この問題に対する4.4の修正を適用したbash 4.3へのパッチ適用に関する回答を参照してください。
studgeek 2016年

20

Bash 4.4 / Readline 7.0では、ユーザー設定可能なモード文字列のサポートが追加されます

ベータ版を試すこともできますが、現時点では少しバグがあるようです。また、プロンプトのどこでモードインジケーターを発生させたいかを指定することもまだサポートしていません(これがキラー機能だと思います)。

あなたが待ちたくない、そして少しのコンパイルを恐れないなら、私はこの機能をサポートするgithubにbash 4.3とreadline 6.3のパッチを当てたバージョンを公開しました。

パッチバージョンでは、次のようなことができます。

ここに画像の説明を入力してください

インストール方法を含む詳細については、https://github.com/calid/bashをご覧ください。


19

googleを検索し、bashのマニュアルページを調べ、bashのソースコード(lib / readline / vi_mode.c)を確認すると、挿入モードからコマンドモードに移行するときにプロンプ​​トを簡単に変更する方法がないようです。ソースのモードの開始と停止の呼び出しがあるため、誰かがbashソースにパッチを適用する機会があるかもしれません。

あなたの投稿を見て、私はbash viモード設定に興味を持った。私はviが大好きで、なぜコマンドラインではそうしません。ただし、プロンプトを変更せずに挿入モードになっているかどうかを追跡する必要があるようです(多数のフォーラム投稿があるため)。ESCを押さない限り、常に挿入モードにいる価値があります。少し簡単になりますが、必ずしも直感的ではありません。

これがどこに行くのかを知りたいので、質問を増やします。


7

複数行プロンプトと .inputrc

INPUTRCは、表示するオプションがある+の挿入のためにと:追加することによって、通常モードのためset show-mode-in-prompt on~/.inputrceMPee584が書いたように、これは、プロンプト(bashのとのreadlineの古いバージョンでは)複数行でうまく動作しません。

解決策は、1行PS1>)と、プロンプトの前に何かをエコーする関数です。これはbashに組み込まれ、呼び出されPROMPT_COMMANDます。

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

PROMPT_COMMAND='prompt' 

通常のプロンプト文字列は、printfのエコーでは使用できません。-einterpreteカラーコードにあり、追加する必要はありません\[\]、とにかく動作しません。

挿入モード:

20:57   /home/sshbio/dotfiles/bash
+ > _

通常モード:

20:57   /home/sshbio/dotfiles/bash
: > _

タブを押すと、PS1のみが繰り返されます。これは私にとって意味があります。

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

プレビュー (ソース)


vi-cmd-mode-stringまたはvi-ins-mode-stringで色を使用する場合、これらの色の前にを付け\1、後にを付け\2ます。こちらをご覧ください。また、\[そして\[、まだ放出されるはずですが、あなたは必要です\\[し、\\]内部のprintf。
トム・ヘイル

1

これは私が持っているものです ~/.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、端末エミュレーターでのみ機能するという意味で表示されないことです。


0

私もBASH viモードのインジケーターを取得しようとしますが、皆さんはそれがシンプルであり、まだそれを行う方法がないことを学びました。

私の現在のアプローチは次のとおりです。どちらのモードかわからない場合は、「a」を押します。「a」がBASH PROMOTの後に表示される場合、「INSERT」モードであることを知りました。次に、「RETURN」を押して続行します。これは、私が小さな煩わしさを解決する簡単な方法です。

ちなみに、私は 'alias a =' cal '、または空のヒットを' a '少し便利にするための何か他のものです。


2
「a」ではなく「esc || c- [」を押すだけの方が理にかなっています。そうすれば、自分のモードを知る必要はありません。または、削除する必要がある不要な文字を挿入する(またはReturnキーを押す)
wom

0

この画像のような複数行プロンプトの場合

私の仕事の取り決めはこのようなものです

私の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):"

これがお役に立てば幸いです


0

異なるプロンプトとカーソルスタイル .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)$ ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.