Como posso usar a combinação ctrl+ eteclado no modo emacs para ir até o final da linha, mas também poder usar a Endtecla para fazer o mesmo? Como faço para definir isso com stty? Eu tentei esta combinação copiada do terminal Linux:
stty eol M-^?
mas quando pressiono Endentro F
no teclado.
O sistema é o antigo ATT System V no terminal minicom. Meu termo é 386AT e esta é a definição terminfo
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/3/386AT
AT386|at386|386AT|386at|at/386 console @(#)386.ti 1.4,
am, bw, eo, xon,
colors#8, cols#80, lines#25, ncv#3, pairs#64,
acsc=``aaffggjYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB,
cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%02d;%p2%02dH, cuu=\E[%p1%dA, cuu1=\E[A,
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[1M,
ed=\E[J, el=\E[K, flash=^G, home=\E[H, ht=\t,
ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,
ind=\E[S, indn=\E[%p1%dS, invis=\E[9m, is2=\E[0;10m,
kbs=\b, kcbt=^], kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,
kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y,
kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,
kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,
kf8=\EOW, kf9=\EOX, khome=\E[H, kich1=\E[@, knp=\E[U,
kpp=\E[V, krmir=\E0, op=\E[0m,
pfx=\EQ%p1%{1}%-%d'%p2%s', rev=\E[7m, rin=\E[S,
rmacs=\E[10m, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
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[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%;%?%p7%t;9%;m,
sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,
Responder1
Essa eol
configuração não é para a chave que levaria você ao final de algum buffer de edição de linha, é uma configuração da disciplina de linha tty.
É por seu editor de linha muito básico, aquele usado ao inserir entradas para aplicativos (como cat
, sed
) que não possuem seu próprio editor de linha. Esse editor não possui posicionamento de cursor, o únicoediçãoisso pode ser feito através de backspace ( stty erase
), Ctrl+W ( stty werase
) e Ctrl+U ( stty kill
) possivelmente mais em alguns sistemas.
Isso é feito no próprio driver de dispositivo tty no kernel, os aplicativos ( cat
, sed
...) não veem esses caracteres.
A eol
configuração serve apenas para dizer ao driver para reconhecer um caractere diferente (adicional) do linefeed (também conhecido como nova linha ^J
) como o caractere de final de linha. Ao inserir esse caractere, a disciplina de linha enviaria os caracteres inseridos até o momento para o aplicativo de leitura.
Por exemplo, para inserir uma palavra por vez no texto, em vez de uma linha por vez, você poderia fazer:
stty eol ' '; cat
E você veria que cada vez que você pressiona espaço, cat
o texto digitado será exibido (incluindo o caractere de espaço).
Se você estiver no prompt de um comando que implementa seu próprio editor de linha, mover Endo cursor para o final do buffer atual não seria feito por meio stty
de uma configuração específica desse comando (se for o caso).
Por exemplo, com o zsh
shell, isso seria feito com:
bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line
Supondo que seu terminal envie a sequência de caracteres <ESC>[F
ou <ESC>OF
quando você pressiona essa Endtecla, como sugere seu "F".
Alguns aplicativos serão vinculados automaticamente Endà ação _end-of_line_. Para fazer isso, eles consultarão os bancos de dados locais do terminal termcap ou terminfo para descobrir qual sequência de caracteres seu terminal envia ao pressionar a tecla.
Para isso, eles usam a $TERM
variável. Se a entrada dessa chave nesse banco de dados não corresponder ao que o seu terminal envia, isso não funcionará.
Podes tentar:
tput kend | sed -n l
Para ver o que o banco de dados Endenvia a chave se o seu tput usar terminfo ou verifique sua entrada $ TERM em /etc/termcap se estiver usando termcap. Você pode encontrar uma entrada que corresponda mais ao comportamento do seu minicom (ou do emulador de terminal que o hospeda).
Editar com base em novas informações
Então, provavelmente, você está executando minicom
um xterm
terminal moderno e se comunicando via serial. No outro extremo da linha serial, getty
assume que você está executando um console at386 (que acredito ser na verdade o driver interno do console de antigos sistemas AT&T baseados em PC). Isso está muito longe de ser um xterm moderno.
Olhando aqui para um sistema Solaris que em muitos aspectos é tão moderno quanto o seu antigo sistema AT&T, há uma xterm
entrada em terminfo, mas falta-lhe a kend
capacidade.
O que você pode fazer é carregar a definição terminfo do seu terminal na máquina em que você executa o minicom ( infocmp > file
), transferi-la para a máquina SysV e tentar compilá-la lá tic
(e definir $TERM
com o mesmo valor de lá, definir o TERMINFO
ambiente variável antecipadamente para algo como ~/.terminfo
se você não for administrador lá). Se isso não funcionar porque a versão da maldição é muito antiga, você pode usar a entrada vt100 do sistema AT&T e apenas editar no kend=\EOF
seu terminal, alterar o nome e usar tic
novamente.
Como:
cat > my-term.info << \EOF
my-term|My VT100 compatible terminal with an end-key,
am, mir, msgr, xenl, xon,
cols#80, it#8, lines#24, vt#3,
acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n,
cuf=\E[%p1%dC, cuf1=\E[C$<2>,
cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>,
el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=\t,
hts=\EH, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=\b,
kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP,
kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8,
rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmkx=\E[?1l\E>,
rmso=\E[m$<2>, rmul=\E[m$<2>,
rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
sgr0=\E[m^O$<2>, smacs=^N, smkx=\E[?1h\E=,
smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, kend=\EOF
EOF
TERMINFO="$HOME/.terminfo" export TERMINFO
mkdir -p "$TERMINFO"
tic my-term.info
E adicione:
if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
TERMINFO=$HOME/.terminfo
TERM=my-term
export TERM TERMINFO
fi
para o seu ~/.profile
(onde the-serial-device
está o tty
resultado quando você faz login via serial.