Solução encontrada
# For some reason home and end keys are not mapping properly.
# Home key
imap <esc>OH <esc>0i
cmap <esc>OH <home>
nmap <esc>OH 0
# End key
nmap <esc>OF $
imap <esc>OF <esc>$a
cmap <esc>OF <end>
Uma pergunta simples: por que com o Solaris 10 no vim, pressionar a tecla final produzir F?
Isto é o que aconteceu depois de pressionar
This is a text file,i will press "end key"
F
F
F
F
:(
Solução encontrada
# For some reason home and end keys are not mapping properly.
# Home key
imap <esc>OH <esc>0i
cmap <esc>OH <home>
nmap <esc>OH 0
# End key
nmap <esc>OF $
imap <esc>OF <esc>$a
cmap <esc>OF <end>
Com o Solaris 10, você provavelmente está executando o xterm ou o gnome-terminal. Para o xterm, ele tem o patch xterm # 196 e um xterm X11R6 ligeiramente corrigido.
O vim obtém as informações do terminal do banco de dados do terminal. A definição xterm
não possui uma definição para as chaves home / end. Aqui está o que parece no formato terminfo:
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/x/xterm
xterm|vs100|xterm terminal emulator,
am, km, mir, msgr, xenl,
cols#80, it#8, lines#65,
acsc=''aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J,
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,
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=\t, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
il=\E[%p1%dL, il1=\E[L, 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=\E[21~, kf1=\E[11~, kf10=\EOx, kf2=\E[12~,
kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~,
kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, rc=\E8, rev=\E[7m,
ri=\EM, rmacs=^O, rmkx=\E[?1l\E>, rmso=\E[m,
rmul=\E[m,
rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
sc=\E7,
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^>
sgr0=\E[m, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m,
smul=\E[4m, tbc=\E[3g,
Se a descrição do terminal tivesse teclas de início / fim, elas seriam listadas como khome
e kend
, respectivamente.
Além disso, a sequência de inicialização rs1
ativa o modo de aplicação para as teclas do cursor (que podem incluir o teclado de edição de 6 teclas com o Início e chaves End ). Isso faz com que eles enviem o prefixo escape O
.
O vim não sabe nada sobre essa informação, já que ela apenas usa o que pode obter do banco de dados do terminal. Quando ele vê uma seqüência de caracteres não no banco de dados do terminal, ele tenta interpretar esse caractere de cada vez. O caractere escape finaliza o modo de inserção, mas O
"abre" (inicia uma inserção) e você obtém o caractere final da chave, por exemplo, H
ou F
. Pressionando repetidamente a tecla obtém-se um F
por impressão (deixando-o no modo de inserção após pressionar a tecla).
A correção adequada seria reparar a descrição do terminal, evitando a necessidade de mapeamentos no seu .vimrc
, por exemplo,
infocmp >foo
vi foo
....adding this line (with a leading tab character):
khome=\EOH, kend=\EOF,
sudo tic foo
Leitura adicional: