La touche de suppression ne fonctionne pas sur la ligne de commande

10

** Remarque: J'ai posé cette même question sur SuperUser, mais je n'ai reçu aucune réponse. Je me rends compte maintenant que c'est un forum plus approprié pour cette question particulière. *

Dans un shell ksh, la touche Suppr ne fonctionne pas correctement sur la ligne de commande. J'obtiens un ~ lorsque j'appuie sur Supprimer.

Comment puis-je:

  1. lier la fonctionnalité de "Supprimer le caractère au niveau du curseur" au bouton Supprimer du clavier? (Control-D se comporte comme si je m'attendais à ce que le bouton de suppression fonctionne et mes tentatives d'utilisation d'un alias ont été infructueuses et probablement naïves.)
  2. lier la fonctionnalité de " Déplacer au premier de la ligne" au bouton du clavier principal? (Le contrôle A le fait maintenant, mais je veux que Home le fasse.)
  3. lier la fonctionnalité " Déplacer à la fin de la ligne " au bouton Fin du clavier? (Control E le fait maintenant, mais je veux en finir.)

Mise à jour finale (?)

Je suis tombé sur quelque chose qui fonctionne, mais je ne comprends pas très bien pourquoi. Cela marche:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Selon http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind ,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

Donc, ma question mise à jour est pourquoi dois-je utiliser prefix-2pour cela? S'il vous plaît, traduisez pour moi afin que je puisse comprendre afin de ne plus avoir à embêter tout le monde à ce sujet.

ANCIEN STUFF SUIT

MISE À JOUR

Il s'avère que ESC dans QNX l'est ^[. En utilisant la commande, bind '^[[3~'='delete-char-backward'je peux obtenir que le curseur écrase le caractère sous le curseur avec a ~. C'est au moins un progrès - je sais maintenant comment épeler Supprimer la clé pour le shell. La plupart des choses que j'ai vues sur le Web disent que la touche de suppression est ^?, mais cela ne semble pas fonctionner pour moi. De plus, je dois mentionner que j'y accède via PuTTy.

Je ne comprends pas parce que Control D fait ce que je veux que la touche de suppression fasse. J'ai essayé de le lier à eot-or-deletenouveau en vain.

Cela devrait être simple, non?

MISE À JOUR 2:

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

MISE À JOUR 3: Plus de mes paramètres

Réglage ENV

 echo $ENV
/etc/kshrc

Sortie complète BIND

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/ etc / kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

Paramètres PuTTy:

entrez la description de l'image ici

Notes qui peuvent ou non avoir de l'importance, mais qui pourraient fournir un contexte:

Le shell est "PD KSH v5.2.14 99/07 / 13.2". Oui, je n'ai pas la possibilité de mettre à niveau ... c'est un système embarqué. "Obtenez un shell moderne" n'est pas une réponse viable. Le système d'exploitation est QNX Neutrino 6.4.1.

bind montre ce qui suit:

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp montre ce qui suit:

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty montre ce qui suit:

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59
kmort
la source
Est -ce que unix.stackexchange.com/questions/23041/... ou unix.stackexchange.com/questions/42753/... aide?
Gilles 'SO- arrête d'être méchant'
En fait, j'ai déjà vu ces deux liens et j'ai essayé de les modifier kshrcen vain. Je reçois, sh: /etc/kshrc[21]: trap: bad signal KEYBDje n'ai malheureusement pas d'autre option de shell. Je ne sais pas si c'est un problème avec le PDKSH ou avec QNX ou les deux. Je sais quelles combinaisons de touches provoqueront ce que je veux. J'ai juste besoin de connaître la syntaxe pour les mapper aux clés appropriées.
kmort
La touche Suppr fonctionne pour moi avec Pdksh (même version, elle n'a pas été maintenue depuis le siècle dernier) sous Linux. Qu'est-ce que cela vous bind | grep prefixmontre? Et bind | grep '[^ -~]'?
Gilles 'SO- arrête d'être méchant'
@Gilles J'ai mis à jour les résultats de vos commandes de liaison. Serait-ce mes paramètres PuTTy? J'apprécie ton aide. :-)
kmort
L'AFAIK bind '^[[3~'='delete-char-forward'aurait dû fonctionner. Je ne comprends pas d'où viennent ces caractères non ASCII (ce ne sont pas des séquences ESC + foo avec le 8ème bit, ni des confusions latin1 / utf8). Est-ce que `bind '^ X3 ~ = delete-char-forward' fonctionne?
Gilles 'SO- arrête d'être méchant'

Réponses:

6

Pour les Googleurs:

Ouf. Pour quelque chose qui devrait être si simple, c'était difficile.

La solution courte est d'utiliser ce qui suit pour définir la clé de suppression (dans kshrcou n'importe où),

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Et définissez vos paramètres de terminal PuTTy sur au rxvtlieu de Standard.

Paramètres PuTTy

Cette chose qui m'a vraiment aidé à faire fonctionner cela était: http://www.mail-archive.com/[email protected]/msg81796.html

ksh fait des bêtises avec les touches home et end. Fondamentalement, je ne pouvais pas faire la différence entre Début, Fin et Supprimer en même temps. Quelle que soit la dernière liaison, les trois clés feraient l'affaire. Changer ce que PuTTy a envoyé pour ces clés a énormément aidé.

Remarque: Certaines personnes suggèrent si vous voulez voir quel code le shell obtient lorsque vous appuyez sur une touche, tapez cat, appuyez sur entrée, puis appuyez sur la touche. Pour ma coquille, cela n'a pas fonctionné. J'ai obtenu ~toutes les touches de contrôle. Ce que j'ai fait à la place, c'est d'appuyer Escune fois, puis d'appuyer sur la touche. Le code de contrôle s'afficherait puis apparaîtrait. Utilisez ce code de contrôle bindet vous êtes prêt.

kmort
la source
Je peux confirmer que cela fonctionne également dans Conemu + Cygwin.
Janac Meena
2

[Bien que nous ayons une configuration quelque peu différente, j'espère que ce qui suit peut être utile à quelqu'un, car je pense que certains des mêmes principes généraux s'appliquent. Cela s'est avéré être une bonne expérience d'apprentissage pour moi sur la façon dont Linux gère les E / S des terminaux de base.]

Si le shell s'exécute à l'intérieur d'une fenêtre de terminal gnome , alors sous Preferences| Profilessélectionnez un profil, puis sélectionnez Edit, puis l' Compatibilityonglet, puis changez Delete key generatespour Automatic. (Ou si cela échoue, essayez les autres choix là-bas.)

[Je suis sur Debian Stretch.]


Je ne sais pas comment, ni même quand exactement mon Del s'est cassé, mais il a commencé à supprimer la gauche plutôt que la droite!

Cet article m'a été très utile pour comprendre comment les choses fonctionnaient.


J'ai utilisé les stratégies de débogage suggérées dans l'article lié ci-dessus:

Tapez ^v Delet ^v Backspace, [contrôle-v puis touche de suppression ...] pour trouver les codes de séquence de terminal renvoyés.

Et l' utilisation showkey -s, showkey -k, showkey -apuis Delet les Backspaceclés pour inspecter les trois couches (brutes à partir du clavier, en sortie du pilote tty, et en tant que chaîne de caractères donnée à la borne).

De cela, j'ai remarqué qu'en utilisant stty (par exemple stty1), mon comportement de shell était différent de celui en utilisant xterm (à partir d'un terminal X graphique). Del a été supprimé correctement en avant (à droite) dans stty1, mais en arrière (à gauche) dans mon xterm.

Vue elliptique
la source
L'article est un lien mort
Milk
1

Les deux réponses existantes n'ont pas fonctionné pour moi en passant de Linux (Ubuntu 18.10) bash, via SSH à Solaris 11.3 bash, en utilisant le terminal gnome.

J'ai trouvé que je devais utiliser la bindcommande, mais avec une solution de contournement, car je ne pouvais pas faire fonctionner un natif Delete.

La Deletesolution consiste donc à appuyer sur, pour simuler une suppression en mappant la touche de suppression sur et Backspace.

bind '"^[[3~":"^[[C^?"'

Pour taper cela, utilisez les touches:

CTRL-vDeletepour la première partie
et CTRL-vCTRL-vBackspacepour la seconde.
(ou l' utilisation \epour l'évasion à la place, par exemple: "\e[3~")

Ce n'est pas parfait, si vous êtes Deleteen fin de ligne, ça revient en arrière. Mais cela m'évite d'avoir à revenir en arrière sur le ~personnage dix fois par jour.

Kingsley
la source