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 :
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 :
Réponses:
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;)
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
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
Inputrc a une option pour afficher un +
for insert et :
pour le mode normal, en ajoutant set 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
.
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 -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 :
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 _
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 tty
sens 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.
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é
.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)$ ...