Pourquoi ne puis-je pas mettre du texte en surbrillance dans un émulateur de terminal Linux avec les touches Maj + Flèche?


19

Ce sont les raccourcis clavier d'édition de texte standard que j'utilise constamment chaque fois que vous éditez du texte dans, littéralement, n'importe quelle application Linux autre que les émulateurs de terminal:

  • flèches gauche + droite pour se déplacer gauche + droite
  • ctrl + flèche pour déplacer un mot entier
  • home / end pour passer au début / fin de la ligne
  • ctrl + c / ctrl + v pour copier / coller [certains terminaux peuvent utiliser shift-ctrl-C / shift-ctrl-V; c'est un bon substitut]
  • Maj + flèche pour surligner le texte
  • Maj + Ctrl + Flèche pour mettre en évidence un mot entier

Je n'ai jamais trouvé une combinaison de shell et d'émulateur de terminal qui autorise les deux derniers éléments de cette liste, et cela me rend fou. De toute évidence, les émulateurs de terminaux prennent en charge la mise en surbrillance (la souris peut le faire), et ils prennent en charge l'utilisation des touches ctrl et shift comme modificateurs (ils peuvent être utilisés pour déplacer le curseur d'un mot entier et pour mettre des lettres en majuscule, respectivement; [edit:] ils peuvent même être utilisés ensemble pour copier / coller avec shift-ctrl-C et shift-ctrl-V), alors quel est le problème empêchant cette fonctionnalité? J'ai plusieurs questions:

  • Est-ce un problème avec mon émulateur de terminal ou avec mon shell (bash, même si je suis prêt à changer)?
  • Pourquoi les émulateurs / coques de terminaux ne sont-ils pas conformes à cette norme par ailleurs universelle?
  • S'il y a une raison réelle, est-elle ancienne et obsolète, ou est-elle toujours pertinente pour un nombre important d' utilisateurs Linux de bureau ?
  • Existe-t-il une sorte de solution de contournement?
  • Existe-t-il un programme obscur que je peux utiliser qui prend en charge cela?
  • Est-il possible de modifier la source de, disons, gnome-terminal pour supporter cela?

Je sais que le texte peut être copié / collé avec la souris, ce n'est pas ce que je demande. Je demande pourquoi je ne peux pas faire ces choses avec le clavier dans un émulateur de terminal.


Notez que la sélection de texte avec la souris ne modifie pas la position du curseur. Si vous mélangez la sélection de texte avec la saisie de commandes régulières sur le clavier, ce serait vraiment déroutant au-delà des limites de la commande que vous venez de taper et pas encore exécutée. Pouvez-vous sélectionner du texte au-delà des limites de la zone de texte sur une page Web avec le clavier? Veuillez également noter qu'il existe des programmes comme screen qui permettent d'entrer dans un mode différent qui a la sélection de texte pour l'ensemble du terminal, mais bien sûr, ne permet plus de saisir des commandes.
Daniel Beck

1
Daniel: la console Matlab, par exemple, est une CLI qui permet de surligner du texte avec le clavier. Cela fonctionne parfaitement dans mon expérience; il permet une sélection au-delà de la commande actuelle non encore exécutée si vous le souhaitez, personnellement je n'ai que peu d'utilité pour cela.
monguin


Réponses:


5

Je pense que ce serait très utile si je prenais ceci un morceau à la fois. Le problème général est: à qui s'adresse la touche? Le terminal ou le programme exécuté à l'intérieur du terminal?

Par exemple, "screen", qui est une sorte de terminal, utilise Ctrl+ Acomme préfixe pour ses commandes, pour les distinguer des choses qui vont au programme en cours d'exécution lui-même. (Et fournit un moyen d'envoyer Ctrl+ A.)

gnome-terminal a plusieurs clés qu'il capture pour faire diverses choses, y compris celles que vous demandez.

Gardez également à l'esprit que la "mise en évidence" d'un terminal est distincte de la position du curseur du terminal . Certains terminaux n'ont aucune capacité de mise en évidence.

Maintenant, en prenant ces combinaisons de touches à la fois:

flèches gauche + droite pour déplacer vers la gauche + droite ctrl + flèche pour déplacer un mot entier home / end pour déplacer vers le début / la fin de la ligne

Déplacer quoi à gauche et à droite? Bash peut être configuré pour cela, et est généralement par défaut. En règle générale, ceux-ci déplacent la position du curseur.

ctrl + c / ctrl + v pour copier / coller

Premièrement: le copier / coller a-t-il même un sens? Si vous êtes dans un VT, vous n'avez pas vraiment de presse-papiers, surtout si X ne fonctionne pas.

Certains terminaux peuvent copier du texte dans la sortie, et certains "collent" également en vous simulant en tapant le contenu du presse-papiers. Ctrl+ Shift+ V, par exemple, est collé gnome-terminal, ce qui peut aider. (Et Ctrl+ Shift+ Cest une copie.) Comme discuté précédemment, le gros problème avec Ctrl+ Cet Ctrl+ Vest qu'ils se chevauchent avec les commandes de terminal / programme courantes. ( Ctrl+ Cest une interruption d'envoi (SIGINT) et Ctrl+ Vest mot pour mot.)

Certains terminaux prennent également en charge deux modes de copie des données: une "copie juste" plus normale, et ce que l'on appelle "sélection de bloc" ou "copie de bloc". (Maintenez Ctrl, puis faites glisser tout en étant gnome-terminalpar exemple.)

En outre, xsel -bpeut être utilisé pour canaliser le contenu du presse-papiers. Dépend de la situation exacte si xsella version de pâte du terminal est plus utile. Tu vois man xsel.

Maj + flèche pour mettre en surbrillance le texte Maj + Ctrl + flèche pour mettre en évidence un mot entier

La surbrillance de votre terminal (si elle a cette capacité) est distincte de la position du curseur. Encore une fois, le manque de combinaisons de touches disponibles est probablement un facteur. Gardez à l'esprit qu'un surlignage a deux positions: soit le début et la fin, soit les coins supérieur gauche et inférieur droit. Comment gérez-vous les deux?

Enfin, notez que de nombreux terminaux GUI, un double-clic sur un mot le mettra en surbrillance. (Et en X, copiez vers la sélection principale.)

screen, par exemple, a des touches pour basculer dans un mode pour se déplacer dans le tampon (sortie précédente) et copier / coller.

Je pense que si vous faites un usage adéquat de xsella sélection principale, vous constaterez que les opérations du presse-papiers sont à la fois assez rares et suffisamment complexes pour mériter l'utilisation de la souris.


5
J'apprécie le temps que vous avez pris pour rédiger votre réponse, mais je ne pense pas que je comprenne mieux pourquoi ce n'est pas une fonctionnalité disponible dans les émulateurs de terminaux. Vous m'avez signalé une nouvelle idée - qu'un émulateur de terminal est unique en ce qu'il peut exécuter d'autres programmes - mais je ne comprends pas pourquoi seul un sous-ensemble sélectionné de combinaisons de touches est impossible à mettre à la disposition de l'utilisateur.
monguin

2
Les émulateurs de terminaux émulent des terminaux physiques . Ils n'ont pas été créés à partir de zéro pour fournir une interface de ligne de commande. Des choses comme Control-C avaient établi des significations bien avant que Microsoft ne décide de les coopter comme raccourcis clavier, et les émulateurs de terminaux doivent y adhérer.
chepner

2
Je pense que le diable est dans les détails ici. Ce n'est pas impossible: l'écran a un mode pour faire ce que vous voulez, je pense. Mais pour y parvenir, vous devez passer en mode "Je veux sélectionner des choses". gnome-terminalaurait des problèmes similaires: ils ne l'ont probablement pas implémenté parce que ce n'est pas exactement quelque chose que vous faites. Gardez à l'esprit que le shell n'est pas le seul programme en cours d'exécution: n'importe quel programme peut être en cours d'exécution et il peut vouloir utiliser n'importe quelle séquence de touches que vous pourriez utiliser pour copier / coller à ses propres fins. l'écran a des moyens d'envoyer les clés qu'il remplace, et gnome-terminal essaie de ne pas marcher sur les orteils.
Thanatos

1
La sélection de bloc est un moyen de sélectionner un rectangle: maintenez le contrôle et faites glisser dans gnome-terminal, et vous devriez immédiatement voir comment c'est différent. La plupart des émulateurs de terminaux GUI ont cette capacité, ainsi que les éditeurs de texte les plus avancés. (Voir le bloc visuel dans vim, par exemple.)
Thanatos

1
Ah, alors je connais la sélection de bloc, mais je ne connaissais pas le nom. Je ne suis pas non plus au courant d'un raccourci clavier GUI pour cette action, il semble donc inutile d'en inventer un pour répondre à ma question. J'apprécie les commentaires de tout le monde ici, mais comme je ne suis toujours pas satisfait, je suppose que tout ce que je peux faire maintenant est de creuser moi-même la source ...
monguin

1

Je ne suis pas un expert des émulateurs de terminaux mais ...

des applications comme bash (readline) fonctionnant dans un émulateur de terminal ne savent rien du système X Window en cours d'exécution et de la fenêtre X dans laquelle elles se trouvent, elles connaissent stdin et stdout sur un terminal (ttyS / ttyUSB / tty / pts sous linux).

Le problème n'est pas de montrer du texte en surbrillance, mais comment faire savoir à l'application X window (l'émulateur de terminal) que le texte a été sélectionné, via ces terminaux.

Je suppose que l'application du terminal X ouvert un de ces appareils en entrée et en sortie, puis traduis événements clés X à bien sortie (de côté) X entrée (d' un côté bash). Viceversa le flux de sortie bash vers le terminal X en entrée , ici le terminal X traite cette entrée pour déplacer le curseur, remplit le fond avec un peu de couleur, selon la sortie de l'application bash.

Pour ma connaissance, les codes d'échappement peuvent être utilisés pour contrôler des comportements spéciaux, comme effacer, remplir l'arrière-plan, déplacer le curseur, et peut - être qu'un code d'échappement personnalisé pourrait être ajouté pour faire savoir au terminal X qu'un texte de ligne, col à ligne, col a été sélectionné, juste un exemple, peut-être que le texte sélectionné pourrait simplement être retourné (un détail d'implémentation).

Je suppose que n'étant pas une définition standard, vous devrez patcher toutes les applications que vous souhaitez prendre en charge pour savoir que la combinaison de touches a appuyé et sortir le code d'échappement approprié, la ligne de lecture si vous le souhaitez dans le bash, l'émulateur de terminal X sur l'autre côté pour traiter correctement le code d'échappement (et enfin envoyer les informations au presse-papiers). La mise en œuvre probable de cette fonctionnalité en tant que terminal vous éviterait de corriger chaque application. J'espère (et devinez) que les pilotes de périphériques du noyau veulent en savoir moins que possible sur les codes d'échappement, donc si vous avez de la chance, aucun correctif ne sera nécessaire.

Le terminal X dessine la sortie, afin qu'il sache facilement, lorsque vous utilisez la souris, quel texte / caractère sélectionnez-vous.

Un widget de texte graphique sait tout sur sa fenêtre X et explique pourquoi il est si facile de mettre en œuvre la sélection et la copie.

ÉDITER

Ici, ce correctif d'affichage d'image urxvt-9.16 pourrait être un bon point de départ pour comprendre ce qui est nécessaire pour prendre en charge de nouveaux codes d'échappement. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

Les réponses sont de bonnes explications pour expliquer pourquoi il est difficile de le faire. Voici quelque chose que vous pouvez faire dans gnome-terminal pour configurer ctrl-cet ctrl-vcopier et coller, tout en reliant d'autres clés dans la discipline du terminal avec sttypour envoyer SIGINTet insérer un caractère mot pour mot. Ce n'est pas une solution complète car certains programmes désactivent la discipline du terminal et vous ne pourrez pas leur envoyer '^ C' et '^ V'. Plus d'infos ici .

Dans votre (par exemple le script de démarrage du shell ~/.bashrc, ~/.zshrc, ~/.rcrc), faire

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Ensuite, dans gnome-terminal Edition> Préférences> Raccourcis, vous pouvez lier Copier et Coller à ctrl-c et ctrl-v. Notez que le terminal recevra les événements clés avant que quoi que ce soit ne soit envoyé au terminal, vous ne pourrez donc plus envoyer '^ C' et '^ V' à n'importe quel processus en cours d'exécution sur le terminal.

Je viens de le faire et je vais voir comment cela se passe et quels problèmes cela provoque. J'ai fait le stty de façon conditionnelle pour les appliquer uniquement lorsque je lance X.


1
Merci pour la réponse. Pendant ce temps, je me suis habitué aux liaisons OSX et Emacs, et j'ai aussi abandonné le rêve de ctrl + shift + flèche dans un terminal ...
monguin

1

Comme Thanatos l'a mentionné, il y a une distinction à faire entre l' émulateur de terminal (fonctionnant sous X Windows ou Wayland) et les programmes exécutés dans le terminal (appelons cela le "shell", bien qu'il ne le soit pas); ces deux choses sont isolées l'une de l'autre (voir détails techniques ).

Les premiers éléments de votre liste (touches fléchées, Début / Fin, etc.) sont gérés directement par le programme à l'intérieur du terminal, et donc la position du curseur est contrôlée par le programme à l'intérieur du terminal.

Les raccourcis copier-coller (Ctrl + Shift + C et Ctrl + Shift + V), d'autre part, sont gérés par l'émulateur de terminal, qui comprend la souris (vous pouvez donc sélectionner du texte avec la souris), il sait ce qui est sur l'écran (afin qu'il puisse copier), et peut envoyer des touches au programme à l'intérieur (afin qu'il puisse coller).

Afin de prendre en charge Shift + Left et Shift + Right, l'émulateur de terminal ou le shell doivent gérer la frappe. De toute façon, nous avons un problème:

  1. Le shell ne peut pas facilement gérer ces clés, car vous voudrez éventuellement copier le texte sélectionné dans le presse-papiers, et le presse-papiers est un concept X Windows auquel le shell n'a pas nécessairement accès (mais voyez xclip). Et pour autant que je sache, si le shell prend en charge la sélection de texte, Linux ne définit aucun mécanisme pour informer l'émulateur de terminal de ce qui est sélectionné.
  2. Pendant ce temps, l'émulateur de terminal n'est pas en charge de l'emplacement du curseur. Même si l'émulateur de terminal pouvait modifier l'emplacement du curseur, il ne sait probablement pas où la ligne de texte actuelle commence et se termine. Par exemple, le terminal peut contenir du texte comme ~ $ ls -let l'émulateur de terminal ne sait pas que seule la ls -lpartie appartient à l'utilisateur.

Il n'est pas difficile d'imaginer un émulateur de terminal qui prend en charge la sélection avec Shift + Flèches, mais je suppose qu'il faudrait masquer le curseur du shell et introduire son propre "faux curseur" qui existe temporairement pour vous aider à sélectionner quelque chose, puis vous pourriez appuyer sur Ctrl + C / Ctrl + Maj + C / Ctrl + Ins pour copier (ou Esc pour annuler) et afficher à nouveau le vrai curseur. Bien sûr, cela n'aurait pas toutes les capacités d'une sélection normale - notamment couper et supprimer.


Merci, je vais lire cet article TTY, mais pas encore. Cela pourrait expliquer l'écart dans ma compréhension de la différence entre les "émulateurs de terminaux" et les "applications de bureau qui gèrent les programmes de texte". Mon exemple précédent, la console Matlab, se comporte exactement comme je le souhaite. Je ne comprends pas pourquoi il ne peut pas y avoir d'application de bureau avec ce comportement, où le programme de texte s'exécutant à l'intérieur est autre chose que Matlab. Supposons que je veuille utiliser uniquement les commandes shell les plus basiques - ls, cd, cp, mv - alors je ne vois aucun conflit. Des programmes comme screen ou tmux, je comprends, pourraient rendre les choses plus difficiles.
monguin

1

Voici les liaisons de clavier CUA que vous décrivez, une norme d'IBM au milieu des années 80:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Ils sont généralement implémentés dans tous les environnements de bureau créés depuis. Les outils DOS, Windows, Motif et même Netware ont tous convergé vers ce standard. Une exception est le Mac, qui utilise un ensemble assez similaire mais différent (Cmd au lieu de Ctrl) de la même période.

Les terminaux Unix sont cependant bien antérieurs à cette norme et la plupart l'ont ignoré. De plus, s'ils implémentaient ces liaisons de clés, cela pourrait interférer avec les programmes TUI qui les utilisent déjà pour d'autres fonctionnalités. Donc, bien que techniquement faisable, problématique aussi.

Applications:

L' microéditeur de texte est le meilleur que j'ai vu pour émuler un éditeur de texte GUI, similaire à DOS,  editmais avec des fonctionnalités plus modernes à la Sublime Text. neest une ancienne dans les dépôts Debian, et nanopeut même être configurée avec des raccourcis clavier sensés. Mais le terminal / shell nu, non.

Avec, libvteil pourrait être facile de créer un terminal virtuel rudimentaire qui gère vous-même ces raccourcis clavier. Beaucoup de travail pour un tout petit gain cependant.


0

J'ai juste aidé un copain à résoudre un problème similaire à celui-ci et j'ai découvert que le gestionnaire de presse-papiers clipit était le coupable.

sudo apt-get supprimer clipit

a été en mesure de tout remettre en place et de bien fonctionner pour lui. J'espère que cela pourrait aider quelqu'un d'autre là-bas.


Avez-vous répondu à la mauvaise question? Il s'agissait d'une question générale sur les capacités de tous les émulateurs de terminaux. Il est clair qu'il n'y a pas de "solution". Je ne l'ai pas maintenant, et je n'ai jamais installé de clipit sur aucune machine.
monguin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.