Al presionar las teclas de flecha se agregan caracteres en el editor vi

188

Cuando intenté usar las teclas de flecha en modo de inserción en el vieditor, los siguientes caracteres se están insertando en el editor:

  • porque consigo B,
  • porque obtengo A,
  • porque tengo D,
  • porque consigo C.

Por favor, ayúdame a resolver este problema.

bvb
fuente
3
Me reí mucho leyendo el título;) Estoy seguro de que hay un XKCD para la sensación espeluznante que surge (para los usuarios novatos) cuando la tecla de flecha imprime letras.
vvy
1
Es muy muy aterrador;)
Kyle Bridenstine

Respuestas:

233

Si aún no tiene un .vimrcarchivo en su directorio de inicio, cree uno usando esto:

vim ~/.vimrc

Agregue esta línea al principio del archivo:

set nocompatible

Guarde el archivo y esto debería solucionar el problema por usted. :)

Gaurav Manchanda
fuente
1
Tuve que crear un archivo .exrc para vi, pero set nocompatible funcionó muy bien.
tgun926
25
Hay un truco si usa en vilugar de vim, tiene que hacer la misma configuración pero en el ~/.exrcarchivo.
tzi
15
Trabajó. Pero, ¿por qué se requiere esta solución? ¿Por qué por defecto no maneja flechas?
Mohit
66
Por defecto, vi / vim está programado para reemplazar las teclas de flecha con las teclas h, j, k, l. Esto se hace para que no tenga que moverse desde el área principal del teclado.
Gaurav Manchanda
10
El siguiente problema es el retroceso, solución: askubuntu.com/questions/296385/…
fecha
87

Instale vim -> Esto solucionará el problema.

sudo apt-get install vim

Hay muchos buenos tutoriales vim / vi en youtube, o en la web en general. Para su problema, vea aquí

Luego continúe abriendo archivos como de costumbre :

vi desired-file
sthysel
fuente
funcionó para mí, aunque no estoy seguro de por qué esto es diferente del vim que estaba lanzando anteriormente
Amos Folarin el
66
Esta debería ser la respuesta aceptada (pero parece que nadie la acepta). es la forma más simple / limpia de hacer que vim esté completamente 'modernizado' a una consola de computadora (en lugar de terminales de la era tty / ANSI.
Lockszmith
sí, estoy de acuerdo con Lockzsmith, esta debería haber sido la respuesta aceptada
niccolo m.
Esto funcionó para mí. Me sorprende que raspian venga con la versión de vi / vim que tiene ... aunque todos los tutoriales para él te dicen que uses nano, por lo que es difícil argumentar que vim es realmente mejor que él. Probablemente, la única razón por la que uso vim en lugar de nano es porque vim siempre está en cada máquina y parece una probabilidad de 50/50 si nano lo está.
ArtOfWarfare
¡COMPUTADORA BLEEPIN!
Chris
27

Con vi, al hacer clic en iactiva el comando para Insertar texto.
Este comando le permite insertar texto en su archivo.
Y a la derecha, al hacer clic:

  • en él insertará una "A",
  • en él insertará una "B",
  • ...

Hasta que desactive este comando.
Para desactivar un comando en vi: simplemente haga clic en Esc
Y luego volverá a usar normalmente las teclas de flecha:

  • subir,
  • bajar,
  • ...

FYI, aquí hay algunos vicomandos: de
esta fuente .

:xReturn salir de vi , escribir el archivo modificado en el archivo nombrado en la invocación original
:wqReturn salir de vi , escribir el archivo modificado en el archivo nombrado en la invocación original
:qReturn salir (o salir) vi
:q!Return salir de vi aunque los últimos cambios no se hayan guardado para esta llamada vi

mover el cursor hacia abajo una línea
mover el cursor hacia arriba una línea
mover el cursor hacia la izquierda un carácter
mover el cursor hacia la derecha un carácter

u deshacer lo que acabas de hacer; un simple alternar
. rehacer lo que acaba de hacer

i insertar texto antes del cursor, hasta Escpresionar
I insertar texto al comienzo de la línea actual, hasta Escpresionar
a agregar texto después del cursor, hasta Escpresionar
A agregar texto al final de la línea actual, hasta Escpresionar
o abrir y colocar texto en una nueva línea debajo de la línea actual, hasta Escpresionar
O abrir y poner texto en una nueva línea sobre la línea actual, hasta que se Escpresione

r reemplace un solo carácter debajo del cursor (no es Escnecesario)
cw cambie la palabra actual con un nuevo texto, comenzando con el carácter debajo del cursor, hasta que Escpresione
x eliminar un solo carácter debajo del cursor
Nx elimine N caracteres, comenzando con el carácter debajo del cursor
dw elimine la sola palabra que comienza con el carácter debajo del
C cambio del cursor (reemplazar) los caracteres en la línea actual, hasta que Escpresione
D eliminar el resto de la línea, comenzando con la posición actual del cursor

dd eliminar toda la línea actual
Ndd eliminar N líneas, comenzando con la línea actual; por ejemplo, 5dd elimina 5 líneas,
yy copia (tira, corta) la línea actual en el búfer
Nyy copia (tira, corta) las siguientes N líneas, incluida la línea actual, en el búfer
p pega las líneas en el búfer en el texto después la línea actual

0(cero) mover el cursor al inicio de la línea actual (el que está con el cursor)
$ mover el cursor al final de la línea actual
w mover el cursor al comienzo de la siguiente palabra
b mover el cursor de regreso al comienzo de la palabra anterior
:0Returno 1G mover el cursor a la primera línea del archivo
:nReturno nG mover el cursor a la línea n
:$Returno G mueva el cursor a la última línea del archivo

/string buscar hacia adelante la aparición de la cadena en el texto
?string buscar hacia atrás la aparición de la cadena en el texto
n pasar a la siguiente aparición de la cadena de búsqueda
N mover a la siguiente aparición de la cadena de búsqueda en dirección opuesta

Boris
fuente
28
La tecla de flecha hacia abajo insertando "B" no es un comportamiento esperado. Las teclas de flecha deben mover los cursores hacia arriba y hacia abajo / izquierda y derecha independientemente del modo de inserción.
James Wong
2
@JamesWong En realidad, es un comportamiento esperado, ya que así fue como Vi fue originalmente programado. VIM, (extraoficialmente) el sucesor de Vi, está en modo compatible con Vi de forma predeterminada, lo que incluye este comportamiento para las teclas de flecha. Entonces, la palabra "debería" aquí es meramente subjetiva, ya que VIM realmente está haciendo lo que fue programado a propósito.
villapx
2
@villapx - No, no es un comportamiento esperado. El comportamiento esperado se define por lo que espera un usuario típico. La persona típica que usa vi / vim lo está usando porque eso es lo que está instalado en un servidor que necesitan configurar rápidamente y no harán lo suficiente para molestarse en instalar otra cosa. Pocos realmente eligen usar vim cuando se les da una opción, y pocos conocen todas estas características o peculiaridades. El usuario típico espera que las flechas muevan el cursor, ese es el comportamiento esperado. Cualquier otra cosa es un comportamiento inesperado, y debe escribirse como un error por lo inesperado que es.
ArtOfWarfare
@ArtOfWarfare Usted es libre de definir "esperado" como quiera. Lo estoy definiendo como lo que espera el autor del código, ya que en el manual de VIM quedaron muy claros cómo se supone que debe comportarse ... desde :help compatible: "Por defecto, esta opción está activada y los valores predeterminados de Vi se utilizan para opciones. Este valor predeterminado se eligió para aquellas personas que desean usar Vim como Vi y ni siquiera (quieren) saber acerca de la opción 'compatible' ".
villapx
@ArtOfWarfare Básicamente, el autor de VIM claramente tenía en mente una audiencia específica al escribir esta parte del código, y solo porque esa audiencia sea diferente de lo que sería su audiencia, no significa que sea un error. Puede archivarlo como un error si lo desea, pero prepárese para ser reprendido por los fundamentalistas de VIM (y realmente cualquier persona que respete el 'manual', a los aficionados de RTFM).
villapx
17

Para deshabilitar la impresión de letras al presionar flechas en el modo de edición, puede hacer lo siguiente

vi $HOME/.exrc 

(cree un archivo si no existe) y luego agregue una línea set nocompatibley guárdelo.

Aniket Thakur
fuente
Lo puse en .vimrc. ¿Por qué lo pones en .exrc?
pauljohn32
Las fuentes de Vim ambas: ver salida de :versionpara el orden de carga (también :h .exrco :h init) Supongo que alguien podría desear que se aplique una configuración tanto en vi como en vim, o podría ser pura fuerza de hábito.
William Robertson
11

Hay tres modos en el editor vi, a saber:

  • modo de comando
  • modo de entrada
  • modo por defecto.

Cuando abre un archivo, está en modo predeterminado. Ahora bien, si quieres ir a una posición específica en el texto, sólo tiene que utilizar las teclas de flecha o el uso h, j, k, lllaves. Tenga en cuenta que esto iba a funcionar sólo cuando no se ha pulsado i(o cualquier otro modo de entrada de comandos de entrar como a, A, I).

La razón de 'B' puede deberse a que las teclas de flecha en el modo de entrada no funcionan como teclas de flecha, así que solo presione Escpara ingresar al modo predeterminado en cualquier momento. Cuándo hacer el cambio a modo de entrada de prensa io a, y para navegar sólo tiene que pulsar ilas teclas principales y el uso de flecha o h, j, k, l.

ps_cool
fuente
7

Tuve exactamente el mismo problema, pero no solo en mi máquina local, sino también en las conexiones a través de masilla en una máquina sles en una máquina virtual Win7 sobre un receptor citrix. Tanto el host local como los hosts remotos se muestran después de que una reinstalación de Ubuntu tuvo exactamente el mismo problema.

Después de descubrir eso

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

Causa este extraño comportamiento de VI. ¡Instalé el paquete consola-datos que resuelve el problema!

sudo apt-get install console-data
kitingChris
fuente
3

Nota:

Hay buena información en las otras publicaciones, pero ninguna de las publicaciones intentó explicar por qué sucedió este comportamiento. Muchas personas están obligadas a tropezar con esto en el futuro. Además, ¿podría marcar esta pregunta como resuelta ya que cualquiera de las publicaciones anteriores probablemente lo ayudó?


Aquí hay una explicación :

Vi es un editor que existe desde hace mucho tiempo, con raíces en los sistemas Unix. Es una buena herramienta, pero se ha iterado y ahora hay una mejor. Vim fue escrito más tarde y es esa iteración. La gente comúnmente se refiere a vi como 'vim-minimal' y vim es una versión "mejorada" de vi. Puedes pensarlo así: vi es el núcleo y vim se expande sobre él.

Probablemente cómo descubriste el comportamiento :

Para que haya descubierto este problema, presionó " i " para ingresar al modo de inserción y luego utilizó las teclas de flecha para navegar por la línea correcta y editar el punto. Esto es lo que causó su problema inesperado de char.

Solución 1 o 2

1) vi someFileMientras usa vi , primero muévase al punto de edición, luego ingrese al modo de inserción.

2) vim someFileSimplemente use vim desde el principio.

No puedo enfatizar lo suficiente como para leer el manual (páginas de manual) o usar -h para obtener ayuda. Una vez que se ajusta a los patrones en el shell, las páginas man se convierten en su mejor amigo. Ejemplo: man vioman vim


Valide que Vim esté instalado .

Abra una ventana de consola y ejecute:

dpkg --list | grep vim

Si obtienes algo similar a esto, entonces puedes comenzar a usar 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

Si el símbolo del sistema regresa sin nada, entonces vim is no está instalado. Use los ejemplos a continuación para actualizar sus repositorios y luego instale vim.

sudo apt-get update
sudo apt-get install vim

Si usa vi o vim solo cuando busca en Internet cómo arreglar algo y se olvida de escribir vim, hay una manera de arreglarlo en el futuro. Te advierto que prestes atención. Puede usar un alias para sobrescribir vi con una referencia a vim para que, sin importar lo que escriba en un futuro poco frecuente, obtenga vim sin ese "¡Uy!" momento. Siempre puedes eliminar un alias más tarde.

Tipo vim .bashrc. Desplácese hacia abajo a la línea vacía con solo una ~(o hacia cualquier otra línea que comience con alias(para que estén agrupadas) y luego presione la tecla i para ingresar al modo -inserción-. En su propia línea separada, ingrese lo siguiente:

alias vi='vim'

Presione Escy luego escriba :wq. Ahora necesita volver a cargar el archivo. Escriba source .bashrcCualquier otro shell que se abra después de haber realizado estas ediciones cargará automáticamente el archivo .bashrc.

D75
fuente
3

Todas las explicaciones dadas son un poco extrañas. Tengo vi pero no vim instalado.

Comprobación de alternativas: /etc/alternatives/vi/usr/bin/vim.tiny

Así vies vim.tiny, y lo usa /etc/vim/vimrc.tiny.

Y en vimrc.tinyti encuentras la siguiente línea:

set compatible

Que es casi lo único en este archivo. Tenga en cuenta que en /etc/vim/vimrcél está utilizando nocompatible.

Así que instale vim, o cambie el vimrc.tinyarchivo, o cree uno propio ~/.vimrcque debe contener la línea:

set nocompatible
Gunstick
fuente
1
No estoy seguro de qué es tan extraño. Termina sugiriendo 1. instalar Vim - askubuntu.com/a/220072/158442 , 2. crear ~/.vimrcy configurar nocompatible: askubuntu.com/a/353944/158442 , o 3. editar un archivo del sistema. Solo la sugerencia de edición /etc/vim/vimrc.tinyes nueva y, sin embargo, las respuestas son extrañas al sugerir lo mismo que ellas.
muru
1

El editor vi tradicional no reconoce las teclas de flecha (... afair). Hay dos soluciones:

  1. usa vim en lugar de vi
  2. use h, j, k y l para navegar (no puede navegar mientras edita en el vi por cierto tradicional).
MadMike
fuente
Esto no es verdad Busque aplicaciones basadas en terminfo / termcap y libcurses. Uso vi desde 1990 en Xenix, SCO Unix, AIX, hpux antiguo y otros, y pure-vi de los 80 ya tiene soporte para mapeos terminfo / termcap.
Luciano
@ james-wong bueno, entonces debería reformular mi respuesta. Para "puro vi en Ubuntu no ..."
MadMike
... y esto fue un comentario para @luciano
MadMike
1

Esto también puede deberse a la TERMvariable; configúralo por ejemplo así:

 export TERM=xterm
Jasper Nuyens
fuente
Esto resolvió el problema para mí donde las otras respuestas no. ¡Gracias!
greg
1

En algunos sistemas, la nocompatibleopción no está disponible o puede que no solucione el problema si un complemento rompe la funcionalidad de la tecla de flecha. Aquí hay una solución ...

Edite el .exrcarchivo para incluir las siguientes líneas:

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

O bien, si el problema solo existe en el modo normal, puede cambiar nmapy omitir lo siguiente a, como sigue:

nmap! ^[OA ^[k

y así.

Aquí están las combinaciones de teclas necesarias para producirlas (mostrando solo la primera):

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

Esto escapa del modo de edición, se mueve en la dirección deseada y vuelve a ingresar al modo de edición. Esto es necesario para superar Vi leyendo la secuencia de escape como una secuencia de <ESC> <O> <A> literal, etc.

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

Dominic Comtois
fuente
1

Para VI crear o editar el archivo "~ / .exrc" o VIM crear o editar el archivo "~ / .vimrc" establecido o agregar en la línea.

set nocompatible

En el momento de escribir este artículo, hay elogios sobre el segundo elemento más votado que se preguntan por qué su entrada no fue aceptada. La razón es que hay hosts que no permiten instalar otros editores. Incluso entonces, vim a veces tiene los mismos efectos, por lo que hay un montón de información utilizable de las dos entradas principales. Sin embargo, no puedo comentar con suerte, esto aclara las razones por las cuales ninguno de los dos es 100% correcto el 100% del tiempo.

tuxdalinuxpenguin
fuente
0

En esta máquina tuve make sureque

set nocompatible

es el last entry in ~/.vimrc. O al menos una de las últimas entradas, en particular, no se carga más plugin después.

HTH

Gen.Stack
fuente
0

Por alguna razón, Ubuntu ha omitido la inicialización de envvar HOME para el usuario root en mi nuevo VPS 18.04. Si ese es el caso, vi no puede encontrar el archivo .vimrc. El problema no ocurre para usuarios normales (en / home /).

Para verificar la variable:

echo $HOME

Si esto resulta en una línea en blanco, la variable no se establece. El problema desapareció después

export HOME=/root

Moví el comando al archivo /root/.bashrc (no sé dónde se configura normalmente).

Erik
fuente