Ctrl-Backspace et Ctrl-Supprimer dans bash

Mettre Debian 8.3

stty werase '^H' 

ou sur Arch Linux 2/2016

 stty werase '^?' 

dans .bashrc (par exemple) fait CtrlBackspace supprimer le dernier mot dans le terminal. Il ne s'agit pas du même comportement que dans les applications charts modernes (par exemple Firefox): il supprime le dernier mot séparé par un espace et non le dernier mot séparé par des espaces ou des caractères comme . : , ; " ' & / ( ) . : , ; " ' & / ( ) . : , ; " ' & / ( ) .

Est-il possible de faire en sorte que CtrlBackspace se comporte dans le terminal comme dans les applications charts modernes? Aussi, est-il possible de faire CtrlSupprimer supprimer le mot immédiatement avant le slider?

Il y a ici deux éditeurs de ligne: l'éditeur de ligne de base fourni par le kernel (éditeur de ligne canonique tty) et l'éditeur de ligne de bash (implémenté via la bibliothèque readline). Les deux ont une command d'effacement à mot précédent qui est liée à Ctrl + W par défaut. La key peut être configurée pour l'éditeur de ligne tty en mode canonique via stty werase ; bash imite la binding de key qu'il trouve dans le paramètre tty à less qu'il ne soit surchargé dans sa propre configuration.

L'action werase dans l'éditeur de ligne tty ne peut pas être configurée. Il efface toujours les mots (ASCII) délimités par des espaces blancs. Il est rare d'interagir avec l'éditeur de ligne de tty – c'est ce que vous obtenez par exemple lorsque vous tapez cat sans argument. Si vous voulez des raccourcis keyboard fantaisie là, vous pouvez exécuter la command sous un outil comme rlwrap qui utilise readline.

Bash fournit deux commands 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 M-DEL dire Esc Backspace ) qui traite un mot comme une séquence de caractères alphanumériques dans les parameters régionaux actuels et _ . Si vous voulez que Ctrl + Backspace efface la séquence précédente de caractères alphanumériques, ne définissez pas stty werase et placez plutôt la ligne suivante dans votre .inputrc :

 "\Ch": 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 keys sans binding standard (et Backspace en particulier est un désordre pour des raisons historiques).

Il y a aussi une command symésortingque kill-word qui est liée à Md ( Alt + D ) par défaut. Pour le lier à Ctrl + Suppr , vous devez d'abord déterminer quelle séquence d'échappement votre terminal envoie, puis ajoutez une ligne correspondante dans votre .inputrc . Tapez Ctrl + V puis Ctrl + Suppr ; ceci va insert quelque chose comme ^[[3;5~ où l'initiale ^[ est une représentation visuelle du caractère d'échappement. Ensuite, la binding 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 dans bash: voir le comportement déroutant des raccourcis keyboard emacs dans bash

Le comportement du caractère WERASE dans le traitement du terminal en mode cuit est codé en dur , au less sous Linux:

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

Les mots sont donc des lettres, des numbers et des traits de soulignement. C'est ainsi qu'il sera à tout moment dans un terminal sous Linux lorsqu'une application qui exécute son propre traitement en mode cuit n'est pas en cours d'exécution.

La version de readline (utilisée par bash et autres) semble être un peu différente de la version du kernel, mais elle semble aussi être codée en dur :

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

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