web-dev-qa-db-fra.com

Pourquoi les touches de direction ne sont pas recommandées dans Vim

"N'utilisez jamais les touches fléchées dans Vim!"

J'ai entendu cela d'un orateur aléatoire, mais je n'ai pas eu l'occasion de lui demander pourquoi. De plus, si vous n'utilisez pas les touches fléchées, comment pouvez-vous déplacer le curseur dans le mode Insérer ?

119
Michael Lee

Utiliser les touches fléchées est considéré comme une mauvaise habitude, car si vous utilisez les touches fléchées, vous manquerez probablement de nombreuses fonctionnalités intéressantes de vim.

Lorsque les gens commencent à utiliser vim, ils ont tendance à rester en mode insertion car il s'agit davantage de l'édition de texte conventionnelle. Cependant, pour être efficace dans vim, vous ne devez être en mode insertion que lorsque vous saisissez du texte. Si vous souhaitez déplacer le curseur, vous devez être en mode normal. Vous devriez être en mode normal par défaut.

En mode normal, il existe un million de raccourcis pour se déplacer. Vous pouvez utiliser hjklpour vous déplacer d'un espace à la fois ou par mots, par paragraphes, etc. Si vous êtes en mode normal, il est inutile d’utiliser les touches fléchées au lieu de hjklcar elles sont plus éloignées.

Il y a l'attitude que si vous utilisez les touches fléchées, vous utilisez vim "faux". La vérité est que vim a une courbe d'apprentissage vraiment très abrupte, alors pendant que vous étudiez, faites tout ce qui vous garde sain d'esprit. Lorsque j'ai commencé à utiliser vim, j'ai tout fait de la "mauvaise" manière et je n'ai eu aucun problème à rompre les habitudes une fois que j'ai appris davantage des commandes de vim.

Par exemple, quand j'ai commencé, disons que je voulais changer le texte entre guillemets:

String mystring = "I want to change this";

J'allais en mode insertion, je passais à la fin de la chaîne à l'aide des touches fléchées, j'appuyais sur la touche retour arrière jusqu'à ce que la chaîne disparaisse et j'entrais le nouveau texte.

Une meilleure solution consiste à placer votre curseur n'importe où dans la chaîne (mode normal), puis à appuyer sur ci". Ceci sera changein". Cela supprimera tout entre les guillemets et vous mettra en mode insertion afin que je puisse saisir le nouveau texte.

171
Dean

Placement clé

En bref, Vim utilise les touches hjkl comme interface de navigation car il s’agit d’un vestige de l’ancien terminal "ADM-3A", sur lequel ces touches étaient marquées par des flèches.

Keyboard

Puisque vim est dérivé de vi, il utilise les mêmes clés hjkl.

Nouvelles habitudes

Le remplacement basé sur les lettres pour les touches de direction vous permet de naviguer dans le texte sans quitter vos mains de la configuration de frappe standard . C'est sans doute plus efficace et plus rapide que de déplacer votre main pour appuyer sur les touches fléchées. Comme indiqué dans la référence n ° 2 (voir ressources), il n’ya pas d’avantage à cela: VIM comporte de nombreux autres raccourcis auxquels vous pouvez accéder sans bouger vos mains.

Ressources et mode insertion

Il existe quelques réponses très détaillées et précises aux 2 parties de votre question: en termes de remplacement de la touche fléchée, j’ai répondu de manière rapide et sommaire, cependant pour votre question d’insertion , veuillez consulter les ressources. énumérés ci-dessous.

91

Ce mantra stupide est souvent répété par les dactylographes tactiles pour qui la ligne d'arrivée est comme une seconde colonne vertébrale ou par les dactylographes non tactiles qui veulent avoir l'air cool. Pour les non-dactylographes, la ligne d'arrivée n'est tout simplement pas si spéciale et déplacer légèrement la main droite pour atteindre les flèches n'est pas un problème du tout.

Ce qui est important à considérer est ce que les gens qui répètent ce mantra proposent d'utiliser à la place.

La plupart du temps, ils insistent pour utiliser hjkl.

Si nous ne tenons pas compte du fait que ces touches ne sont utilisées que parce que le clavier utilisé par l'auteur de vi n'avait pas de touches de direction physiques et que, par conséquent, tout argument contre les touches de direction est simplement une rationalisation, hjkl n'est de toute façon que légèrement supérieur aux flèches. Oui, le seul avantage de l’utilisation de hjkl par-dessus les flèches est que vous évitez ce petit mouvement de la main droite vers et depuis les flèches. Votre appel est de savoir si cet avantage en vaut la peine.

Mais ce mouvement de la main droite n’est pas la raison pour laquelle l’utilisation de seulement les flèches est inefficace. Il est inefficace car ils vous empêchent de vous déplacer caractère par caractère et ligne par ligne alors que la plupart des mouvements nécessaires à l'édition de texte ont une portée beaucoup plus grande.

Marteler la flèche droite 13 fois est inefficace et ennuyeux. Est-il que mieux vaut marteler la touche l 13 fois? Non, c'est tout aussi stupide.

Garder la flèche droite appuyée jusqu'à ce que vous atteigniez votre cible est moins ennuyeux, mais il est source d'erreurs et presque aussi inefficace que 13 coups en raison du ralentissement nécessaire et non déterministe à la fin. Est-il que préférable de maintenir la touche l enfoncée? Non bien sûr que non.

Heureusement, la plupart des boîtes à outils d'interface graphique fournissent des combinaisons telles que Ctrl+Right qui nous permettent de déplacer Word-by-Word ou de passer à EOL, au paragraphe suivant ou à un autre. Ces raccourcis nous aident à naviguer beaucoup plus rapidement et intelligemment qu'avec des flèches simples. Avons-nous la même chose avec hjkl? Non, nous pas. Nous pouvons utiliser un compte, si nous voulons, mais qui veut compter les caractères pour chaque mouvement? Faire 14k à l'aide de relativenumber est bien, mais qu'en est-il des mouvements horizontaux? Pour les grands mouvements, hjkl sont en réalité pires que les modificateurs + les flèches. Et devine quoi? Les gros mouvements sont ce dont nous avons le plus besoin.

Mais nous sommes des bâtards chanceux, notre éditeur préféré a des dizaines de mouvements qui tournent autour des flèches et hjkl: bBeEwW/?*#{}() et ainsi de suite. Ces commandes sont énormément plus puissantes que hjkl et pour la plupart beaucoup plus logiques et intuitives si vous êtes habitué à Ctrl+Right et à vos amis.

Passer de <Right><Right><Right><Right><Right><Right><Right><Right><Right> à lllllllll ou même 9l est ridiculement inutile.

Passer de <Right><Right><Right><Right><Right><Right><Right><Right><Right> à <C-Right> est nettement préférable. À partir de là, passer à w est à la fois facile et rapide. Pas besoin de <nop> vos flèches!

Si ces commandes sont plus utiles, plus puissantes et plus intuitives que hjkl, pourquoi tant de blogueurs et commentateurs insistent-ils pour remplacer les flèches par hjkl?

J'ai. Aucune idée.

En conclusion, hjkl ont leur place dans notre ceinture d’outils car nous devons toujours nous déplacer de 2 caractères ou lignes mais ce sont le plus souvent l’arbre qui cache la forêt. Méfiez-vous des personnes qui prêchent contre les flèches: ce qu'elles vous réservent peut ne pas être meilleur du tout.

54
romainl

D'autres ont expliqué pourquoi d'autres moyens de déplacer le curseur sont préférés, mais peu de choses ont été dites pour répondre à la question. Pourquoi est-il considéré comme une mauvaise idée d'utiliser les touches fléchées?

Je pense que la raison principale (et @Squeezy y a fait allusion) est qu’à l’époque des terminaux comme le VT100, les touches produisaient une séquence d’échappement interprétée par le programme en cours. (Étant donné que les touches de direction ne sont pas représentées en ASCII, leur saisie doit être communiquée de manière "spéciale".) La séquence d'échappement était généralement semblable à

ESC [ A

en fonction des propriétés de votre terminal, de votre connexion et de votre mode de curseur . Si votre shell ou votre programme n'était pas configuré correctement pour le terminal, ils ne comprendraient pas la séquence d'échappement comme une touche fléchée.

Quand j'étais au collège, en me connectant à Ultrix via des terminaux VT100, si j'appuyais sur une flèche alors que j'étais en mode insertion, la ESC serait interprétée comme "sortir du mode insertion", puis les [ A suivants seraient interprétés comme normaux. commandes de mode. Évidemment pas ce que l'utilisateur veut ou attend!

De nos jours, la gestion des terminaux et des touches fléchées semble être plus robuste, en particulier dans les environnements d'interface graphique. Mais les mêmes problèmes surviennent toujours lorsque vim over SSH ou Telnet est utilisé.

17
LarsH

L'utilisation des touches fléchées est mal vue car cela vous oblige à déplacer vos doigts du point de départ lorsque vous utilisez la disposition QWERTY et du pavé de caractères (?) Lors de l'utilisation de Dvorak ou de toute autre disposition.

14
pdoherty926

Les touches fléchées présentent un problème - il était déjà connu dans vi - sur les connexions lentes, comme sur un modem à 1200 bauds. La flèche traduit une séquence ESC telle que ESC a. Maintenant, quand le temps entre ESC et a devient trop long, vous finissez par entendre un BEL (ou voir un flash) suivi du mode append. Cela n'apparaîtra pas avec les touches hjkl.

10
ott--
  • les touches fléchées risquent de ne pas bien fonctionner dans certains environnements. hjkl sont des caractères normaux bien compris par tous les types de terminaux.
  • Vous ne déplacez pas le curseur dans Mode Insertion (sauf pour Backspace et correction d’une faute de frappe), l’idée de vi est de saisir Insérer mode uniquement pour entrer quelque chose. Le mouvement se fait en Mode normal
  • Si vous le pouvez, évitez d'utiliser hjkl pour vous déplacer le cas échéant, et utilisez-les uniquement pour les instructions. Il existe de nombreuses options pour se déplacer dans vi , voir: http://vim.wikia.com/wiki/Moving_around
5
Squeezy

Concernant la deuxième question:

[I] Si vous n'utilisez pas les touches de direction, comment pouvez-vous déplacer le curseur en mode Insertion?

De même, le concept de "mode" n'existe pas pour celui qui est maître et qui dédaigne les touches fléchées.

Le maître ajoute un nouveau texte en utilisant non pas un mode insertion, mais une insertion ou un remplacement complet commandes qui commencent par un code opération tel que i, o ou cw suivi d'un texte de charge utile et terminé par ESC. Les commandes ayant une syntaxe, la machine parcourt les états en acceptant la syntaxe des commandes, mais dans le modèle de l'éditeur maître, ceux-ci ne donnent pas lieu à un mode. Ce que les apprentis appellent naïvement «mode», c’est au maître un état de commande inachevé, une situation extrêmement odieuse que le maître évite.

Chaque fois que le maître réalise, alors qu’il est au milieu d’une commande d’insertion ou de remplacement, ce texte doit être inséré ou supprimé à la position de caractère suivante indiquée par le curseur, le maître termine la commande d’insertion et libère l’une des dizaines de les commandes de mouvement (recourir à la modeste hjkl si un moyen plus puissant n'est pas évidemment applicable).

De plus, comme le maître est rarement distrait de manière à laisser une commande inachevée, il ne fait que rarement, voire jamais, émettre un bip de la part de l'éditeur en raison de la saisie d'une ESC superflue "au cas où".

(Cependant, lorsque le réseau est en retard ou que la machine est embourbée, le maître martèle la clé ESC furieusement et de manière répétée, comme tout le monde.)

5
Kaz

si vous n'utilisez pas les touches de direction, comment pouvez-vous déplacer le curseur en mode Insertion?

La principale raison pour laquelle je décourage les gens d'utiliser les touches fléchées est explicitement car cela vous permet de vous déplacer en mode insertion.

L'un des problèmes les plus étranges rencontrés lors de l'apprentissage de vim par les nouveaux arrivants est que la commande d'annulation de vim annule la dernière opération action et non la dernière frappe de touche . Beaucoup de mes amis restent en mode insertion tout le temps car il n'y a jamais de raison de le quitter. Quand ils me demandent "Comment puis-je annuler?" Je réponds avec "frappe la lettre du mode commande", ils sont frustrés quand vim efface tout le fichier.

"Vim est un éditeur de texte assez inutile s'il ne parvient pas à annuler les choses."

Il est difficile d'utiliser un outil avant d'avoir appris comment.

Vim ne devient utile qu'après avoir appris à l'utiliser. Le pouvoir de vim réside dans la manière dont vous pouvez lui dire de "refaire cette chose" ou de "défaire cette chose" ou de "ne faire cette chose que lorsque je frappe cette touche de raccourci macro" par le biais de la mémoire musculaire subconsciente. Si "cette chose" devient "tapez tout le fichier du début à la fin", je suis d'accord, vim n'est pas du tout utile.

C'est pour cette raison que vous ne devriez entrer du texte que lorsque vous êtes dans insert mode. Éviter les touches fléchées n’est qu’un des moyens que nous avons trouvé pour vous aider à devenir un meilleur utilisateur de vim, plus rapidement.

3
Conrad.Dean

Oui, pour beaucoup des raisons mentionnées ci-dessus, vi a été écrit à l'origine pour utiliser hjkl, mais " never " est une assez grosse déclaration.

J'ai tendance à modifier vim (et les autres outils que j'utilise) pour se comporter comme je le souhaite. Cela fonctionne très bien sur ma machine, mais en tant que développeur intégré, je ne peux pas toujours choisir ce qui se trouve sur les machines que je supporte. Je rencontre des machines plus anciennes qui ne disposent que de hjkl navigation dans vi à l'occasion. Je finis par obtenir les codes de contrôle insérés dans mon fichier pendant une seconde ou deux jusqu'à ce que je ressaisisse mon habitude et que je passe à hjkl.

La seule raison valable pour laquelle je peux proposer de "ne jamais utiliser les touches de direction dans Vim!" Cela vous permet d’utiliser des machines qui ne peuvent pas gérer les touches fléchées. Cela semble être une raison assez mince pour dire " jamais ".

3
kmort

écrivez simplement la commande suivante avant d'écrire dans vim: -

  1. esc
  2. : set nocp

un problème avec cela est que vous devrez peut-être l'écrire à chaque fois.

0
0decimal0

Voici mes 2 ¢.

Faites ce que vous sentez à l'aise. Si vous utilisez différents éditeurs, il peut être plus facile d’utiliser les touches fléchées pour plus de cohérence.

D'autre part, il est absolument génial que vi (et vim) ne nécessite aucune clé spéciale, sauf peut-être. Vous pourriez probablement pirater une ancienne IBM selectric pour qu'elle fonctionne comme un terminal.

L'autre chose à surveiller est que les touches fléchées peuvent ne pas fonctionner comme prévu. J'ai utilisé des terminaux où ils ne fonctionnaient pas. Je ne sais pas exactement comment elles sont implémentées dans Vim mais je suis à peu près sûr que ce n'est pas uniforme. Ma mémoire inégale semble même rappeler une implémentation dans laquelle elles ont été implémentées en tant que macros vim.

0
David E.

Le nom du jeu avec les éditeurs de texte améliorés semble être "se déplacer rapidement" et réduire les mouvements inutiles/répétitifs. Il y a certains temps perdu lorsque vous passez des touches alphabétiques aux touches fléchées (selon les dimensions du clavier) et que retour à la ligne de base. Mais si vous pouvez accéder à la touche ESC avec votre main gauche ou que vous passez d'un doigt à l'autre, le mode de commutation devient un mouvement fluide et, au cours d'une session de montage, il y aura un gain de vitesse.

Et c’est la clé de la deuxième partie de votre question: sortez du mode insertion en appuyant sur ESC avec votre gauche et déplacez-vous avec hjkl avec votre droite. Finalement, vous pourrez le faire sans perdre de temps.

Cela étant dit, je n’ai jamais obtenu quelque chose avec Vim avant d’essayer certaines des choses mentionnées ici , le plus important étant la section " Efficace: mappages de raccourcis "

0
Vijay Edwin

Exécuter vim tout en étant inséré dans mon appareil Android, qui exécute un démon ssh sous kbox, m'a amené à sortir de ma zone de confort. Étant donné qu'Anroid Terminal Emulator sur l'appareil utilise des boutons de volume pour remplacer les combinaisons spéciales (touches Ctrl + peu importe), certaines touches que j'utiliserais normalement sur le clavier ne fonctionnent pas dans cette situation.

Par exemple, la touche Insérer ne fonctionnant pas dans cet environnement, j'utilise donc I pour passer en mode insertion. La touche Echap, que j'utilise habituellement pour sortir du mode insertion, ne fonctionne pas non plus. J'utilise donc ctrl + [ pour sortir à la place. Les touches Home et End ne fonctionnent pas comme je suis habitué. Au lieu de cela, je me fie aux raccourcis 0 et $ qui ne me dérangeaient jamais auparavant pour atteindre le début ou la fin d'une ligne.

Quoi qu'il en soit, les touches fléchées fonctionnent toujours comme d'habitude dans ma situation, mais il est bon de savoir que les raccourcis clavier minimalistes sont là.

0
iyrin