Invite de bash différente pour différents modes d'édition de vi?


113

Lorsque vous utilisez le mode vi (set -o vi) avec Bash, ce serait bien d'avoir une invite qui dépend du mode dans lequel vous êtes actuellement (insertion ou commande). Comment découvrir ce mode d'édition?

Btw, cela semble être possible dans ZSH :

bash  prompt 

Je suis curieux à ce sujet aussi. J'ai cherché dans la documentation de bash, mais je n'ai rien trouvé.
Andrew Ferrier

Réponses:


67

Fresh bash 4.3 et readline 6.3 ont quelque chose pour vous les gars .. du changelog:

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.

Donc mettre

set show-mode-in-prompt on

dans / etc / inputrc ou ~ / .inputrc (thx stooj) devrait affecter tous vos programmes compatibles readline;)


un statut à ce sujet? J'essaie de trouver quelque chose comme ça (pas pour bash mais pour d'autres invites basées sur readline que j'utilise). J'ai cherché sur Google et je n'ai trouvé aucune autre mise à jour (à part cela et l'article que vous avez référencé )
Mike HR

4
Ajout juste d'eMPee584 - si vous exécutez bash 4.3 ou supérieur, ajoutez ce qui suit à votre ensemble de fichiers ~ / .inputrc show-mode-in-prompt Cela ajoute un + à l'extrême gauche de votre invite si vous êtes en mode d'édition , et a: si vous êtes en mode commande.
stooj

3
Donc, pendant que cela fonctionne; y a-t-il un moyen de se déplacer où ce personnage en mode vi se trouve dans l'invite? Si vous avez des invites multilignes (personnalisées), cela ne fonctionne pas très bien :)
James Mills

Pour 4.3, c'est toujours au début de l'invite et, malheureusement, readline ne redessine que la dernière ligne d'une invite multiligne. Voir la réponse "Invite multiligne et .inputrc" pour une solution de contournement ou voir la réponse sur le correctif de bash 4.3 avec le correctif de 4.4 pour cela.
studgeek

20

Bash 4.4 / Readline 7.0 ajoutera la prise en charge des chaînes de mode configurables par l'utilisateur .

Vous pouvez essayer les versions bêta, mais elles semblent un peu boguées pour le moment. Ils ne prennent pas non plus en charge la spécification de l'emplacement de l'invite dans lequel vous souhaitez que l'indicateur de mode apparaisse (ce qui, je pense, est la fonctionnalité qui tue).

Si vous ne voulez pas attendre et que vous n'avez pas peur d'une petite compilation, j'ai publié des versions corrigées de bash 4.3 et readline 6.3 sur github qui prennent en charge cette fonctionnalité.

Avec les versions corrigées, vous pouvez faire des choses comme ceci:

entrez la description de l'image ici

Plus de détails, y compris comment installer, sont disponibles sur https://github.com/calid/bash


19

Après avoir recherché google, parcouru la page de manuel bash, puis parcouru le code source bash (lib / readline / vi_mode.c), il semble qu'il n'y ait pas de moyen facile de changer l'invite lors du passage du mode insertion au mode commande. Il semble qu'il pourrait y avoir une opportunité ici pour quelqu'un de patcher la source bash car il y a des appels pour démarrer et arrêter les modes dans la source.

En voyant votre message, cela m'a intéressé au réglage du mode bash vi. J'adore vi et pourquoi pas sur la ligne de commande. Cependant, il semble que nous devrons garder une trace de savoir si nous sommes en mode insertion sans changement d'invite (comme le disent de nombreux messages du forum) .Pour ce que cela vaut, vous êtes toujours en mode insertion sauf si vous appuyez sur ESC. Rend les choses un peu plus faciles, mais pas toujours aussi intuitives.

J'augmente votre question car je suis intéressé à voir où cela va.


7

Invite multiligne et .inputrc

Inputrc a une option pour afficher un +for insert et :pour le mode normal, en ajoutant set show-mode-in-prompt onle ~/.inputrccomme eMPee584 a écrit, mais cela ne fonctionne pas bien avec l'invite multiligne (avec les anciennes versions de bash et readline).

Une solution est d'avoir une seule ligne PS1( >) et une fonction qui fait écho à quelque chose avant l'invite. Il est intégré à bash et appelé PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

Les chaînes d'invite habituelles ne sont pas disponibles dans l'écho de printf. Le -eest d'interpréter les codes de couleur, et il n'est pas nécessaire d'ajouter \[ou \], ce qui ne fonctionne pas de toute façon.

Mode d' insertion :

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

Mode normal :

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

En appuyant sur l'onglet , seule la PS1 est répétée, ce qui a du sens pour moi:

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

Aperçu (La source)


Si vous utilisez des couleurs dans vi-cmd-mode-stringou vi-ins-mode-string, celles-ci doivent être précédées de \1et postfixées par \2. Regardez ici . Aussi, \[et \[devrait toujours être émis, mais vous aurez besoin \\[et à l' \\]intérieur de printf.
Tom Hale

1

C'est ce que j'ai dans ~/.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

En mode insertion, il est de couleur bleue.

└──[ins]

Le mode de commande est de couleur jaune.

└──[cmd]

L'inconvénient est qu'il ne s'affiche pas sur un ttysens qu'il ne fonctionne que sur un émulateur de terminal uniquement les couleurs.


0

J'essaie également d'obtenir un indicateur pour le mode BASH vi, et vous avez tous appris que cela semble simple et qu'il n'y a aucun moyen de le faire pour le moment.

Mon approche actuelle est la suivante: appuyez sur «a» lorsque je ne sais pas quel mode est. SI 'a' apparaît après BASH PROMOT, j'apprends que je suis en mode 'INSERT'. ALORS, j'ai appuyé sur «RETOUR» et je continue. C'est un moyen facile pour moi de résoudre le petit problème.

Au fait, je 'alias a =' cal ', ou quelque chose d'autre pour donner un peu d'utilité au hit vide.


2
Cela aurait plus de sens pour moi de simplement appuyer sur "esc || c- [" plutôt que sur a. Alors vous n'avez pas besoin de chercher pour savoir dans quel mode vous vous trouvez; ou insérer des caractères indésirables que vous devez supprimer (ou appuyez sur retour)
wom

0

pour l'invite multiligne comme cette image

mon travail est comme ça

mon invite de 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):"

j'espère que cela vous a aidé


0

Différents styles d'invite et de curseur via .inputrc

Vous devez d'abord vous assurer que vous exécutez une version bash supérieure à 4.3:

$ bash --version
GNU bash, version 4.4

Ensuite, mettez les lignes suivantes dans votre ~/.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

En mode commande, le curseur est affiché sous forme de bloc.
En mode insertion, le curseur est affiché sous forme de barre verticale.

L'invite elle-même ressemblera alors à ceci selon le mode:

(cmd)$ ... 
(ins)$ ...
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.