Pressionar as teclas de seta adiciona caracteres no editor vi

188

Quando tentei usar as teclas de seta no modo de inserção no vieditor, os seguintes caracteres estão sendo inseridos no editor:

  • porque eu recebo B,
  • pois eu recebo A,
  • pois eu recebo D,
  • pois eu recebo C.

Por favor me ajude a resolver este problema.

bvb
fonte
3
Eu ri bastante lendo o título;) Tenho certeza de que existe um XKCD para a sensação assustadora que surge (para usuários iniciantes) quando a tecla de seta imprime letras.
vvy
11
É muito, muito assustador;)
Kyle Bridenstine

Respostas:

233

Se você ainda não possui um .vimrcarquivo em seu diretório pessoal, crie um usando este:

vim ~/.vimrc

Adicione esta linha ao topo do arquivo:

set nocompatible

Salve o arquivo e isso deve resolver o problema para você. :)

Gaurav Manchanda
fonte
11
Eu tive que criar um arquivo .exrc para vi, mas definir nocompatible funcionou muito bem.
precisa saber é o seguinte
25
Existe um truque se você usar, em vivez de vim, precisará fazer a mesma configuração, mas no ~/.exrcarquivo.
tzi
15
Trabalhou. Mas por que essa correção é necessária? Por que, por padrão, ele não manipula setas?
Mohit 23/01
6
Por padrão, o vi / vim é programado para substituir as teclas de seta pelas teclas h, j, k, l. Isso é feito para que você não precise sair da área principal de teclas do teclado.
Gaurav Manchanda
10
o próximo problema é backspace, solução: askubuntu.com/questions/296385/…
daVe
87

Instale o vim -> Isso resolverá o problema.

sudo apt-get install vim

Existem muitos bons tutoriais do vim / vi no youtube ou na web em geral. Para o seu problema, veja aqui

Em seguida, continue a abrir os arquivos como de costume :

vi desired-file
sthysel
fonte
trabalhou para mim - apesar de não saber por que isso é diferente do vim que eu estava lançando anteriormente
Amos Folarin
6
Essa deve ser a resposta aceita (mas parece que ninguém está aceitando). é a maneira mais simples / mais limpo para obter vim totalmente 'modernizado' para um console de computador (em vez de terminais tty / ERA ANSI.
Lockszmith
sim, eu concordo com você Lockzsmith, essa deveria ter sido a resposta aceita
niccolo m.
Isso funcionou para mim. Estou surpreso que o raspian venha com a versão do vi / vim que ele faz ... embora todos os tutoriais para ele digam para você usar o nano, o que é difícil argumentar que o vim é realmente melhor que ele. Provavelmente, a única razão pela qual eu uso o vim em vez do nano é porque o vim está sempre em todas as máquinas e parece uma chance de 50/50 se o nano está.
ArtOfWarfare
BLEEPIN 'COMPUTADOR!
Chris
27

Com vi, ao clicar em ivocê ativar o comando para Inserir texto.
Este comando permite inserir texto no seu arquivo.
E à direita, ao clicar em:

  • em que irá inserir um "A",
  • em que irá inserir um "B",
  • ...

Até você desativar este comando.
Para desativar um comando vi: basta clicar em Esc
E então você voltará ao uso normal das teclas de seta:

  • ir para cima,
  • descer,
  • ...

Para sua informação, aqui estão alguns vicomandos:
A partir desta fonte .

:xReturn sair do vi , gravar arquivo modificado no arquivo nomeado na invocação original
:wqReturn sair do vi , gravar arquivo modificado no arquivo nomeado na invocação original
:qReturn sair (ou sair) vi
:q!Return sair do vi, mesmo que as alterações mais recentes não tenham sido salvas para esta chamada vi

mover o cursor para baixo uma linha
mover o cursor para cima uma linha
mover o cursor para a esquerda um caractere
mover o cursor para a direita um caracter

u desfazer o que você acabou de fazer; uma simples alternância para
. refazer o que você acabou de fazer

i inserir texto antes do cursor, até Escclicar
I inserir texto no início da linha atual, até Escclicar
a anexar texto após o cursor, até Escclicar
A anexar texto ao final da linha atual, até Escpressionar
o abrir e colocar o texto em uma nova linha abaixo da linha atual, até Escpressionar
O abrir e coloque o texto em uma nova linha acima da linha atual, até Escpressionar

r substituir um caractere sob o cursor (não Escnecessário)
cw altere a palavra atual por um novo texto, começando com o caractere sob o cursor, até Escclicar em
x excluir caractere único sob o cursor
Nx exclua N caracteres, começando com caractere sob o cursor
dw exclua a palavra única começando com caractere sob a
C alteração do cursor (substitua) os caracteres na linha atual, até Escpressionar
D Excluir o restante da linha, começando com a posição atual do cursor

dd excluir linha atual inteira
Ndd excluir N linhas, começando com a linha atual; por exemplo, 5dd exclui 5 linhas
yy copia (puxa, corta) a linha atual para o buffer
Nyy copia (puxa, corta) as próximas N linhas, incluindo a linha atual, no buffer,
p cola as linhas no buffer no texto após a linha atual

0(zero) move o cursor para o início da linha atual (aquele com o cursor)
$ move o cursor para o final da linha atual
w move o cursor para o início da próxima palavra
b move o cursor de volta para o início da palavra anterior
:0Returnou 1G move o cursor para a primeira linha do arquivo
:nReturnou nG move o cursor para alinhar n
:$Returnou G mover o cursor para a última linha do arquivo

/string pesquisar para frente para ocorrência de sequência no texto
?string pesquisar para trás para ocorrência de sequência no texto
n mover para a próxima ocorrência da sequência de pesquisa
N avançar para a próxima ocorrência da sequência de caracteres na direção oposta

Boris
fonte
28
A tecla de seta para baixo inserindo "B" não é um comportamento esperado. As teclas de seta devem mover os cursores para cima e para baixo / esquerda e direita, independentemente do modo de inserção.
James Wong
2
@ JamesWong Na verdade, é um comportamento esperado, pois foi assim que o Vi foi originalmente programado. O VIM, (não oficialmente) o sucessor do Vi, está no modo compatível com o Vi por padrão, o que inclui esse comportamento para as teclas de seta. Portanto, a palavra "deveria" aqui é meramente subjetiva, pois o VIM está realmente fazendo o que foi programado de propósito.
Villapx 01/12/19
2
@illapx - Não, não é um comportamento esperado. O comportamento esperado é definido pelo que o usuário típico espera. A pessoa comum que usa o vi / vim está usando, porque é isso que está instalado em um servidor que eles precisam configurar rapidamente e não farão o suficiente para se preocupar em instalar outra coisa. Poucos realmente escolhem usar o vim quando têm uma opção, e poucos realmente conhecem todos esses recursos ou peculiaridades. O usuário típico espera que as setas movam o cursor - esse é o comportamento esperado. Qualquer outra coisa é um comportamento inesperado e deve ser escrito como um erro para o quão inesperado é.
ArtOfWarfare
@ArtOfWarfare Você pode definir "esperado" como quiser. Estou definindo-o como o esperado pelo autor do código, pois ficou bem claro no manual do VIM como isso deve se comportar ... de :help compatible: "Por padrão, essa opção está ativada e os padrões do Vi são usados ​​para o Esse padrão foi escolhido para as pessoas que desejam usar o Vim exatamente como o Vi, e nem mesmo (querem) conhecer a opção 'compatível' ".
precisa saber é
@ArtOfWarfare Basicamente, o autor do VIM claramente tinha em mente um público específico ao escrever essa parte do código, e apenas porque esse público é diferente do que o seu público seria, não significa que seja um bug. Você pode arquivá-lo como um bug, se desejar, mas esteja preparado para ser criticado pelos fundamentalistas do VIM (e realmente por qualquer pessoa que respeite o 'manual', como os aficionados do RTFM).
villapx
17

Para desativar a impressão de letras pressionando as setas no modo de edição, você pode fazer o seguinte

vi $HOME/.exrc 

(crie um arquivo se ele não existir), adicione uma linha set nocompatiblee salve.

Aniket Thakur
fonte
Coloquei isso em .vimrc. Por que você o coloca em .exrc?
pauljohn32
Fontes do Vim - veja a saída :versionpara a ordem de carga (também :h .exrcou :h init). Suponho que alguém possa querer aplicar uma configuração no vi e no vim, ou pode ser pura força de hábito.
William Robertson
11

Existem três modos no editor vi, a saber:

  • modo de comando
  • modo de entrada
  • modo padrão.

Quando você abre um arquivo, você está no modo padrão. Agora, se você quer ir para uma posição específica em seu texto, basta usar as setas ou uso h, j, k, lchaves. Note-se que isso iria funcionar somente quando você não tiver pressionado i(ou qualquer outro modo de entrada entrar comando como a, A, I).

A razão para 'B' pode ser que as teclas de seta no modo de entrada não funcionam como teclas de seta; portanto, basta pressionar Escpara entrar no modo padrão a qualquer momento. Quando mudar para o modo de entrada de imprensa iou a, e para navegar basta pressionar ias teclas chave e uso de seta ou h, j, k, l.

ps_cool
fonte
7

Eu tinha exatamente o mesmo problema, mas não apenas na minha máquina local, mas também nas conexões via massa de vidraceiro em uma máquina sles em uma VM Win7 por um receptor Citrix. Tanto o host local quanto os hosts remotos são exibidos após a reinstalação do Ubuntu, com o mesmo problema.

Depois de descobrir que

$ localectl list-keymaps 
Couldn't find any console keymaps.

Causa esse estranho comportamento do VI. Instalei o pacote console-data que resolve o problema!

sudo apt-get install console-data
kitingChris
fonte
3

Nota:

Há boas informações nas outras postagens, mas nenhuma das postagens tentou explicar por que esse comportamento aconteceu. Muitas pessoas tendem a tropeçar nisso no futuro. Além disso, você pode marcar esta pergunta como resolvida, pois provavelmente uma das postagens anteriores o ajudou?


Aqui está uma explicação :

Vi é um editor que existe há muito tempo, com raízes nos sistemas Unix. É uma boa ferramenta, mas foi iterada e agora existe melhor. O Vim foi escrito mais tarde e é essa iteração. As pessoas geralmente se referem ao vi como 'vim-minimal' e o vim é uma versão "aprimorada" do vi. Você pode pensar assim: o vi é o núcleo e o vim se expande nele.

Provavelmente como você descobriu o comportamento :

Para descobrir esse problema, você pressionou " i " para entrar no modo de inserção e, em seguida, usou as teclas de seta para navegar pela linha e ponto de edição corretos. Foi isso que causou o seu problema inesperado de caracteres.

Solução 1 ou 2

1) vi someFileEnquanto estiver usando o vi , primeiro vá para o ponto de edição e entre no modo de inserção.

2) vim someFileBasta usar o vim desde o início.

Não posso me estressar o suficiente para ler o manual (páginas de manual) ou usar -h para obter ajuda. Depois que você se ajusta aos padrões no shell, as páginas do manual se tornam seu melhor amigo. Exemplo: man viouman vim


Valide se o Vim está instalado .

Abra uma janela do console e execute:

dpkg --list | grep vim

Se você receber algo parecido com isso, poderá começar a usar o vim.

~ $ dpkg --list | grep vim
ii  vim         2:7.4.052-1ubuntu3  amd64  Vi IMproved - enhanced vi editor
ii  vim-common  2:7.4.052-1ubuntu3  amd64  Vi IMproved - Common files
ii  vim-runtime 2:7.4.052-1ubuntu3  all    Vi IMproved - Runtime files
ii  vim-tiny    2:7.4.052-1ubuntu3  amd64  Vi IMproved - enhanced vi editor - compact version

Se o prompt de comandos retornar sem nada, o vim não está instalado. Use os exemplos abaixo para atualizar seus repositórios e depois instalar o vim.

sudo apt-get update
sudo apt-get install vim

Se você usar o vi ou vim apenas ao pesquisar na internet como consertar algo e esquecer de digitar vim, existe uma maneira de corrigi-lo para o futuro. Eu aconselho você a prestar atenção. Você pode usar um alias para sobrescrever vi com uma referência ao vim, para que não importa o que você digitar em um futuro pouco frequente, você obterá o vim sem esse "opa!" momento. Você sempre pode excluir um alias posteriormente.

Digite vim .bashrc. Mova para baixo até a linha vazia com apenas um ~(ou qualquer outra linha que comece com alias(para que eles sejam agrupados) e pressione a tecla i para entrar no modo de inserção.Em sua própria linha separada, digite o seguinte:

alias vi='vim'

Pressione Esce digite :wq. Agora você precisa recarregar o arquivo. Digite source .bashrcQualquer outro shell que abrir depois que você fizer essas edições carregará automaticamente o arquivo .bashrc.

D75
fonte
3

Todas as explicações dadas são um pouco bizarras. Eu tenho o vi, mas não o vim instalado.

Verificando alternativas: /etc/alternatives/vi/usr/bin/vim.tiny

Assim vié vim.tinye usa /etc/vim/vimrc.tiny.

E vimrc.tinyvocê encontra a seguinte linha:

set compatible

O que é quase a única coisa nesse arquivo. Observe que /etc/vim/vimrcele está usando nocompatible.

Portanto, instale o vim ou altere o vimrc.tinyarquivo ou crie o seu próprio ~/.vimrcque deve conter a linha:

set nocompatible
Gunstick
fonte
11
Não tenho certeza do que é tão bizarro. Você acaba sugerindo 1. instalar o Vim - askubuntu.com/a/220072/158442 , 2. criando ~/.vimrce configurando nocompatible: askubuntu.com/a/353944/158442 , ou 3. editando um arquivo do sistema. Somente a sugestão para editar /etc/vim/vimrc.tinyé nova e, no entanto, você chama respostas bizarras enquanto sugere a mesma coisa que elas.
muru 11/01
1

O editor vi tradicional não reconhece as teclas de seta (... de frente). Existem duas soluções:

  1. use vim em vez de vi
  2. use h, j, ke para navegar (você não pode navegar enquanto edita no vi btw tradicional.)
MadMike
fonte
Isso não é verdade. Procure aplicativos baseados em terminfo / termcap e libcurses. Uso o vi desde 1990 no Xenix, SCO Unix, AIX, hpux antigo e outros, e o pure-vi dos anos 80 já tem suporte para mapeamentos terminfo / termcap.
Luciano
@ James-wong bem, então eu deveria reformular a minha resposta. A "vi puros sob Ubuntu não ..."
madmike
... e isso foi feito como um comentário para @luciano
MadMike 14/12/15
1

Isso também pode ser devido à TERMvariável; defina-o por exemplo assim:

 export TERM=xterm
Jasper Nuyens
fonte
Isso resolveu o problema para mim, onde as outras respostas não. Obrigado!
22718 greg
1

Em alguns sistemas, a nocompatibleopção não está disponível ou pode não resolver o problema se um plug-in quebrar a funcionalidade da tecla de seta. Aqui está uma solução alternativa ...

Edite o .exrcarquivo para incluir as seguintes linhas:

map! ^[OA ^[ka
map! ^[OB ^[ja
map! ^[OC ^[la
map! ^[OD ^[ha

Ou, se o problema existir apenas no modo normal, você pode alterar nmape pular o seguinte a, da seguinte maneira:

nmap! ^[OA ^[k

e assim por diante.

Aqui estão as combinações de teclas necessárias para produzi-las (mostrando apenas a primeira):

map! <CTRL-V><Up-Arrow> <CTRL-V><ESC>ka

Isso escapa do modo de edição, move-se na direção desejada e volta ao modo de edição. Isso é necessário para superar o Vi lendo a sequência de escape como uma sequência de literal <ESC> <O> <A>, etc.

Fonte: https://hea-www.harvard.edu/~fine/Tech/vi.html

Dominic Comtois
fonte
1

Para o VI, crie ou edite o arquivo "~ / .exrc" ou o VIM crie ou edite o arquivo "~ / .vimrc" configurado ou adicione a linha.

set nocompatible

No momento da redação deste texto, há elogios ao segundo item mais votado que estão se perguntando por que sua inscrição não foi aceita. O motivo é que existem hosts que não permitem a instalação de outros editores. Mesmo assim, o vim às vezes tem os mesmos efeitos; portanto, há várias informações úteis nas duas principais entradas. Não posso comentar, no entanto, espero que isso esclareça as razões pelas quais nenhum deles está 100% correto em 100% das vezes.

tuxdalinuxpenguin
fonte
0

Nesta máquina eu tive make sureque

set nocompatible

é o last entry in ~/.vimrc. Ou pelo menos uma das últimas entradas, em particular nenhum plug-in é carregado posteriormente.

HTH

Gen.Stack
fonte
0

Por alguma razão, o Ubuntu omitiu a inicialização do envvar HOME para usuário root no meu novo VPS de 18.04. Se for esse o caso, o vi não consegue encontrar o arquivo .vimrc. O problema não ocorre para usuários normais (em / home /).

Para verificar a variável:

echo $HOME

Se isso resultar em uma linha em branco, a variável não está definida. O problema desapareceu depois

export HOME=/root

Mudei o comando para o arquivo /root/.bashrc (não sei onde isso geralmente está definido).

Erik
fonte