Bash: puis-je définir Ctrl-Backspace pour supprimer le mot en arrière?


19

Dans le shell (bash) - Je veux que Ctrl-Backspace soit lié à "supprimer le mot en arrière". C'est possible?

Modifier :

J'utilise konsole- terminal chez KDE.


2
La question est simple, personne ne s'en plaint. Je veux juste dire qu'il vaut souvent la peine de faciliter les liaisons de touches "standard" qui existent déjà dans de nombreuses applications, au lieu de les personnaliser sans aucun gain réel et la certitude de ne jamais voir le comportement sur les systèmes étrangers. Ctrl+west ce à quoi vous devez vous habituer, à mon humble avis.
Daniel Andersson

@ Daniel Andersson: ou bien - Vous pouvez développer un moyen de transférer vos paramètres vers la machine étrangère.
Adobe

Le partage de fichiers dot est un problème résolu, mais cela n'aide pas beaucoup sur des ordinateurs plus ou moins locaux où vous avez des privilèges assez ouverts. Si vous êtes sur un système étranger, vous n'avez probablement pas la liberté de reconfigurer des choses comme ça (du moins pas sans être critiqué par des collègues qui utilisent également la même machine :-)). De plus, chaque nouvelle application nécessitera un traitement spécial.
Daniel Andersson

6
J'ai le problème inverse, j'ai l'habitude de Ctrl-w"supprimer le mot précédent" dans la console, et de le faire par instinct même dans Eclipse ou Chrome où cela signifie fermer l'onglet / fermer le fichier actuel. Assez ennuyeux.
Ezequiel Muns

1
J'ai le même problème avec Chrome SShInATab. Comment faire ctrl-W sans ctrl-W? :)
Riccardo SCE

Réponses:


11

Pourquoi ne pas simplement utiliser Alt+ Backspaceou Ctrl+ Wqui sont déjà mappés dans la plupart des terminaux. Pas sûr de la console. Xmodmap (man xmodmap) peut également être utilisé pour remapper d'autres clés personnalisées. (Paradoxalement, xmodmap ne peut pas très bien remapper Backspace car le terminal remplace les mappages, mais il fonctionne bien avec la plupart des clés ...).


9
Parce que j'avais l'habitude de Ctrl-Backspace dans mes Emacs. Je connaissais Ctrl-w. Alt-Backspace est nouveau pour moi (+1).
Adobe

1
Bon point, @hellork. Vous pouvez intercepter le contrôle + retour arrière sur le serveur X (via xmodmap) et le mapper à un caractère inutilisé (tel que alt-retour arrière).

4
La chose ennuyeuse à ce sujet est que ctrl + backspace est un mappage vraiment commun pour "supprimer le mot en arrière" dans la plupart des applications GUI sur la plupart des principaux systèmes d'exploitation. De même, Ctrl + W est très répandu pour "fermer la fenêtre". Alt + w est rarement utilisé pour quoi que ce soit dans les interfaces graphiques, que je puisse penser. La normalisation serait formidable. Je me demande quelle serait la plus grande interruption, le changement de terminaux ou la modification des interfaces graphiques?
naught101

1
@naught, Control-W est déjà la touche d'effacement des mots par défaut sur les terminaux Unix. Oui, cela entre en conflit avec la convention Windows / GUI, mais en fait, il est venu en premier - de nombreuses années. Blâmez Microsoft!
alexis

11

J'ai trouvé ce fil via google, mais la réponse n'était pas ce que je voulais entendre. J'ai donc joué:

Sur mon terminal, le retour arrière normal envoie ^H, tandis que ctrl + retour arrière envoie ^?. Donc, il devrait simplement s'agir d'une reliure ^?pour supprimer un mot, qui par défaut est disponible via Ctrl + W.

Premier (essai infructueux):

$ bind -P | grep 'C-w'
unix-word-rubout can be found on "\C-w".

Donc, cela devrait donc fonctionner:

$ bind '"\C-?":unix-word-rubout'

Mais ce n'est pas ... quelqu'un capable d'expliquer?

Deuxième essai (réussi):

$ bind '"\C-?":"^W"'

^West un littéral / brut ^W(appuyez sur ctrl + V puis sur ctrl + W pour le faire apparaître).


Votre première solution a fonctionné pour moi, en fait! Le deuxième ne l'a pas fait.
Drew Hoskins

Le deuxième essai semble remplacer le retour arrière lui-même plutôt que Ctrl-Retour arrière?
user541686

7

Modifiez simplement votre ~/.inputrc(vous devrez peut-être en créer un ou copier celui-ci /etc/inputrc) afin qu'il contienne:

# Ctrl-Delete: delete next word
"\e[3;5~": shell-kill-word

# Ctrl-Backspace
"\C-H": shell-backward-kill-word

Cela mappera également Ctrl+ Deletepour supprimer le mot à côté du curseur.


Ça ne marche pas pour moi.
Jonathan

6

Il y a de bonnes réponses ici, mais je l'ai résolu dans Konsole avec Paramètres-> Modifier le profil actuel-> Clavier-> Modifier, puis en ajoutant un mappage de Backspace+Controlà \x17. (J'ai trouvé le code ASCII pour Ctrl-w en utilisant showkey --ascii.)


Merci d'avoir souligné la chose avec showkey. J'ai donc compris que ALT+Dpour supprimer le mot devant le curseur correspondrait à \x1b\x64.
loki

Merci, cela a résolu mon problème. Dans mon cas, j'ai besoin de remapper Alt + Backspace et sa séquence est \x1b\x7f.
DDMC

3

Cela dépend de ce que voit bash. Lors d'une interaction régulière avec un terminal, bash ne voit pas les modificateurs de touches sur lesquels vous avez appuyé, uniquement le caractère résultant. Le retour arrière est déjà le même que control-H, par exemple. Maintenir Shift ou Control ne fait aucune différence.

TOUTEFOIS, votre application de terminal (xterm? Cmd? Terminal? Putty? Dépend de votre système d'exploitation) peut voir vos pressions de touches et peut avoir un moyen de mapper la combinaison de touches de contrôle-retour arrière à quelque chose que bash peut distinguer du retour arrière.


J'ai trouvé que mon bash ne voit pas de retour arrière. Mais peut-être qu'il est possible de le faire voir.
Adobe

@adobe, que veux-tu dire? Tapez «stty» sur votre terminal, puis lisez le manuel à ce sujet. Si ^ H est défini comme votre caractère d'effacement, vous pouvez le définir sur autre chose ... si vous avez une bonne raison.

1
Il y a un bon exemple de la façon de procéder à github.com/calj/gtconf/blob/master/zsh/zshrc . Konsole vous permet de le faire. Copiez l'un des fichiers * .keytab de / usr / share / kde4 / apps / konsole / dans ~ / .kde / share / apps / konsole et modifiez-le avec les suggestions du lien ci-dessus, en supprimant la ligne "Key Backspace" et en ajoutant: key Backspace-Shift-Control : "\x7f"et key Backspace-Shift+Control : "\E[9;3~"Modifiez également la ligne de titre pendant que vous y êtes: keyboard "Xfree4 Modlist"par exemple. Vous pouvez ensuite ajouter "\e[9;3~": backward-kill-word"à ~ / .inputrc
Adam

2

Essaye ça:

bind '"\C-_":backward-kill-word'

Ajoutez éventuellement ce qui suit à ~ / .inputrc pour le rendre permanent:

"\C-_": backward-kill-word

Fonctionne sur bash 4.3.11 dans Kubuntu 14.04


2
Il est peu probable que Control-backspace soit le même que Control-underscore.
Thomas Dickey

1
De toutes les choses que j'ai essayées dans ce fil, cela a fonctionné! Utilisation de "GNU bash, version 4.3.48 (1) -release (x86_64-pc-linux-gnu)" sur bash sur windows / WSL
Markus Jevring

Cela fonctionne très bien pour moi dans cygwin, en utilisant GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin).
zagyi

1

À Konsole:

  • Cliquez sur Settings -> Edit current profile
  • cliquez sur l'onglet 'Clavier' -> [Edit...]
  • cliquez sur le [Add]bouton et sous le Key Combinationtype de colonne Backspace+Ctrl. Dans le Outputtype de colonne 0x08(qui est classiquement le caractère de retour arrière)

Vous devriez maintenant pouvoir mapper cette clé sur backward-kill-wordvia

# ~/.bashrc

bind '"\x08":backward-kill-word'

Merci. Fonctionne pour moi, au moins dans xfce4-terminal.
limon

0

Sur la plupart des terminaux, CTRL + W devrait déjà supprimer un mot à l'envers. Cela fonctionne avec xterm et je suppose que cela fonctionne avec konsole. CTRL + W est une liaison de clé standard sur un programme basé sur du texte qui fonctionnera avec vim en mode insertion, emacs et tous les shells.


5
J'ai Ctrl-w lié à "fermer l'onglet" dans Emacs, FireFox, Krusader - donc je l'ai défini comme une combinaison de fermeture de tabulation dans Konsole également.
Adobe
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.