Voir mon édition ci-dessous, ceci n'est pas totalement une copie de personnalisation de l'invite du shell et comportement de cmd
Ma fonction reverse-search
dans la CLI est défaillante et je ne sais pas comment la réparer ...
Lorsque je tape ctrl + r et que je cherche une commande que j'ai faite plus tôt, trouvez-la, puis appuyez sur la flèche droite pour l'utiliser, la sortie est cassée. Voici un exemple:
# I reverse-searched the Word "test" then pressed right arrow
yoshiji@x1carbon:~/path/to/git/folder (master) $ch)`test': rake test
# ^^^^^^^^^^ weird output
# ^ cursor right there
Il "déplace" également mon curseur sur une position différente. Si j'appuie sur entrée, la commande de droite est exécutée (rake test
dans ce cas), ce qui signifie que le texte affiché n'est pas le même que ce qui est réellement exécuté.
Je sais que cela est probablement lié à mon exportation PS1
dans mon ~/.bashrc
, voici donc les dernières lignes de ce fichier:
# Git branch in Prompt.
git_branch() {
branch=$(__git_ps1 2> /dev/null)
if [ "$branch" = " (master)" ]; then
echo -e "\033[33m${branch}\033[00m" # yellow
Elif [ "$branch" = "" ]; then
echo -e "\033[90m (no git)\033[00m" # red
else
echo -e "\033[32m${branch}\033[00m" # green
fi
}
PS1='\u@\h:\w$(git_branch) \$ '
C'est quelque chose que j'ai écrit pour afficher la branche git en orange (si master
branche) ou bien en vert (ou no git
en gris).
Avez-vous une idée de ce qui cause ce comportement étrange?
Edit: Il s’agit d’un problème différent de possibilité de dupliquer de la manière dont j’utilise echo -e "some string"
pour retourner une chaîne de caractères de couleur + nom de la branche git de la fonction git_branch()
. L'utilisation de echo -e
n'échappe pas aux caractères \[
et \]
(essayez vous-même dans votre CLI: echo -e "\[\033[33m\]test"
).
Idéalement, j'aimerais conserver ces couleurs conditionnelles en fonction de la présence et du nom de la branche (gris si aucune branche, orange si maître, sinon vert).
Enveloppez les séquences de couleur dans les échappements readline comme ceci:
echo -e "\001\033[33m\002${branch}\001\033[00m\002" # yellow
echo -e "\001\033[90m\002 (no git)\001\033[00m\002" # red
echo -e "\001\033[32m\002${branch}\001\033[00m\002" # green
Les lignes d'échappement readline sont \001
au début d'une séquence non imprimable et \002
à la fin. Ils sont équivalents à \[
et \]
, respectivement, dans la chaîne PS1.
Source: réponse d'Archemiro sur bash invite et écho des couleurs dans une fonction - Dépassement de pile
Ceci est ma réponse à une autre question avec le code modifié.
Lorsque vous mettez des codes de couleur dans votre invite, vous devez ajouter des marqueurs supplémentaires pour que le terminal sache que vous avez des caractères invisibles dans l'invite.
Changement
echo -e "\033[33m${branch}\033[00m" # yellow
à
echo -e "\[\033[33m\]${branch}\[\033[00m\]" # yellow
# .......^^........^^.........^^........^^
etc
Voir Contrôle de l'invite dans le manuel bash.