web-dev-qa-db-fra.com

Recherche inversée dans la CLI: sortie gâchée par la suite

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).

5
MrYoshiji

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é.

7
wjandrea

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.

3
glenn jackman