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?
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.NewFeaturesinReadline
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.
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:
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.
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.
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 _
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.
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.
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)
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:
Réponses:
Fresh bash 4.3 et readline 6.3 ont quelque chose pour vous les gars .. du changelog:
Donc mettre
dans / etc / inputrc ou ~ / .inputrc (thx stooj) devrait affecter tous vos programmes compatibles readline;)
la source
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:
Plus de détails, y compris comment installer, sont disponibles sur https://github.com/calid/bash
la source
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.
la source
Invite multiligne et
.inputrc
Inputrc a une option pour afficher un
+
for insert et:
pour le mode normal, en ajoutantset show-mode-in-prompt on
le~/.inputrc
comme 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
.Les chaînes d'invite habituelles ne sont pas disponibles dans l'écho de printf. Le
-e
est 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 :
Mode normal :
En appuyant sur l'onglet , seule la PS1 est répétée, ce qui a du sens pour moi:
(La source)
la source
vi-cmd-mode-string
ouvi-ins-mode-string
, celles-ci doivent être précédées de\1
et postfixées par\2
. Regardez ici . Aussi,\[
et\[
devrait toujours être émis, mais vous aurez besoin\\[
et à l'\\]
intérieur de printf.C'est ce que j'ai dans
~/.inputrc
En mode insertion, il est de couleur bleue.
Le mode de commande est de couleur jaune.
L'inconvénient est qu'il ne s'affiche pas sur un
tty
sens qu'il ne fonctionne que sur un émulateur de terminal uniquement les couleurs.la source
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.
la source
pour l'invite multiligne comme cette image
mon travail est comme ça
mon invite de bash
.inputrc
j'espère que cela vous a aidé
la source
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
:Ensuite, mettez les lignes suivantes dans votre
~/.inputrc
: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:
la source