A chave Delete não funciona na linha de comando

9

** Observação: fiz esta mesma pergunta no SuperUser, mas não recebi nenhuma resposta. Agora percebo que este é um fórum mais apropriado para essa questão em particular. *

Em um shell ksh, a chave Delete não funciona apropriadamente na linha de comando. Eu recebo um ~ quando eu pressiono Delete.

Como faço para:

  1. liga a funcionalidade de "Apaga o caractere no cursor" para o botão do teclado Excluir? (Control-D se comporta como eu espero que o excluir botão para trabalhar e minhas tentativas de usar um alias foram sem sucesso e provavelmente ingênuo.)
  2. liga a funcionalidade de " Mover para o primeiro da linha" para o botão do teclado Home? (Controle A faz isso agora, mas eu quero que o Home faça isso.)
  3. liga a funcionalidade de " Mover para o final da linha " para o botão Teclado final? (Controlar E faz isso agora, mas eu quero acabar com isso.)

Atualização final (?)

Eu tropecei em algo que funciona, mas não entendo bem por quê. Isso funciona:

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

De acordo com o link ,

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

Então, minha pergunta atualizada é por que eu preciso usar prefix-2 para isso? Por favor, traduza para que eu possa entender, então eu não tenho que questionar todo mundo novamente sobre isso.

VELHO MATERIAL SEGUE

UPDATE

Acontece que ESC no QNX é ^[ . Usando o comando bind '^[[3~'='delete-char-backward' , consigo fazer com que o cursor sobrescreva o caractere sob o cursor com ~ . Isso é algum progresso, pelo menos - agora sei como soletrar Delete Key para o shell. A maioria das coisas que vi na web dizem que a chave de exclusão é ^? , mas isso não parece funcionar para mim. Além disso, devo mencionar que estou acessando isso via PuTTy.

Eu não entendo porque Control D faz o que eu quero que a tecla delete faça. Tentei vinculá-lo novamente a eot-or-delete sem sucesso.

Isso deve ser simples, certo?

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: Mais das minhas configurações

Configuração de ENV

 echo $ENV
/etc/kshrc

Saída completa do 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

Configurações de conteúdo:

Notasquepodemounãoserimportantes,masquepodemfornecerinformaçõesbásicas:

Acascaé"PD KSH v5.2.14 99/07 / 13.2". Sim, não tenho opção de atualizar ... é um sistema embarcado. "Obter uma concha moderna" não é uma resposta viável. O sistema operacional é o QNX Neutrino 6.4.1.

bind mostra o seguinte:

 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 o seguinte:

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 o seguinte:

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
    
por kmort 28.02.2013 / 18:32

2 respostas

6

Para Googlers:

Uau. Para algo que deveria ser tão simples, isso foi difícil.

A solução curta é usada para definir a chave de exclusão (em kshrc ou onde),

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

E defina as configurações do terminal do PuTTy como rxvt em vez de Standard .

Essacoisaquerealmentemeajudouaconseguiressetrabalhofoi: link

O ksh faz coisas bobas com as teclas inicial e final. Basicamente, eu não consegui fazer a diferença entre Home, End e Delete ao mesmo tempo. O que quer que fosse o último limite, todas as três chaves serviriam. Mudar o que o PuTTy enviou para essas chaves ajudou imensamente.

Nota: Algumas pessoas sugerem que, se você quiser ver qual código o shell está obtendo quando pressiona uma tecla, digite cat , pressione enter e, em seguida, pressione a tecla. Para minha concha, isso não funcionou. Eu tenho ~ para todas as chaves de controle. Em vez disso, pressione Esc uma vez e, em seguida, pressione a tecla. O código de controle mostraria, em seguida, aparecer. Use esse código de controle em bind e está tudo pronto.

    
por 08.03.2013 / 22:53
0

[Embora tenhamos uma configuração um pouco diferente, espero que o seguinte possa ser útil para alguém, pois acho que alguns dos mesmos princípios gerais se aplicam. Isso provou ser uma boa experiência de aprendizado para mim sobre como o Linux lida com I / O básico de terminal.]

Se o shell estiver sendo executado dentro de uma janela do terminal do gnome , sob Preferences | Profiles selecione um perfil, selecione Edit e, em seguida, a guia Compatibility e altere a Delete key generates para Automatic . (Ou se isso falhar, tente as outras opções lá.)

[Eu estou no Debian Stretch.]

Eu não sei como, ou mesmo quando exatamente o meu Del foi quebrado, mas ele começou a deletar à esquerda e não à direita!

Este artigo foi muito útil para mim entender como as coisas trabalhado.

Usei as estratégias de depuração sugeridas no artigo vinculado acima:

Digite ^v Del e ^v Backspace , [control-v, em seguida, exclua a chave ...] para localizar os códigos de sequência do terminal retornados.

E use showkey -s , showkey -k , showkey -a e, em seguida, Del e Backspace chaves para inspecionar as três camadas (cru do teclado, como saída do driver tty e como cadeia de caracteres dada ao terminal) .

A partir disso, notei que, ao usar stty (por exemplo, stty1), o comportamento de meu shell era diferente de quando usava xterm (a partir de um terminal X gráfico). Del deletado corretamente para frente (direita) em stty1, mas para trás (esquerda) no meu xterm.

    
por 07.04.2018 / 00:36