web-dev-qa-db-fra.com

Ctrl-Backspace et Ctrl-Supprimer à Bash

Mettre debien 8.3

stty werase '^H'

ou sur une arche Linux 2/2016

stty werase '^?'

dans .bashrc (par exemple) fait Ctrl-Backspace Supprimer le dernier mot du terminal. Il n'est toujours pas le même comportement que dans les applications d'interface graphique moderne (p. Ex. Firefox): il supprime le dernier Whitespace - mot séparé, et pas le dernier Mot séparé par WhitSpace ou caractères tels que . : , ; " ' & / ( ).

Est-il possible de faire Ctrl-Backspace Se comporter dans le terminal similaire aux applications d'interface graphique moderne? Aussi, y a-t-il un moyen de faire Ctrl-Delete Supprimer le mot immédiatement avant le curseur?

14
wolf-revo-cats

Il y a deux éditeurs de ligne en jeu ici: l'éditeur de ligne de base fournie par le noyau (éditeur de ligne TTY TTY) et Editeur de ligne de Bash (implémenté via la bibliothèque de readline). Ces deux ont une commande effaçable-to-antérieure qui est liée à Ctrl+W par 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 la clé qu'elle trouve dans le paramètre TTY, sauf remplacement de sa propre configuration.

L'action werase dans l'éditeur de lignes Tty ne peut pas être configurée. Il efface toujours des mots délimités par des espaces bleus (ASCII). Il est rare d'interagir avec l'éditeur de lignes Tty - c'est ce que vous obtenez par exemple. Lorsque vous tapez cat sans argument. Si vous souhaitez des liaisons de clés de fantaisie là-bas, vous pouvez exécuter la commande sous un outil tel que RLWRAP qui utilise readline.

Bash fournit deux commandes pour supprimer le mot précédent : unix-Word-rubout (Ctrl+w ou comme défini par stty werase), et backward-kill-Word (M-DEL, c'est à dire. EscBackspace) qui traite un mot comme une séquence de caractères alphanumériques dans la locale actuelle et _ . Si tu veux Ctrl+Backspace Pour effacer la séquence précédente des caractères alphanumériques, ne définissez pas stty werase, et mettre la ligne suivante dans votre .inputrc:

"\C-h": backward-kill-Word

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 reliure standard (et Backspace en particulier 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 quelle séquence d'évacuation votre terminal envoie, puis ajoutez une ligne correspondante dans votre .inputrc. Taper Ctrl+V alors Ctrl+Delete; Cela insérera quelque chose comme ^[[3;5~ Où la première ^[ est une représentation visuelle du caractère d'échappement. Puis la liaison est

"\e[3;5~": kill-Word

Si vous n'êtes pas satisfait de la définition d'un mot, vous pouvez fournir le vôtre à Bash: voir Comportement déroutant des claviers de style EMACS à bash

Essayer

alt+backspace

Dans le système d'exploitation élémentaire, cela fonctionne comme si vous le voulez (tout comme ctrl+backspace)

6
Ahmed Elkoussy

Le comportement du caractère Werase en mode de traitement de mode cuit est code papier , au moins sous Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

Donc, les mots sont des lettres, des chiffres et un soulignement. C'est ainsi que ce sera à tout moment dans un terminal sur Linux lors d'une application qui fait son propre traitement de mode cuit ne fonctionne pas.

la version de Readline (utilisée par Bash et d'autres) semble être un peu différente de la version du noyau, mais elle semble également être codée en dur :

Les mots sont composés de lettres et de chiffres.

Mais cela ne semble pas correspondre à ce que bash réellement fait pour moi: foo+bar^W Efface tout, pas seulement bar. Il y a plus d'informations sur cela ici .

1
Celada