Ctrl-Retour arrière et Ctrl-Suppr dans bash

14

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?

loup-revo-chats
la source
1
Votre shell peut prendre en charge ces actions, qui peuvent être liées à une clé donnée.
Thomas Dickey
@ThomasDickey: J'utilise bash. C'est bien si cela fonctionne juste en bash.
wolf-revo-cats

Réponses:

27

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' weraseaction 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 tapez catsans 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éfini stty werase) et backward-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 pas stty weraseet placez plutôt 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 liaison standard (et Backspaceen particulier, c'est un gâchis pour des raisons historiques).

Il y a aussi une commande symétrique kill-wordqui 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 est

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

Si 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

Gilles 'SO- arrête d'être méchant'
la source
2
excellente explication! Le Ctrl+Dela bien fonctionné. Cependant, je ne peux pas me rendre Ctrl+Backspaceau travail. Pour Ctrl+v, Ctrl+Backspacemon terminal dit ^?. Que dois-je mettre dans le .inputrc? Merci
Ciprian Tomoiagă
3
@CiprianTomoiaga "\C-?": backward-kill-wordou 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.
Gilles 'SO- arrête d'être méchant'
4
il est important de noter que la définition ~/.inputrcdé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 )
Ciprian Tomoiagă
+1 pour Esc + Retour arrière
Celal Ergün
6

Essayer

alt+backspace

Dans OS élémentaire, cela fonctionne comme vous le souhaitez (comme ctrl+ backspace)

Ahmed Elkoussy
la source
1

Le comportement du caractère WERASE dans le traitement de terminal en mode cuit est codé en dur , au moins 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 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 :

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

Mais cela ne semble pas correspondre à ce bashqui me fait réellement: foo+bar^Wefface tout, pas seulement bar. Il y a plus d'informations à ce sujet ici .

Celada
la source
1. L'utilisateur vi recherche probablement backward-kill-word(liaison par défaut M-DEL) au lieu de unix-word-rubout.
Gilles 'SO- arrête d'être méchant'