Mettre sur Debian 8.3
stty werase '^H'
ou sur Arch Linux 2/2016
stty werase '^?'
dans .bashrc
(par exemple) fait Ctrl- Backspacesupprimer le dernier mot du terminal. Pourtant ce n'est pas le même comportement que dans les applications graphiques modernes (par exemple Firefox): Il supprime le dernier espaces mot -Séparé, et non le dernier mot séparés par des espaces ou des caractères comme . : , ; " ' & / ( )
.
Est-il possible de faire Ctrl- Backspacese comporter dans le terminal similaire aux applications GUI modernes? De plus, existe-t-il un moyen de faire Ctrl- Deletesupprimer le mot juste avant le curseur?
bash
terminal
keyboard-shortcuts
line-editor
loup-revo-chats
la source
la source
Réponses:
Il y a deux éditeurs de ligne en jeu ici: l'éditeur de ligne de base fourni par le noyau (éditeur de ligne tty en mode canonique) et l'éditeur de ligne de bash (implémenté via la bibliothèque readline). Les deux ont une commande d'effacement au mot précédent qui est liée à Ctrl+ Wpar défaut. La clé peut être configurée pour l'éditeur de ligne tty en mode canonique via
stty werase
; bash imite la liaison de clé qu'il trouve dans le paramètre tty, sauf s'il est remplacé dans sa propre configuration.L'
werase
action dans l'éditeur de ligne tty ne peut pas être configurée. Il efface toujours les mots (ASCII) délimités par des espaces. Il est rare d'interagir avec l'éditeur de ligne tty - c'est ce que vous obtenez par exemple lorsque vous tapezcat
sans argument. Si vous voulez des raccourcis clavier fantaisie, vous pouvez exécuter la commande sous un outil comme rlwrap qui utilise readline.Bash fournit deux commandes pour supprimer le mot précédent :
unix-word-rubout
( Ctrl+ wou tel que définistty werase
) etbackward-kill-word
(M-DEL
, c'est-à-dire Esc Backspace) qui traite un mot comme une séquence de caractères alphanumériques dans les paramètres régionaux et_
. Si vous souhaitez Ctrl+ Backspaceeffacer la séquence précédente de caractères alphanumériques, ne définissez passtty werase
et placez plutôt la ligne suivante dans votre.inputrc
:Notez que cela suppose que votre terminal envoie le caractère Ctrl + H pour Ctrl+ Backspace. Malheureusement, c'est l'une de ces clés sans liaison standard (et Backspaceen particulier, c'est un gâchis pour des raisons historiques).
Il y a aussi une commande symétrique
kill-word
qui est liée àM-d
( Alt+ D) par défaut. Pour le lier à Ctrl+ Delete, vous devez d'abord déterminer la séquence d'échappement envoyée par votre terminal, puis ajouter une ligne correspondante dans votre.inputrc
. Tapez Ctrl+ Vpuis Ctrl+ Delete; cela insérera quelque chose comme^[[3;5~
où l'initiale^[
est une représentation visuelle du caractère d'échappement. Ensuite, la liaison estSi vous n'êtes pas satisfait de l'une ou l'autre définition d'un mot, vous pouvez fournir la vôtre dans bash: voir le comportement déroutant des raccourcis clavier de type emacs dans bash
la source
Ctrl+Del
a bien fonctionné. Cependant, je ne peux pas me rendreCtrl+Backspace
au travail. PourCtrl+v, Ctrl+Backspace
mon terminal dit^?
. Que dois-je mettre dans le.inputrc
? Merci"\C-?": backward-kill-word
ou la fonction de lecture que vous souhaitez. Mais vous ne pouvez définir une liaison pour Ctrl + Retour arrière qui est différente de la liaison pour Retour arrière que si elles envoient des caractères différents. Si votre terminal envoie^?
à la fois pour le retour arrière et Ctrl + Retour arrière, l'application exécutée dans le terminal n'a aucun moyen de les distinguer. Certains terminaux peuvent être configurés (par exemple xterm, urxvt), d'autres (par exemple les émulateurs de terminaux basés sur VTE) ne le peuvent pas.~/.inputrc
désactive la valeur par défaut/etc/inputrc
. pour résoudre ce problème, vous devez inclure ce fichier:$include /etc/inputrc
(à partir d' ici )Essayer
alt+backspace
Dans OS élémentaire, cela fonctionne comme vous le souhaitez (comme ctrl+ backspace)
la source
Le comportement du caractère WERASE dans le traitement de terminal en mode cuit est codé en dur , au moins sous Linux:
Les mots sont donc des lettres, des chiffres et des traits de soulignement. Il en sera ainsi à tout moment dans un terminal sous Linux lorsqu'une application qui effectue son propre traitement en mode cuit n'est pas en cours d'exécution.
La version de readline (utilisée par bash et d'autres) semble être légèrement différente de la version du noyau, mais elle semble également être codée en dur :
Mais cela ne semble pas correspondre à ce
bash
qui me fait réellement:foo+bar^W
efface tout, pas seulementbar
. Il y a plus d'informations à ce sujet ici .la source
backward-kill-word
(liaison par défautM-DEL
) au lieu deunix-word-rubout
.