61 votes

Lors du collage dans Terminal.app, `00~` est collé au début et `01~` à la fin.

Lors du collage dans Terminal.app, 00~ est collé au début et 01~ à la fin. Donc quand je veux coller /some/path j'ai en fait 00~/some/path01~ . De plus, un son audible est entendu deux fois, donc probablement ^G (ASCII BELL) est également inséré au début et à la fin du texte collé.

Lorsque je colle la même chose dans un éditeur, ce comportement ne se produit pas (seulement /some/path est collé).

Cela se produit avec tous les textes.

Lorsque j'arrête et démarre Terminal.app, le comportement disparaît également. Mais après un certain temps, il revient à nouveau.

Une idée de la cause de ce comportement ?

3 votes

Une chose qui peut aider à résoudre ce problème s'il ne se produit qu'occasionnellement est de taper reset dans votre terminal - des programmes utilisant des fonctions plus avancées du terminal, incluant généralement des fonctions telles que tmux y vim Il se peut que vous n'ayez pas l'occasion de réinitialiser la fonction bash. enable-bracketed-paste discuté ci-dessous.

0 votes

Un point de données : Cela m'arrive aussi, mais seulement dans une fenêtre de Terminal où je me suis connecté en ssh à une autre machine, et pour une raison quelconque, quelque chose sur cette machine (d'après la réponse ci-dessous, je suppose qu'il s'agit de bash) envoie la séquence pour activer cette fonctionnalité. Cette machine désactive également la fonction lorsque je quitte - mais pas lorsque j'utilise ~^Z pour suspendre la session ssh. Si j'utilise ~^Z pour suspendre la session ssh, la fonctionnalité reste activée, et les programmes sur ma machine locale ne la comprennent pas, et j'ai le même problème.

0 votes

@SteveSummit Je suis d'accord, c'est exactement la même expérience. C'est essentiellement une question de conception (activé et désactivé à des points raisonnables "définis"). Donc toute chose inattendue casse le modèle (déconnexion ssh, ~^Z, etc.).

76voto

Gordon Davisson Points 30215

Réponse courte : Exécutez la commande printf '\e[?2004l' . Cela envoie une séquence d'échappement au terminal qui lui demande d'arrêter d'envoyer des séquences de collage entre crochets.

Autres options : Dans Terminal.app, vous pouvez également le réinitialiser avec Command - Option - R (ou menu Shell > Réinitialiser). Dans iTerm2.app, c'est Command - R ou le menu Session > Réinitialiser. Dans l'une ou l'autre des applications, cette opération réinitialise également un certain nombre d'autres modes étranges dans lesquels il peut se mettre, ce qui peut être pratique.

Vous pouvez également éliminer le problème en passage de votre shell interactif à zsh ou l'installation d'un une nouvelle version de bash (au moins v5.1) et de passer à cela. Ceux-ci utilisent et comprennent les collages entre parenthèses, et le réinitialisent également avant chaque commande, de sorte qu'il ne peut pas rester bloqué (du moins, après la commande en cours).

Longue réponse : Les "collages entre crochets" sont une fonctionnalité qui permet au terminal de notifier les différents programmes en cours d'exécution. sur le terminal lorsque des données sont collées (au lieu d'être saisies normalement). En fait, il envoie des séquences d'échappement spéciales "début du collage" et "fin du collage" ( \e[200~ et \e[201~ respectivement, où \e représente un caractère d'échappement ASCII). C'est pour que, par exemple, le programme puisse traiter un document multiligne collé comme un seul élément plutôt que de voir chaque ligne comme un élément séparé. J'ai aussi quelques scripts qui l'utilisent pour pouvoir accepter un élément glissé-déposé sans que je doive passer à la fenêtre du terminal et appuyer sur retour pour indiquer que l'élément est complet.

En général, lorsqu'un programme comprend ces séquences et souhaite les recevoir, il envoie une autre séquence d'échappement au terminal ( \e[?2004h ) pour lui dire de commencer à les envoyer. Il devrait envoyer une autre séquence pour les éteindre ( \e[?2004l ) lorsqu'il se termine, mais s'il ne le fait pas, il est déconnecté sans se terminer proprement, ou un autre programme s'exécute à l'intérieur, ou... alors vous obtenez ces séquences envoyées à un programme qui n'a aucune idée de ce qu'elles sont, et les interprète simplement comme du charabia.

zsh et bash v5.1+ utilisent eux-mêmes le mode de collage entre crochets, et donc 1) ne sont pas perturbés par les séquences d'échappement, et 2) envoient la séquence pour désactiver le collage entre crochets à chaque fois que vous lancez un autre programme (/command) et la séquence pour le réactiver après la sortie de chaque programme, de sorte qu'il est constamment remis dans le bon état.

(La situation avec bash est un peu plus compliquée. MacOS n'inclut que la version 3.2.57 de bash par défaut. La prise en charge du collage entre crochets a été ajoutée dans la v4.4 (avec readline 7.0), mais semble être désactivée par défaut jusqu'à la v5.1. Donc, si vous installez bash v5.1 ou plus, et que vous l'utilisez comme interpréteur de commandes interactif, vous ne devriez pas avoir de problème avec ceci).

1 votes

Bien ! C'est donc une chose de faite. Je peux m'inspirer de vos recherches.

2 votes

Bash le fait aussi, à moins que vous n'utilisiez une ancienne version ou que quelqu'un l'ait désactivé (option readline enable-bracketed-paste ).

1 votes

@hobbs Malheureusement, MacOS ne comprend que la version 3.2.57 de bash, et la prise en charge du collage entre crochets n'a pas été ajoutée avant la version 4.4 (/readline 7.0) et ne semble pas être activée par défaut avant la version 5.1. Mais c'est un bon point, et j'ajouterai une note à ma réponse.

10voto

James Risner Points 171

Il s'agit d'une fonctionnalité.

Les terminaux modernes (Terminal.app, iTerm2.app) gardent la trace de votre sortie. Par exemple, si vous tapez une commande de 200 caractères dans un shell, il sait qu'il s'agit d'une "ligne". Si vous la copiez, il tente de la maintenir comme une seule ligne, sans nouveaux traits ( \n ) au milieu.

iTerm2 dispose d'un FAQ sur ce sujet sous cette question :

"Q : Lorsque je colle, j'obtiens des caractères bizarres avant et après le texte collé, comme 0~ et 1~."

Vous voyez les caractères supplémentaires entre parenthèses lorsque le terminal et le site distant sont désynchronisés l'un par rapport à l'autre. Cela se produit le plus souvent lorsque vous perdez votre connexion ssh ou lorsque l'éditeur se plante. La réinitialisation de l'application du terminal peut désactiver le collage entre crochets.

Cela me rappelle souvent le bon vieux temps où cette fonction n'était pas activée. Mais il y avait aussi des problèmes avec les nouvelles lignes supplémentaires dans les collages et les problèmes d'indentation.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X