Dans vim, empêcher le curseur de revenir en arrière lorsque je quitte le mode édition?

9

Dans vim, si j'entre et quitte le mode d'édition sans rien faire, le curseur finit par un caractère à gauche. Et si j'entre et quitte le mode d'ajout, le curseur avance et recule.

Est-il possible de configurer vim pour laisser le signe d'insertion dans ces cas?

Idéalement, je veux juste toujours entrer en mode ajout, mais sans déplacer le curseur lorsque j'entre ou quitte le mode.

(Actuellement, j'utilise généralement le mode insertion car il ne perturbe pas ma position du curseur à l'entrée. C'est-à-dire, sauf lorsque je dois ajouter à la fin de la ligne, auquel cas je jure devant vim de se comporter de manière si archaïque , appuyez sur Echap et entrez en mode ajout.)

RomanSt
la source
1
Les réponses à cette question sont bonnes. Je veux juste souligner que s'ils sont corrects dans leurs hypothèses que vous utilisez i pour passer en mode édition, c'est ce qui provoque le retour en arrière. Si vous utilisez «a» (pas A), cela fonctionnera comme prévu.
johnny
@johnny Je ne pense pas que ce sera le cas. Je suis généralement en mode "normal", je me déplace dans le fichier et tout ça. Lorsque j'ai besoin de faire un montage, je positionne d'abord le curseur, puis j'appuie sur "a", puis je constate que je l'ai mal positionné, car il se déplace vers la droite. Étant donné que je passe 99% de mon temps d'édition dans des éditeurs modernes, il n'y a aucune chance que je me souvienne de positionner un caractère à gauche avant d'appuyer sur "a". C'est pourquoi j'espérais une macro ou quelque chose.
RomanSt
C'est une question d'habitudes. C'est vraiment ennuyeux, mais les premières années seulement. Vous finirez par apprendre à la presse iou asans y penser, et peut - être même s, S, ci", etc. au lieu de la limiter iet a.
Luc Hermitte
1
Je comprends votre frustration mais. Essayez plutôt de penser à ce que vous faites. Demandez-vous s'il y a une meilleure façon de le faire (que d'utiliser Vim comme un éditeur de texte régulier, c'est-à-dire). J'ai trouvé avec Vim qu'il y a toujours une meilleure façon, la façon de faire de Vim. Nous pouvons vous aider mais nous devons savoir ce que vous faites lorsque vous rencontrez des problèmes. Par exemple, passez-vous en mode édition lorsque vous souhaitez supprimer quelque chose? Non, il y a 'x' pour supprimer les caractères. Vous voulez remplacer un personnage, puis il y a «r». Pensez simplement à ce que vous voulez réaliser.
johnny
@johnny Je comprends de quoi vous parlez, mais cela nécessite trop de réapprentissage pour avoir du sens pour moi. Je passe 99% de mon temps d'édition dans Visual Studio et j'adore ça. Je sais juste que je ne réapprendrai pas cela, donc inutile de perdre du temps.
RomanSt

Réponses:

9

Cette question est fréquemment posée parmi les nouveaux utilisateurs de vi / Vim, et la réponse est qu'en mode normal, le curseur est toujours "sur" un caractère, mais en mode insertion, le curseur est toujours "entre" deux caractères (rappelez-vous, la fin -of-line est un caractère). Vous ne pouvez pas vraiment voir cela illustré aussi dans la console Vim, mais dans l'interface graphique, vous remarquerez que le curseur devient une barre entre deux caractères lorsque vous entrez en mode insertion, au lieu d'un bloc sur un caractère lorsque vous êtes en mode normal.

Donc, ce que vous voyez n'est pas nécessairement le curseur qui recule d'un caractère lorsque vous quittez le mode d'insertion, mais se déplace simplement sur un personnage. La seule direction de mouvement sûre est vers la gauche (ou vers l'arrière). Ainsi, vous avez plus d'une façon d'entrer en mode d'insertion:

  • "a" passe en mode d'insertion avec le curseur "entre" le caractère sur lequel se trouvait le curseur et le caractère suivant à droite.
  • "i" passe en mode d'insertion avec le curseur "entre" le caractère sur lequel se trouvait le curseur et le caractère précédent à gauche.

Certaines personnes ont fait des efforts pour supprimer ce «mouvement» qu'elles n'aiment pas, mais cela interfère inévitablement avec les plugins et autres scripts Vim qu'ils souhaitent exécuter à l'avenir.

Ma suggestion est de s'habituer à utiliser les commandes "a" et "i" (et "A" et "I") dans les circonstances appropriées.

Les commandes "o" et "O" sont également utiles à apprendre. Voir:

:help a
:help i
:help A
:help I
:help o
:help O

Modifier: si vous êtes toujours déterminé à changer ce comportement, essayez cette astuce: Empêcher échapper de déplacer le curseur d'un caractère vers la gauche

Heptite
la source
1
Je comprends ce que vous dites, mais "i" / "Esc" / "i" / "Esc" provoque un mouvement net global réel du curseur. Je pense vraiment que VIM n'est tout simplement pas pour moi.
RomanSt
2
@romkyns: Je pense que ce que vous devez faire est d'utiliser à la aplace de i.
pause jusqu'à nouvel ordre.
1
@Dennis a accepté, "a" est un peu mieux car il permet au curseur d'être avant le premier caractère et après le dernier caractère d'une ligne - ce que "i" interdit arbitrairement. Mais j'ai essayé ça; ce qui se passe, c'est que je perds toujours le curseur avant d'appuyer sur "a" - je dois donc déplacer immédiatement le curseur d'une position vers la gauche. A chaque fois. C'était fatigant, alors je suis passé à "i".
RomanSt
@Heptite Pourriez-vous peut-être m'indiquer une telle mise en œuvre défectueuse de quelque chose qui supprime le mouvement? Les chances que je veuille utiliser des plugins ou d'autres scripts à l'avenir sont essentiellement nulles.
RomanSt
1
@romkyns, cela (ne fonctionne pas) dans les deux sens. Le remappage <esc>empêchera en effet la plupart des plugins <esc>de fonctionner correctement, mais aussi, il continuera de vous ennuyer lorsque vous utiliserez d'autres fonctionnalités standard qui reviennent au mode normal de la même manière <esc>. Apprendre à utiliser la bonne touche à la volée est la solution qui évolue / fonctionne à long terme.
Luc Hermitte
1

Je pense que par carat, vous entendez votre curseur et si vous utilisez "i" cela insérera directement où se trouve votre curseur, "a" (que je crois que vous recherchez) déplace le curseur d'un caractère vers la droite. En outre, shift-i (I) ira au début de la ligne et shift-a (A) ira jusqu'à la fin de la ligne.

Si j'ai mal compris votre question, je m'en excuse.

Dan M.
la source
1

Étant donné que le remappage <ESC>est considéré comme `` risqué '', je combine simplement avec l'une des approches de la touche Éviter l'évasion et j'ai les éléments suivants dans mon .vimrc:

 inoremap ii <ESC>l

Remarque: assurez-vous qu'il n'y a pas de caractère espace à la fin de la ligne.

Simple, mais entièrement certifié comme "fonctionne bien pour moi" car c'est exactement ce que je devrais autrement taper à la main.

Que j'utilise aou ique le comportement recule toujours et que cela me dérange le plus souvent, la prochaine chose que je veux taper est d$de supprimer jusqu'à la fin d'une ligne, etc.

atomicules
la source
Solution incroyablement simple. Le mieux que j'ai rencontré.
Tyler Collier
1

Voici ma solution:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

C'est marrant. Cette même question existe sur les trois sites: SO, SU, Unix + Linux.

Steven Lu
la source
Je ne trouve pas ça drôle :) Heureusement, j'ai trouvé un éditeur qui ne me rend pas fou (diakonos), donc ce n'est plus un problème. Pourtant, a voté pour ceux qui aiment vim.
RomanSt