Il tasto Elimina non funziona sulla riga di comando


10

** Nota: ho posto la stessa domanda su SuperUser, ma non ho ricevuto alcuna risposta. Ora mi rendo conto che questo è un forum più appropriato per questa domanda particolare. *

In una shell ksh, il tasto Canc non funziona in modo appropriato sulla riga di comando. Ottengo ~ quando premo Elimina.

Come posso:

  1. associa la funzionalità di "Elimina il carattere al cursore" al pulsante Elimina tastiera? (Control-D si comporta come mi aspetto che il pulsante di eliminazione funzioni e i miei tentativi di utilizzare un alias non hanno avuto successo e probabilmente sono ingenui.)
  2. associa la funzionalità di " Sposta al primo della riga" sul pulsante della tastiera Home? (Il controllo A lo fa ora, ma voglio che Home lo faccia.)
  3. associare la funzionalità di " Sposta alla fine della riga " al pulsante Fine tastiera? (Control E lo fa ora, ma voglio finire per farlo.)

Aggiornamento finale (?)

Mi sono imbattuto in qualcosa che funziona, ma non capisco bene perché. Questo funziona:

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

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

Quindi la mia domanda aggiornata è perché devo usare prefix-2per questo?Per favore, traduci per me in modo che io possa capire, quindi non devo più baccare tutti su questo.

SEGUE IL VECCHIO STUFF

AGGIORNARE

Si scopre che ESC in QNX è ^[. Utilizzando il comando bind '^[[3~'='delete-char-backward'sono in grado di ottenere il cursore per sovrascrivere il carattere sotto il cursore con a ~. Almeno questo è un progresso: ora so come si scrive il tasto Canc per la shell. La maggior parte delle cose che ho visto sul web dicono che la chiave di cancellazione è^? , ma non sembra funzionare per me. Inoltre, dovrei menzionare che accedo a questo tramite PuTTy.

Non capisco perché Control D fa quello che voglio che faccia la chiave di cancellazione. Ho provato a legarlo di eot-or-deletenuovo inutilmente.

Questo dovrebbe essere semplice, giusto?

AGGIORNAMENTO 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

AGGIORNAMENTO 3: Altre mie impostazioni

Impostazione ENV

 echo $ENV
/etc/kshrc

BIND Uscita completa

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

Impostazioni PuTTy:

inserisci qui la descrizione dell'immagine

Note che possono o meno avere importanza, ma potrebbero fornire informazioni di base:

La shell è "PD KSH v5.2.14 99/07 / 13.2". Sì, non ho alcuna opzione per l'aggiornamento ... è un sistema incorporato. "Ottieni una shell moderna" non è una risposta praticabile. Il sistema operativo è QNX Neutrino 6.4.1.

bind mostra quanto segue:

 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 mostra quanto segue:

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 mostra quanto segue:

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


In realtà ho già visto entrambi questi link e ho provato a modificare kshrcsenza risultati. Ottengo sh: /etc/kshrc[21]: trap: bad signal KEYBDNon ho un'altra opzione di shell purtroppo. Non so se questo è un problema con il PDKSH o con QNX o entrambi. So quali combinazioni di tasti causeranno ciò che voglio. Devo solo conoscere la sintassi per mapparli sui tasti appropriati.
kmort,

La chiave Delete funziona per me con Pdksh (stessa versione, non è stata mantenuta dal secolo scorso) sotto Linux. Cosa bind | grep prefixti mostra? E bind | grep '[^ -~]'?
Gilles 'SO- smetti di essere malvagio' il

@Gilles Ho aggiornato con i risultati dei tuoi comandi di bind. Potrebbero essere le mie impostazioni di PuTTy? Apprezzo il vostro aiuto. :-)
kmort

AFAIK bind '^[[3~'='delete-char-forward'avrebbe dovuto funzionare. Non capisco da dove provengano quei caratteri non ASCII (non sono sequenze ESC + foo con l'ottavo bit impostato, né confusioni latin1 / utf8). `Bind '^ X3 ~ = delete-char-forward' funziona?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


6

Per i googler:

Accidenti. Per qualcosa che dovrebbe essere così semplice, questo è stato difficile.

La soluzione breve è utilizzare quanto segue per impostare la chiave di eliminazione (in kshrco ovunque),

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

E imposta le impostazioni del tuo terminale PuTTy su rxvtinvece di Standard.

Impostazioni PuTTy

Questa cosa che mi ha davvero aiutato a farlo funzionare è stata: http://www.mail-archive.com/misc@openbsd.org/msg81796.html

ksh fa cose stupide con le chiavi home e end. Fondamentalmente, non sono riuscito a dire la differenza tra Home, Fine ed Elimina allo stesso tempo. Qualunque fosse l'ultimo limite, tutte e tre le chiavi avrebbero funzionato. Cambiare ciò che PuTTy ha inviato per questi tasti ha aiutato immensamente.

Nota: alcune persone suggeriscono se si desidera vedere quale codice sta ricevendo la shell quando si preme un tasto, digitare cat, premere Invio, quindi premere il tasto. Per la mia shell, questo non ha funzionato. Ho preso ~tutti i tasti di controllo. Quello che ho fatto invece è stato premere Escuna volta, quindi premere il tasto. Il codice di controllo verrebbe visualizzato, quindi verrà visualizzato. Usa quel codice di controllo binde sei pronto.


Posso confermare che funziona anche in Conemu + Cygwin.
Janac Meena,

2

[Anche se abbiamo una configurazione un po 'diversa, spero che quanto segue possa essere utile a qualcuno, poiché penso che si applichino alcuni degli stessi principi generali. Questa è stata una buona esperienza di apprendimento per me su come Linux gestisce gli I / O terminali di base.]

Se la shell è in esecuzione all'interno di una finestra del terminale di gnome , allora in Preferences| Profilesselezionare un profilo, quindi selezionare Edite quindi la Compatibilityscheda e modificato Delete key generatesin Automatic. (O se questo fallisce, prova le altre scelte lì.)

[Sono su Debian Stretch.]


Non so come, o anche quando esattamente il mio Del si è rotto, ma ha iniziato a cancellare a sinistra anziché a destra!

Questo articolo mi è stato molto utile per capire come funzionavano le cose.


Ho usato le strategie di debug suggerite nell'articolo collegato sopra:

Digitare ^v Dele ^v Backspace, [control-v then delete key ...] per trovare i codici di sequenza dei terminali restituiti.

E l'uso showkey -s, showkey -k, showkey -ae quindi Dele Backspacechiavi per ispezionare i tre strati (prime da tastiera, come uscita dal conducente testo, e come carattere stringa data al morsetto).

Da questo ho notato che quando uso stty (ad es. Stty1) il mio comportamento della shell era diverso rispetto all'utilizzo di xterm (dall'interno di un terminale X grafico). Del cancellato correttamente in avanti (a destra) in stty1, ma indietro (a sinistra) nel mio xterm.


L'articolo è un anello morto
Milk,

1

Le due risposte esistenti non hanno funzionato per me passando da Linux (Ubuntu 18.10) bash, tramite SSH a Solaris 11.3 bash, usando il terminale gnome.

Ho scoperto che dovevo usare il bindcomando, ma con una soluzione, poiché non riuscivo a far funzionare un nativo Delete.

Quindi la soluzione è che quando Deleteviene premuto, per simulare un'eliminazione mappando il tasto Canc su premere e Backspace.

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

Per digitare quello, usa i tasti premuti:

CTRL-vDeleteper la prima parte
e CTRL-vCTRL-vBackspaceper la seconda.
(o utilizzare invece \eper la fuga, ad es . "\e[3~":)

Non è perfetto, se Deletealla fine della linea, fa ancora backspaces. Ma mi evita di dover rimpiazzare il ~personaggio mille volte al giorno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.