Copier et marquer dans Bash comme dans Emacs?

16

Je voudrais être en mesure de copier et coller du texte dans la ligne de commande dans Bash en utilisant les mêmes liaisons de clavier que Emacs utilise par défaut ( par exemple en utilisant C-spacepour set-mark, M-wcopier du texte, C-y, M-ypour le coller, etc.).

La documentation de GNU Bash indique que Bash est livré avec certaines de ces liaisons de touches configurées par défaut.

Par exemple, yanking ( C-y) fonctionne par défaut sur mon terminal. Cependant, je ne peux pas faire fonctionner les commandes set-market copy, et elles ne semblent liées à aucune clé par défaut.

Habituellement, la façon dont un utilisateur peut définir ses propres raccourcis clavier est de les ajouter .inputrc. J'ai donc cherché et trouvé les fonctions bash suivantes dans la documentation qui, je suppose, peuvent m'aider à définir le comportement de type Emacs que je veux (c'est- set-markà- dire avec C-spaceet copyavec M-w).

copy-region-as-kill ()

Copiez le texte de la région dans le tampon de mise à mort, afin qu'il puisse être retiré immédiatement. Par défaut, cette commande n'est pas liée.

et

set-mark (C-@)

Réglez la marque au point. Si un argument numérique est fourni, la marque est définie à cette position.

Si je comprends bien, ce qui précède signifie que ce copy-region-as-killn'est lié à aucune séquence de clavier par défaut, tandis que set-markest lié à C-@par défaut.

J'ai essayé C-@sur mon terminal, mais je ne pense pas qu'il fonctionne set-markcar je ne vois aucun texte en surbrillance lorsque je déplace mon curseur. Dans tous les cas, j'ai essayé d'ajouter des raccourcis clavier ( M-wet C-) aux fonctions copy-region-as-killet set-markau - dessus de ma .inputrcpuis de les recharger C-x C-r, mais cela n'a pas fonctionné. Je sais que mes autres entrées .inputrcfonctionnent parce que j'ai d'autres raccourcis clavier définis par l'utilisateur.

Y a-t-il quelque chose que je fais mal? Suis-je en train de manquer quelque chose?

Amelio Vazquez-Reina
la source
Quelle version bashet quel programme terminal utilisez-vous?
Mikel
J'utilise GNU bash, version 3.1.17 (1) -release (x86_64-redhat-linux-gnu) sur gnome-terminal (également sur Terminator)
Amelio Vazquez-Reina

Réponses:

11

Cela ne met pas en évidence la sélection, mais sinon je pense que cela fonctionne bien.

Essayez de courir

$ bind -p | grep copy-region-as-kill

pour vous assurer que cela C-x C-rfonctionne réellement.

Cela devrait dire:

"\ew": copy-region-as-kill

Après cela, cela devrait bien fonctionner.

Exemple:

$ abc<C-Spc><C-a><M-w> def <C-y>

Donne moi

$ abc def abc

Si jamais vous voulez savoir où markest, faites-le C-x C-x.

Exemple:

$ <C-Spc>abc<C-x><C-x>

remettra le curseur à l'endroit où vous avez placé la marque (le début de la ligne).

De plus, je ne pense pas que vous ayez besoin d'ajouter la set-markliaison. Non.

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(notez que la plupart des terminaux envoient C-@lorsque vous C-Spcappuyez sur. Je suppose que le vôtre aussi.)

Si tout cela échoue:

  • fait Ctrl+ Spacetravail emacs -nwsur le même terminal?
  • les autres Alt/ Metaraccourcis fonctionnent-ils dans bash?
Mikel
la source
1
Merci! J'avais "Mw" au lieu de "\ ew" dans .inputrc. Le manque de mise en évidence m'a aussi dérouté. Merci pour le pointeur sur la commande bind d'ailleurs. Cela fonctionne maintenant comme un charme!
Amelio Vazquez-Reina
2
Bienvenue! Ouais, tu dois écrire \eou \M-. Voir la syntaxe du fichier init de readline .
Mikel
Quelle bonne réponse! Merci. Cela a
résolu
set-mark et copy-region-as-kill fonctionnent en silence, puis-je mettre en surbrillance la région (comme dans emacs)?
mosh
4

Je lie également Cw pour kill-region . Voici mon .inputrc:

# Voir http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
désactiver bind-tty-special-chars

# Définissez mes raccourcis clavier Emacs préférés.
"\ C- @": repère
"\ Cw": kill-region
"\ Mw": copie-région-comme-kill
"\ M- /" dabbrev-expand
gavenkoa
la source