Appuyer sur les touches fléchées ajoute des caractères dans l'éditeur vi


188

Lorsque j'ai essayé d'utiliser les touches de direction en mode insertion dans l' viéditeur, les caractères suivants sont insérés dans l'éditeur:

  • car je reçois B,
  • car je reçois un,
  • car je reçois D,
  • car je reçois C.

S'il vous plaît aidez-moi à résoudre ce problème.


3
J'ai bien rigolé en lisant le titre;) Je suis sûr qu'il existe un XKCD pour le sentiment sinistre qui émerge (pour les utilisateurs novices) lorsque les touches fléchées affichent des lettres.
vvy

1
C'est très très effrayant;)
Kyle Bridenstine

Réponses:


233

Si vous n'avez pas déjà un .vimrcfichier dans votre répertoire personnel, créez-en un en utilisant ceci:

vim ~/.vimrc

Ajoutez cette ligne en haut du fichier:

set nocompatible

Enregistrez le fichier et cela devrait résoudre le problème pour vous. :)


1
Je devais créer un fichier .exrc pour vi, mais définir nocompatible a très bien fonctionné.
tgun926

25
Il y a une astuce si vous utilisez à la viplace de vim, vous devez faire la même configuration mais dans le ~/.exrcfichier.
tzi

15
Travaillé. Mais pourquoi ce correctif est-il nécessaire? Pourquoi par défaut, il ne gère pas les flèches?
Mohit

6
Par défaut, vi / vim est programmé pour remplacer les touches de direction par les touches h, j, k, l. Ceci est fait pour que vous n'ayez pas à vous déplacer de la zone des touches principales du clavier.
Gaurav Manchanda le

10
problème suivant est le retour arrière, solution: askubuntu.com/questions/296385/…
daVe

87

Installez vim -> Cela résoudra le problème.

sudo apt-get install vim

Il existe de nombreux bons tutoriels sur vim / vi sur youtube ou sur le web en général. Pour votre problème, voir ici

Continuez ensuite à ouvrir les fichiers comme d'habitude :

vi desired-file

a travaillé pour moi - mais je ne sais pas pourquoi c'est différent du vim que je lançais précédemment
Amos Folarin

6
Cela devrait être la réponse acceptée (mais semble que personne ne l'accepte). C’est le moyen le plus simple et le plus propre d’obtenir vim entièrement «modernisé» sur une console d’ordinateur (au lieu des terminaux de l’époque tty / ANSI).
Lockszmith

oui je suis d'accord avec toi Lockzsmith, cela devrait être la réponse acceptée
niccolo m.

Cela a fonctionné pour moi. Je suis surpris que raspian soit livré avec la version de vi / vim qu'il propose ... bien que tous les tutoriels pour cela vous disent d'utiliser nano, ce qui est difficile à argumenter sur le fait que vim est vraiment meilleur que lui. La seule raison pour laquelle j'utilise vim plutôt que nano est probablement parce que vim est toujours présent sur chaque machine et il semble que 50% des chances que nano soit.
ArtOfWarfare

BLEEPIN 'ORDINATEUR!
Chris

27

Avec vi, lorsque vous cliquez sur, ivous activez la commande Insérer du texte.
Cette commande vous permet d'insérer du texte dans votre fichier.
Et à droite, en cliquant:

  • sur il va insérer un "A",
  • sur il va insérer un "B",
  • ...

Jusqu'à ce que vous désactiviez cette commande.
Pour désactiver une commande dans vi: il suffit de cliquer sur Esc
Et vous retrouverez l'utilisation normale de vos touches de direction:

  • à monter,
  • descendre,
  • ...

Pour votre information, voici quelques vicommandes:
À partir de cette source .

:xReturn quit vi , écrit le fichier modifié dans le fichier nommé dans l'appel d'origine
:wqReturn quit vi , écrit le fichier modifié dans le fichier nommé dans l'appel d'origine
:qReturn quit (ou exit) vi
:q!Return quit vi même si les dernières modifications n'ont pas été enregistrées pour cet appel vi

déplace le curseur vers le bas d'une ligne
déplace le curseur vers le haut d'une ligne
déplace le curseur vers la gauche un caractère
déplace le curseur vers la droite un caractère

u annulez ce que vous venez de faire; une simple bascule
. refaire ce que vous venez de faire

i insérer du texte avant le curseur, jusqu'à ce Escsuccès
I insertion du texte au début de la ligne courante, jusqu'à ce Esccoup
a append texte après le curseur, jusqu'à Escsuccès
A ajouter du texte à la fin de la ligne courante, jusqu'à Escfrapper
o ouvert et de mettre du texte dans une nouvelle ligne sous la ligne actuelle, jusqu'à Escfrapper
O ouverte et place le texte dans une nouvelle ligne au-dessus de la ligne actuelle, jusqu'à ce que vous Escappuyiez sur

r remplacer un seul caractère sous le curseur (pas Escnécessaire)
cw changer le mot en cours avec le nouveau texte, en commençant par le caractère sous le curseur, jusqu'à ce Escsuccès
x supprimer un seul caractère sous le curseur
Nx supprimer N caractères, en commençant par le caractère sous le curseur
dw supprimer le seul mot commençant par le caractère sous le curseur
C changement (remplacez) les caractères de la ligne en cours, jusqu'à ce que vous ayezEsc frappé,
D supprimez le reste de la ligne en commençant par la position actuelle du curseur

dd supprimer toute la ligne en cours
Ndd supprimer N lignes, en commençant par la ligne en cours; par exemple, 5DD supprime 5 lignes de
yy copie (coup sec, couper) la ligne courante dans le tampon
Nyy copie (coup sec, coupé) les lignes suivantes N, y compris la ligne courante, dans la mémoire tampon
p coller la ligne (s) dans la mémoire tampon dans le texte après la ligne actuelle

0(zéro) déplace le curseur au début de la ligne actuelle (celle avec le curseur)
$ déplace le curseur à la fin de la ligne actuelle
w déplace le curseur au début du mot suivant
b déplace le curseur au début du mot précédent
:0Returnou 1G déplace le curseur à la première ligne du fichier
:nReturnou nG déplace le curseur vers la ligne n
:$Returnou G déplace le curseur sur la dernière ligne du fichier

/string rechercher en avant l'occurrence d'une chaîne dans le texte
?string chercher en arrière l'occurrence d'une chaîne dans le texte
n passer à l'occurrence suivante de la chaîne de recherche
N passer à l'occurrence suivante de la chaîne de recherche dans la direction opposée


28
La flèche vers le bas pour insérer "B" n'est pas un comportement attendu. Les touches fléchées doivent déplacer les curseurs vers le haut, le bas, la gauche et la droite, quel que soit le mode d'insertion.
James Wong

2
@ JamesWong En fait, il s'agit du comportement attendu, car c'est ainsi que Vi avait été programmé à l'origine. VIM, (officieusement) le successeur de Vi, est par défaut en mode compatible Vi, ce qui inclut ce comportement pour les touches de direction. Donc, le mot "devrait" est simplement subjectif, car VIM fait ce pour quoi il a été programmé à dessein.
villapx

2
@villapx - Non, ce n'est pas le comportement attendu. Le comportement attendu est défini par les attentes de votre utilisateur type. La personne type qui utilise vi / vim l’utilise, car c’est ce qui est installé sur un serveur qu’ils doivent configurer rapidement et ils ne feront pas assez pour s’ennuyer à installer autre chose. Peu de personnes choisissent réellement d'utiliser vim lorsqu'une option leur est proposée, et peu de personnes connaissent réellement toutes ces fonctionnalités ou bizarreries. L'utilisateur typique s'attend à ce que les flèches déplacent le curseur - c'est le comportement attendu. Tout le reste est un comportement inattendu, et doit être écrit comme un bogue expliquant à quel point il est inattendu.
ArtOfWarfare

@ArtOfWarfare Vous êtes libre de définir "attendu" comme bon vous semble. Je le définis comme étant ce que l’auteur du code attendait, car le manuel du VIM expliquait clairement comment il est censé se comporter ... from :help compatible: "Par défaut, cette option est activée et les valeurs par défaut de Vi sont utilisées Cette option par défaut a été choisie pour les personnes qui souhaitent utiliser Vim comme Vi, et qui ne savent même pas (ne veulent) que choisir l'option "compatible". "
villapx

@ArtOfWarfare Fondamentalement, l'auteur de VIM avait clairement à l'esprit un public spécifique lors de l'écriture de cette partie du code, et le fait que ce public soit différent de celui de votre public ne signifie pas que c'est un bug. Vous pouvez le signaler comme un bogue si vous le souhaitez, mais soyez prêt à être critiqué par les fondamentalistes de VIM (et par tous ceux qui respectent le «manuel», à la manière des aficionados de la RTFM).
villapx

17

Pour désactiver l’impression des lettres en appuyant sur les flèches en mode édition, procédez comme suit:

vi $HOME/.exrc 

(créez un fichier s'il n'existe pas), ajoutez-y une ligne set nocompatibleet sauvegardez-le.


Je mets ça dans .vimrc. Pourquoi le mettez-vous dans .exrc?
pauljohn32

Vim sources les deux - voir la sortie de :versionl'ordre de chargement ( :h .exrcou ou :h init). Je suppose que quelqu'un voudra peut-être qu’un paramètre s’applique à la fois dans vi et vim, ou pourrait être une simple force d’habitude.
William Robertson

11

Il existe trois modes dans l'éditeur vi, à savoir:

  • mode de commande
  • mode d'entrée
  • mode par défaut.

Lorsque vous ouvrez un fichier, vous êtes en mode par défaut. Maintenant , si vous voulez aller à une position spécifique dans votre texte, il suffit d' utiliser les touches fléchées ou utiliser h, j, k, lclés. Notez que cela ne fonctionne que lorsque vous ne l' avez pas pressé i(ou tout autre mode d'entrée commande l' entrée comme a, A, I).

La raison de «B» peut être parce que les touches fléchées en mode de saisie ne fonctionnent pas comme des touches fléchées; appuyez simplement sur Escpour passer en mode par défaut à tout moment. Quand passer en mode d'entrée , appuyez iou a, et pour naviguer appuyez simplement sur les itouches fléchées et utilisez la touche ou h, j, k, l.


7

J'ai eu exactement le même problème, mais pas seulement sur ma machine locale, mais aussi sur des connexions via du mastic sur une machine sles dans une VM Win7 via un récepteur Citrix. L’hôte local et les hôtes distants montrent qu’une réinstallation d’Ubuntu a eu exactement le même problème.

Après avoir découvert que

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

Provoque ce comportement étrange VI J'ai installé le paquet console-data qui résout le problème!

sudo apt-get install console-data

3

Remarque:

Les autres publications contiennent de bonnes informations, mais aucune d’entre elles n’a tenté d’expliquer pourquoi ce problème s’est produit. Beaucoup de gens sont obligés de trébucher à l'avenir. Aussi, pourriez-vous marquer cette question comme résolue puisque l’un des messages précédents vous a probablement aidé?


Voici une explication :

Vi est un éditeur qui existe depuis longtemps, avec des racines dans les systèmes Unix. C'est un bon outil, mais il a été itéré et maintenant, il y a mieux. Vim a été écrit plus tard et est-ce l'itération. Les gens se réfèrent généralement à vi comme "vim-minimal" et à vim est une version "améliorée" de vi. Vous pouvez le penser comme ceci: vi est le noyau et vim le développe.

Probablement comment vous avez découvert le comportement :

Pour que vous ayez découvert ce problème, vous avez appuyé sur " i " pour entrer en mode insertion , puis vous avez utilisé les touches de direction pour naviguer dans la ligne et le point d'édition corrects. C'est ce qui a causé votre problème de caractère inattendu.

Solution 1 ou 2

1) vi someFileLorsque vous utilisez vi , déplacez-vous d'abord vers le point d'édition, puis entrez en mode insertion.

2) vim someFileUtilisez simplement vim dès le début.

Je ne saurais trop insister pour lire le manuel (pages de manuel) ou utiliser -h pour obtenir de l'aide. Une fois que vous vous êtes adapté aux motifs de la coque, les pages de manuel deviennent votre meilleur ami. Exemple: man viouman vim


Validez que Vim est installé .

Ouvrez une fenêtre de console et exécutez:

dpkg --list | grep vim

Si vous obtenez quelque chose de similaire à cela, vous pouvez simplement commencer à utiliser 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 l'invite de commande revient sans rien, alors vim n'est pas installé. Utilisez les exemples ci-dessous pour mettre à jour vos référentiels, puis installez vim.

sudo apt-get update
sudo apt-get install vim

Si vous n'utilisez vi ou vim que lorsque vous cherchez sur Internet comment réparer quelque chose et que vous oubliez de taper vim, il existe un moyen de le réparer pour l'avenir. Je vous conseille de faire attention. Vous pouvez utiliser un alias pour écraser vi avec une référence à vim. Ainsi, peu importe ce que vous tapez dans un avenir peu fréquent, vous obtenez vim sans ce "oops!" moment. Vous pouvez toujours supprimer un alias plus tard.

Type vim .bashrc. Descendez sur la ligne vide avec uniquement un ~(ou sur toute autre ligne commençant par alias(ils sont donc regroupés), puis appuyez sur la touche i pour passer en mode -insert-. Sur sa propre ligne, entrez les éléments suivants:

alias vi='vim'

Appuyez sur Escpuis tapez :wq. Maintenant, vous devez recharger le fichier. Tapez source .bashrcTout autre shell qui s'ouvre après avoir apporté ces modifications chargera automatiquement le fichier .bashrc.


3

Toutes les explications données sont un peu bizarres. J'ai vi mais pas vim installé.

Vérification des alternatives: /etc/alternatives/vi/usr/bin/vim.tiny

Ainsi viest vim.tiny, et il utilise /etc/vim/vimrc.tiny.

Et dans vimrc.tinyvous trouvez la ligne suivante:

set compatible

Ce qui est presque la seule chose dans ce fichier. Notez que dans /etc/vim/vimrcil utilise nocompatible.

Donc, soit installer vim, soit changer le vimrc.tinyfichier, ou créer le vôtre ~/.vimrcqui devrait contenir la ligne:

set nocompatible

1
Je ne sais pas ce qui est si bizarre. Vous finissez par suggérer 1. installer Vim - askubuntu.com/a/220072/158442 , 2. créer ~/.vimrcet paramétrer nocompatible: askubuntu.com/a/353944/158442 , ou 3. éditer un fichier système. Seule la suggestion d’éditer /etc/vim/vimrc.tinyest nouvelle, et pourtant vous appelez des réponses bizarres tout en suggérant la même chose qu’elles.
Muru

1

L'éditeur vi traditionnel ne reconnaît pas les touches de direction (... de suite). Il y a deux solutions:

  1. utiliser vim au lieu de vi
  2. utilisez h, j, k et l pour naviguer (vous ne pouvez pas naviguer pendant l'édition sur le vi vit traditionnel.)

Ce n'est pas vrai Recherchez les applications basées sur terminfo / termcap et libcurses. J'utilise vi depuis 1990 dans Xenix, SCO Unix, AIX, old hpux, etc., et pure-vi à partir de 80 ans prennent déjà en charge les mappages terminfo / termcap.
Luciano

@ james-wong bien alors je devrais reformuler ma réponse. Pour "pur vi sous Ubuntu ne ..."
MadMike

... et ceci était destiné à @luciano
MadMike

1

Cela peut aussi être dû à la TERMvariable; définissez-le par exemple comme ceci:

 export TERM=xterm

Cela a résolu le problème pour moi alors que les autres réponses ne le faisaient pas. Merci!
Greg

1

Sur certains systèmes, l' nocompatibleoption n'est pas disponible ou ne résoudra pas le problème si un plug-in casse la fonctionnalité de la flèche. Voici une solution de contournement ...

Editez le .exrcfichier pour inclure les lignes suivantes:

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

Ou, si le problème existe uniquement en mode normal, vous pouvez modifier nmapet ignorer les éléments suivants a, comme suit:

nmap! ^[OA ^[k

etc.

Voici les combinaisons de touches nécessaires pour les produire (en montrant le premier seulement):

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

Cela sort du mode d’édition, se déplace dans la direction voulue et revient en mode d’édition. Ceci est nécessaire pour surmonter Vi en lisant la séquence d'échappement sous la forme d'une séquence littérale <ESC> <O> <A>, etc.

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


1

Pour VI, créez ou éditez le fichier "~ / .exrc" ou VIM créez ou éditez le fichier "~ / .vimrc" défini ou ajouté à la ligne.

set nocompatible

Au moment d'écrire ces lignes, des éloges sur le deuxième article le plus voté se demandent pourquoi leur inscription n'a pas été acceptée. La raison en est que certains hôtes n'autorisent pas l'installation d'autres éditeurs. Même dans ce cas, vim a parfois les mêmes effets, il existe donc une foule d’informations utilisables provenant des deux premières entrées. Je ne peux pas commenter, mais j'espère que cela clarifie les raisons pour lesquelles aucun des deux n'est correct à 100% dans 100% des cas.


0

Sur cette machine je devais make sureque

set nocompatible

est le last entry in ~/.vimrc. Ou au moins une des dernières entrées, en particulier plus aucun plugin n'est chargé après.

HTH


0

Pour une raison quelconque, Ubuntu a omis d’initialiser envvar HOME pour l’utilisateur root sur mon nouveau 18.04 VPS. Si tel est le cas, vi ne peut pas trouver le fichier .vimrc. Le problème ne se produit pas pour les utilisateurs normaux (dans / home /).

Pour vérifier la variable:

echo $HOME

S'il en résulte une ligne vide, la variable n'est pas définie. Le problème est parti après

export HOME=/root

J'ai déplacé la commande dans le fichier /root/.bashrc (je ne sais pas où cela est généralement défini).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.