La recherche d'historique inversée dans bash suivie des touches fléchées provoque l'affichage du curseur au mauvais endroit

10

J'ai remarqué que plusieurs fois lorsque je fais une recherche d'historique inversée à partir de la ligne de commande via CTRL+ r, si je veux modifier la commande, le curseur saute parfois à la mauvaise position lorsque j'appuie sur une touche fléchée ou saisis CTRL+ aou CTRL+ e. La position spécifique à laquelle il saute semble être un décalage égal à la taille de mon invite de ligne de commande définie dans PS1.

Cela cause des difficultés car l'emplacement réel du curseur est différent de ce qui est affiché à l'écran; les futures modifications apportées à la commande sont rendues comme si le curseur se trouvait à l'endroit où il a sauté, mais la commande réelle conserve l'emplacement correct sans aucun saut.

Quelqu'un sait-il ce qui cause cela ou comment y remédier?

EDIT: Si j'ajoute une nouvelle ligne à la fin du PS1problème semble disparaître. Cependant, je préférerais entrer la commande sur la même ligne que l'invite.

jonderry
la source

Réponses:

6

Cela est souvent dû à des commandes de votre historique qui dépassent 1 ligne. Lorsque vous sélectionnez un élément plus court dans l'historique, il ne semble pas prendre en compte la largeur de l'invite lors du nouveau rendu de la ligne de commande, donc tout ce qui suit cette longue commande est vicieux.

La solution facile que j'ai trouvée est d'appuyer sur la touche home, d'insérer "echo" et d'appuyer sur enter. Rappelez ensuite la dernière commande et modifiez-la à partir de là. (Supprimer d'abord l'écho. :)

cabbey
la source
Merci, j'ai essayé ça il y a peu de temps. Dans mon cas, j'ai été négligent et j'ai détruit un fichier car il y avait un tuyau dans la commande qui a avalé l'écho. Vous avez raison, cela semble n'affecter que les commandes longues selon mon expérimentation.
jonderry
Une meilleure solution que l'écho que je viens de trouver: ajoutez un '#' au début de la ligne plutôt qu'un écho. De cette façon, bash traite la ligne entière comme un commentaire.
jonderry
1
Encore mieux: le problème semble disparaître si la ligne actuelle est redessinée. Soit Cl pour effacer l'écran et redessiner la ligne actuelle, soit créer une liaison de touche pour la fonction non liée redessiner la ligne actuelle.
jonderry
J'ai oublié de mentionner la solution Cl car je déteste vraiment perdre le tampon de défilement, mais oui, c'est un problème de rendu temporaire de la navigation dans l'historique, donc forcer un redessin le corrigera. redraw-current-line sonne comme une solution encore meilleure!
cabbey
13

Vous avez peut-être des séquences d'échappement non imprimables dans PS1 non incluses dans \ [et \].

Assurez-vous que vous les avez tous joints comme ceci:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somov
la source
1
Fonctionne très bien si vous n'incluez que les séquences non imprimables dans \[et \](vous avez donc besoin de plusieurs groupes de ces guillemets)
Andomar