** Nota: fiz a mesma pergunta no SuperUser, mas não obtive resposta. Agora percebo que este é um fórum mais apropriado para essa pergunta em particular. *
Em um shell ksh, a tecla Delete não funciona adequadamente na linha de comando. Recebo ~ quando pressiono Excluir.
Como é que eu:
- vincular a funcionalidade de "Excluir o caractere no cursor" ao botão Excluir teclado? (Control-D se comporta como eu esperava que o botão excluir funcionasse e minhas tentativas de usar um alias foram malsucedidas e provavelmente ingênuas.)
- vincular a funcionalidade de " Mover para o primeiro da linha" ao botão do teclado inicial? (O controle A faz isso agora, mas quero que o Home faça isso.)
- vincular a funcionalidade de " Mover para o final da linha " ao botão Finalizar teclado? (O controle E faz isso agora, mas eu quero que o faça.)
Atualização final (?)
Eu me deparei com algo que funciona, mas não entendo bem o porquê. Isso funciona:
bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward
De acordo com 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.
Portanto, minha pergunta atualizada é por que preciso usar prefix-2
isso? Traduza para mim, para que eu possa entender, para não precisar incomodar todos novamente sobre isso.
SEGUINTES MATERIAIS SEGUINTES
ATUALIZAR
Acontece que o ESC no QNX é ^[
. Usando o comando bind '^[[3~'='delete-char-backward'
, sou capaz de fazer com que o cursor substitua o caractere sob o cursor com a ~
. Pelo menos, isso é algum progresso - agora eu sei como se escreve a tecla Delete 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 o Control D faz o que eu quero que a tecla delete faça. Tentei vinculá-lo eot-or-delete
novamente sem sucesso.
Isso deve ser simples, certo?
ATUALIZAÇÃO 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
ATUALIZAÇÃO 3: mais das minhas configurações
Configuração ENV
echo $ENV
/etc/kshrc
Saída Completa 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 PuTTy:
Observações que podem ou não ser importantes, mas podem fornecer antecedentes:
O shell é "PD KSH v5.2.14 99/07 / 13.2". Sim, não tenho opção de atualizar ... é um sistema incorporado. "Obter um shell moderno" 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
O 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
fonte
kshrc
sem sucesso. Eu ficosh: /etc/kshrc[21]: trap: bad signal KEYBD
Eu não tenho outra opção shell infelizmente. Não sei se isso é um problema com o PDKSH ou com o QNX ou ambos. Eu sei quais combinações de teclas causarão o que eu quero. Eu só preciso conhecer a sintaxe para mapeá-los para as chaves apropriadas.bind | grep prefix
mostra para você? Ebind | grep '[^ -~]'
?bind '^[[3~'='delete-char-forward'
deveria ter funcionado. Eu não entendo de onde vêm esses caracteres não ASCII (eles não são sequências ESC + foo com o conjunto de 8 bits, nem confusões latin1 / utf8). `Bind '^ X3 ~ = delete-char-forward' funciona?Respostas:
Para os googlers:
Ufa. Para algo que deveria ser tão simples, isso era difícil.
A solução curta é usar o seguinte para definir a chave de exclusão (dentro
kshrc
ou onde),E defina as configurações do terminal PuTTy para em
rxvt
vez deStandard
.O que realmente me ajudou a conseguir esse trabalho foi: http://www.mail-archive.com/[email protected]/msg81796.html
O ksh faz coisas tolas com as teclas home e end. Basicamente, não consegui dizer a diferença entre Início, Final e Exclusão ao mesmo tempo. Qualquer que fosse o último limite, todas as três chaves serviriam. Alterar o que o PuTTy enviou para essas chaves ajudou imensamente.
Nota: Algumas pessoas sugerem se você deseja ver o código que o shell está obtendo ao pressionar uma tecla, digitar
cat
, pressionar enter e pressionar a tecla. Para minha concha, isso não funcionou. Eu tenho~
para todas as teclas de controle. O que fiz foi pressionarEsc
uma vez e depois pressionar a tecla O código de controle será exibido. Use esse código de controlebind
e está tudo pronto.fonte
[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 a E / S básica do terminal.]
Se o shell estiver sendo executado dentro de uma janela de terminal do gnome , em
Preferences
|Profiles
selecione um perfil, selecioneEdit
e, em seguida, aCompatibility
guia e altereDelete key generates
paraAutomatic
. (Ou, se isso falhar, tente as outras opções.)[Estou no Debian Stretch.]
Eu não sei como, ou mesmo quando exatamente meu Del foi quebrado, mas começou a excluir a esquerda e não a direita!
Este artigo foi muito útil para eu entender como as coisas funcionavam.
Eu usei as estratégias de depuração sugeridas no artigo vinculado acima:
Digite
^v Del
e^v Backspace
, [control-v, em seguida, apague a chave ...] para encontrar os códigos de sequência do terminal retornados.E uso
showkey -s
,showkey -k
,showkey -a
e, em seguida,Del
eBackspace
chaves para inspecionar as três camadas (matérias do teclado, como saída a partir do driver tty, e como cadeia de caracteres dada ao terminal).A partir disso, notei que, ao usar o stty (por exemplo, stty1), meu comportamento no shell era diferente do uso do xterm (de dentro de um terminal X gráfico). Del excluído corretamente para a frente (direita) em stty1, mas para trás (esquerda) no meu xterm.
fonte
As duas respostas existentes não funcionaram para mim, partindo do Linux (Ubuntu 18.10) bash, via SSH para Solaris 11.3 bash, usando o terminal gnome.
Descobri que precisava usar o
bind
comando, mas com uma solução alternativa, pois não conseguia que um nativo Deletefuncionasse.Portanto, a solução alternativa é que, quando Deletepressionado, simule uma exclusão mapeando a tecla Delete para →e Backspace.
Para digitar isso, use as teclas pressionadas:
CTRL-vDeletepara a primeira parte
e CTRL-v→CTRL-vBackspacepara a segunda.
(ou use
\e
para a fuga, por exemplo"\e[3~"
:)Não é perfeito, se você Deleteno final da linha, ele ainda retrocede. Mas isso me impede de retroceder o
~
personagem várias vezes por dia.fonte