Die Löschtaste funktioniert nicht in der Befehlszeile

10

** Hinweis: Ich habe dieselbe Frage in SuperUser gestellt, aber keine Antwort erhalten. Mir ist jetzt klar, dass dies ein geeigneteres Forum für diese spezielle Frage ist. *

In einer ksh-Shell funktioniert die Entf-Taste in der Befehlszeile nicht ordnungsgemäß . Ich erhalte ein ~, wenn ich Entf drücke.

Wie mache ich:

  1. Binden Sie die Funktionalität von "Zeichen am Cursor löschen" an die Schaltfläche Tastatur löschen? (Control-D verhält sich so, als würde die Löschtaste funktionieren, und meine Versuche, einen Alias ​​zu verwenden, waren erfolglos und wahrscheinlich naiv.)
  2. Binden Sie die Funktionalität von " Zum ersten der Zeile verschieben" an die Home-Tastaturtaste? (Kontrolle A macht das jetzt, aber ich möchte, dass Home es macht.)
  3. Binden Sie die Funktionalität von " An das Ende der Zeile verschieben " an die Schaltfläche "Tastatur beenden ". (Control E macht das jetzt, aber ich möchte, dass es zu Ende geht.)

Letztes (?) Update

Ich bin auf etwas gestoßen, das funktioniert, aber ich verstehe nicht ganz warum. Das funktioniert:

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

Laut 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.

Meine aktualisierte Frage lautet also, warum ich das verwenden muss prefix-2. Bitte übersetzen Sie für mich, damit ich verstehen kann, damit ich nicht alle erneut darüber nerven muss.

ALTES PERSONAL FOLGT

AKTUALISIEREN

Es stellt sich heraus, dass ESC in QNX ist ^[. Mit dem Befehl kann bind '^[[3~'='delete-char-backward'ich den Cursor dazu bringen, das Zeichen unter dem Cursor mit a zu überschreiben ~. Dies ist zumindest ein Fortschritt - ich weiß jetzt, wie man den Löschschlüssel für die Shell buchstabiert . Die meisten Dinge, die ich im Web gesehen habe, besagen, dass der Löschschlüssel ist ^?, aber das scheint für mich nicht zu funktionieren. Außerdem sollte ich erwähnen, dass ich über PuTTy darauf zugreife.

Ich verstehe das nicht, weil Control D genau das tut, was ich mit der Löschtaste tun möchte. Ich versuchte es eot-or-deleteerneut ohne Erfolg zu binden .

Das sollte einfach sein, oder?

UPDATE 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

UPDATE 3: Weitere Einstellungen

ENV-Einstellung

 echo $ENV
/etc/kshrc

BIND Complete Output

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

PuTTy-Einstellungen:

Geben Sie hier die Bildbeschreibung ein

Hinweise, die wichtig sein können oder nicht, aber Hintergrundinformationen liefern können:

Die Shell ist "PD KSH v5.2.14 99/07 / 13.2". Ja, ich habe keine Option zum Aktualisieren ... es ist ein eingebettetes System. "Get a modern shell" ist keine brauchbare Antwort. Das Betriebssystem ist QNX Neutrino 6.4.1.

bind zeigt folgendes:

 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 zeigt folgendes:

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 zeigt folgendes:

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
quelle
Ich habe diese beiden Links bereits gesehen und versucht, kshrcsie ohne Erfolg zu ändern . Ich sh: /etc/kshrc[21]: trap: bad signal KEYBDhabe leider keine andere Shell-Option. Ich weiß nicht, ob dies ein Problem mit dem PDKSH oder mit QNX oder beiden ist. Ich weiß, welche Tastenkombinationen das bewirken, was ich will. Ich muss nur die Syntax kennen, um sie den entsprechenden Schlüsseln zuzuordnen.
kmort
Der Delete-Schlüssel funktioniert für mich mit Pdksh (dieselbe Version, die seit dem letzten Jahrhundert nicht mehr gepflegt wurde) unter Linux. Was bind | grep prefixzeigt sich für Sie? Und bind | grep '[^ -~]'?
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ich habe mit den Ergebnissen Ihrer Bindebefehle aktualisiert. Könnte es meine PuTTy-Einstellungen sein? Ich schätze Ihre Hilfe. :-)
kmort
AFAIK bind '^[[3~'='delete-char-forward'hätte funktionieren sollen. Ich verstehe nicht, woher diese Nicht-ASCII-Zeichen kommen (es handelt sich weder um ESC + foo-Sequenzen mit gesetztem 8. Bit noch um latein1 / utf8-Verwirrungen). Funktioniert `bind '^ X3 ~ = delete-char-forward'?
Gilles 'SO - hör auf böse zu sein'

Antworten:

6

Für Googler:

Wütend. Für etwas, das so einfach sein sollte, war das schwer.

Die kurze Lösung besteht darin, den Löschschlüssel (in kshrcoder wo auch immer) wie folgt festzulegen:

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

Und stellen Sie Ihre PuTTy-Terminaleinstellungen auf rxvtstatt Standard.

PuTTy-Einstellungen

Diese Sache, die mir wirklich geholfen hat, war: http://www.mail-archive.com/[email protected]/msg81796.html

ksh macht dumme Sachen mit den Home- und End-Schlüsseln. Grundsätzlich konnte ich nicht gleichzeitig den Unterschied zwischen Home, End und Delete erkennen. Was auch immer zuletzt gebunden war, alle drei Schlüssel würden reichen. Das Ändern der von PuTTy für diese Schlüssel gesendeten Daten hat immens geholfen.

Hinweis: Einige Leute schlagen vor, wenn Sie sehen möchten, welchen Code die Shell erhält, wenn Sie eine Taste catdrücken, eingeben, die Eingabetaste drücken und dann die Taste drücken. Für meine Shell hat das nicht funktioniert. Ich habe ~für alle Steuertasten. Ich habe stattdessen Esceinmal gedrückt und dann die Taste gedrückt. Der Steuercode würde dann angezeigt. Verwenden Sie diesen Steuercode in bindund Sie sind fertig.

kmort
quelle
Ich kann bestätigen, dass dies auch in Conemu + Cygwin funktioniert.
Janac Meena
2

[Obwohl wir ein etwas anderes Setup haben, hoffe ich, dass das Folgende für jemanden von Nutzen sein kann, da ich denke, dass einige der gleichen allgemeinen Prinzipien gelten. Dies war eine gute Lernerfahrung für mich, wie Linux mit grundlegenden Terminal-E / A umgeht.]

Wenn die Shell in einem Gnome-Terminalfenster ausgeführt wird , klicken Sie unter Preferences| ProfilesWählen Sie ein Profil aus, wählen Sie Editdann die CompatibilityRegisterkarte aus und ändern Sie die Delete key generatesin Automatic. (Oder wenn dies fehlschlägt, versuchen Sie es mit den anderen Optionen.)

[Ich bin auf Debian Stretch.]


Ich weiß nicht wie oder wann genau mein Del kaputt gegangen ist, aber es begann eher links als rechts zu löschen!

Dieser Artikel war sehr hilfreich für mich, um zu verstehen, wie die Dinge funktionierten.


Ich habe die vorgeschlagenen Debugging-Strategien im oben verlinkten Artikel verwendet:

Geben Sie ^v Delund ^v Backspace, [control-v und dann den Schlüssel löschen ...] ein, um die zurückgegebenen Terminalsequenzcodes zu finden.

Und Gebrauch showkey -s, showkey -k, showkey -aund dann Delund BackspaceTasten inspizieren die drei Schichten (roh aus Tastatur, als Ausgabe von tty - Treiber, und als Zeichenkette an Klemme angegeben).

Daraus ergab sich, dass sich mein Shell-Verhalten bei Verwendung von stty (z. B. stty1) von dem bei Verwendung von xterm (innerhalb eines grafischen X-Terminals) unterschied. Del wurde in stty1 korrekt vorwärts (rechts), in meinem xterm jedoch rückwärts (links) gelöscht.

Elliptische Ansicht
quelle
Artikel ist eine tote Verbindung
Milch
1

Die vorhandenen zwei Antworten funktionierten nicht für mich, als ich von Linux (Ubuntu 18.10) über SSH zu Solaris 11.3 mit dem Gnome-Terminal wechselte.

Ich stellte fest, dass ich den bindBefehl verwenden musste, aber mit einem Workaround, da ich keinen Native Deletezum Funktionieren bringen konnte.

Die Problemumgehung besteht also darin, dass beim DeleteDrücken ein Löschvorgang simuliert wird, indem der Tastendruck zum Löschen auf und abgebildet wird Backspace.

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

Verwenden Sie dazu die folgenden Tasten:

CTRL-vDeletefür den ersten Teil
und CTRL-vCTRL-vBackspacefür den zweiten.
(oder verwenden Sie \efür die Flucht statt, zum Beispiel: "\e[3~")

Es ist nicht perfekt, wenn Sie Deleteam Ende der Linie sind, es immer noch Backspaces. Aber es erspart mir, den ~Charakter unzählige Male am Tag zurück zu drücken.

Kingsley
quelle