Pourquoi le curseur se déplace-t-il au début de la ligne après <Esc>?

12

J'ai remarqué que lors de l'édition le long d'une ligne dans un fichier .txt en mode insertion, le curseur se déplacera au début de la ligne après une écriture utilisant une séquence de touches:

<esc>:w

Je voudrais changer ce comportement de telle sorte que le curseur reste en position après a: write. Est-ce possible? Je n'ai pas besoin que le curseur reste en mode insertion, je voudrais juste qu'il conserve sa dernière position après une écriture.

J'utilise gVim 7.4 sur Windows. Mon .vimrc est très basique, je ne crois pas qu'aucun de mes paramètres interfère avec ce comportement. J'ai également supprimé le sourcing de mswin.vim et example.vim de mon .vimrc (tel que fourni avec le programme d'installation officiel de vim.org pour Windows).

Après avoir lu les commentaires ci-dessous, j'ai réexaminé le problème et j'ai réalisé que le curseur ne glissait qu'à l'extrême gauche après une écriture sur des lignes entièrement constituées d'espaces blancs de fin. En d'autres termes, le curseur ne glisse à l'extrême gauche sur esc-: w que lorsque la ligne est un retrait suspendu sans autre caractère que les espaces . Le .vimrc gère les comportements de retrait avec ces paramètres:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Ainsi, une nouvelle ligne créée sous une ligne en retrait contiendra 4 espaces blancs de fin comme les 4 premiers espaces de la ligne (que je veux conserver). Lorsque vous appuyez sur la touche «esc», le curseur glisse à l'extrême gauche du tampon.

Existe-t-il un moyen de conserver la position du curseur en appuyant sur 'esc' pour revenir au mode normal, sur une ligne composée d'espaces blancs à la fin (comme indentation)?

Jim
la source
3
Je n'ai jamais remarqué ce comportement dans Vim sur n'importe quelle plate-forme ... Que se passe-t-il si vous démarrez gVim comme: gvim -u NONE -U NONE(vous pouvez soit utiliser cmd.exe, soit créer un raccourci)? Cela empêchera le chargement de vos fichiers (g) vimrc.
Martin Tournoij
1
Est-ce votre fichier vimrc complet ? Mon premier soupçon serait qu'un autocmd dans votre fichier vimrc supprime les espaces de fin. Le comportement change-t-il lorsque vous démarrez gVim sans aucun fichier vimrc (voir le commentaire ci-dessus)?
Martin Tournoij
Ce qui précède n'est pas mon .vimrc complet, il y a aussi d'autres paramètres. L'exécution de gVim sans .vimrc (: les noms de script ne montrent aucun .vimrc ou .gvimrc) résout mon problème. Vous avez tout à fait raison, je dois parcourir mon fichier .vimrc ou quelque chose d'autre qui pourrait être à l'origine de cela.
Jim
Apparemment, cette élimination des espaces blancs sur les nouvelles lignes est un comportement souhaitable, je lis ici que cela vise à garder le fichier propre des espaces blancs.
Jim
Il s'agit d'ouvrir de nouvelles lignes ... Pas d'écrire dans un fichier?
Martin Tournoij

Réponses:

11

La consultation de la documentation pour autoindent permet de savoir pourquoi et comment contourner ce problème. :help 'autoindent':

Copiez le retrait de la ligne actuelle lors du démarrage d'une nouvelle ligne (en tapant <CR> en mode Insertion ou lors de l'utilisation de la commande "o" ou "O"). Si vous ne tapez rien sur la nouvelle ligne, sauf <BS>ou CTRL-D, puis tapez <Esc>, CTRL-Oou <CR>, le retrait est à nouveau supprimé. Déplacer le curseur sur une autre ligne a le même effet, sauf si l'indicateur «I» est inclus dans «cpoptions».

En d'autres termes, si vous souhaitez qu'il ne perde pas le retrait, tapez quelque chose , puis retournez-le avant de frapper Esc, et l'espace de tête restera.

Alternativement, si vous voulez simplement être de retour au niveau du retrait lorsque vous revenez en mode insertion et 'cindent'que vous l' utilisez également, utilisez à la Shift-Splace de i, ce qui effacera la ligne (déjà vide) et commencera au niveau de retrait approprié. Ce n'est pas une solution aussi générale que celle ci-dessus, mais je préfère cela lorsque j'écris du code C, de sorte que mes fichiers ne soient pas réellement enregistrés avec des lignes d'espace blanc uniquement.

John O'M.
la source
Ceci est une réponse définitive à ma question de la documentation d'origine. Merci pour le résumé et le récit - je n'aurais pas pensé à regarder: h autoindent pour cette information. Merci également à @Carpetsmoker pour la discussion menant à une solution.
Jim
Cela a résolu un problème impliquant le remappage de o et O pour ne pas quitter le mode d'insertion, mais pour conserver l'indentation. Cela peut être fait en faisant nnoremap o o <BS><Esc><DEL>, etnnoremap O O <BS><Esc><DEL>
Max Coplan
Merci beaucoup!
Max Coplan