Après avoir copié une sélection visuelle sur le clavier, revenez à l'emplacement d'origine

18

Mon curseur se trouve au milieu d'un paragraphe lorsque je décide que je dois soudainement copier ce paragraphe:

début

Je tape donc vippour sélectionner visuellement le paragraphe:

choisi

Maintenant, je clique cmd+Cpour copier dans le presse-papiers (cela peut varier sur votre système, mais ne devrait pas être pertinent pour la question centrale de mon message), ce qui laisse mon curseur au début du paragraphe:

final

plutôt que la position souhaitée, qui était là où elle était quand j'ai commencé.

Notez que le même problème se produit lorsque vous tirez la sélection non visuellement avec yip.

Je voudrais que le comportement par défaut soit "revenir à la position d'origine du curseur" après avoir effectué des actions de sélection / copie comme ceci. Existe-t-il une configuration qui rend cela possible?

Jonas
la source
11
Ouais, je trouve ça aussi ennuyeux. J'ai juste tendance à utiliser des marques à cet effet: mm "+yap `m(Notez que vous "+yappuierez sur le presse-papiers de votre système)
fruglemonkey
3
Je trouve très utile d'avoir le curseur placé soit au début, soit à la fin de la zone tirée. Après tout, que puis-je faire maintenant, avec du texte tiré et un curseur à l'intérieur? Cela n'a pas beaucoup de sens de faire un put / paste maintenant. Mais, si je veux le faire plus tard, cela signifie que je pourrais aussi tirer plus tard ... peut-être que ce dont vous avez besoin maintenant est juste une marque.
VanLaser

Réponses:

14

Une solution possible consiste à utiliser des sauts:

Avant de tirer ou de sélectionner visuellement, vous pouvez définir un nouveau saut auquel vous pourrez accéder après le déplacement de votre curseur. Pour ce faire, utilisez m`.

Ensuite, après que votre curseur se soit déplacé à cause de l'utilisation de tir ctrlopour revenir dans la liste de sauts. Vous pouvez également voir la liste des sauts disponibles avec :jumpset naviguer dans cette liste avec ctrloetctrli

Pour résumer votre flux de travail serait:

  • m`
  • yip
  • ctrlo

Comme l'utilisation m` définit une marque, vous pouvez y accéder avec ``au lieu de ctrlo.

Vous pouvez lire :h mark-motionset :h :jumpspour plus d'informations.

statox
la source
J'aime ça. Existe-t-il un moyen de faire en sorte que les guillemets simples se comportent comme un backtick en général, lors d'un saut? le guillemet simple est plus facile à taper, et généralement je veux passer à la position de colonne correcte ainsi qu'à la bonne ligne ...
Jonah
1
@ Jonah, je mappe <leader>'pour être `, ce qui fonctionne très bien pour moi. (J'utilise <space>comme mon chef.)
Numeri dit Réintégrer Monica
@Jonah: Comme l'a dit Numeri, un mappage peut être une bonne solution, sinon si vous voulez vous débarrasser du backtick, vous pouvez y jeter un œil :h 'langmap'. Je ne dis pas que c'est la solution idéale, mais cela pourrait peut-être être intéressant pour vous.
statox
@Johah, j'échange en fait le guillemet simple et le tick arrière en utilisant noremap ' ` noremap ` '... C'est dans mon vimrc et fonctionne très bien
Niko Bellic
10

Vous pouvez éviter de déplacer le curseur avec:

:'{,'}y

Voir :help range, :help mark-motionset :help :y.

romainl
la source
1
Bon à savoir, mais est-ce vraiment ce que vous faites? Il semble que taper les 8 clés, avec deux crochets, rend cela plus difficile que les solutions de marque
Jonah
C'est ce que je ferais si j'étais à votre place. Mais je n'ai aucun problème avec le comportement que vous décrivez, donc je ne le fais pas vraiment.
romainl
2
@Jonah Vous avez toujours la possibilité de créer un mappage. Quelque chose comme :nmap <key> :'{,'}y<CR>ça devrait faire l'affaire.
statox
10

Mon curseur est au milieu d'un paragraphe

Si vous venez de g ;le modifier , la solution la plus simple est de taper qui positionnera votre curseur sur la dernière position de modification.

Et si vous n'avez pas modifié le paragraphe, vous pouvez effectuer une opération de remplacement simple avec le même caractère que vous (par exemple, vous êtes sur h, vous tapez rh) pour déclencher un "événement" d'édition sans réellement modifier quoi que ce soit.

Al.G.
la source
2
+1: J'ai toujours utilisé '., mais il peut être très utile de naviguer entre les derniers changements avec g;et g,.
mMontu
2
Existe-t-il une version g;qui vous amène également à la position de colonne correcte?
Jonah
@Jonah c'est le comportement par défaut. Ça ne marche pas pour toi? Cela m'amène toujours à la bonne position de colonne et de ligne.
Al.G.
4

Le plugin vim-easyclip a un paramètre pour cela:

g:EasyClipPreserveCursorPositionAfterYank- 0 par défaut (c'est-à-dire désactivé). Le comportement par défaut de Vim consiste à positionner le curseur au début du texte tiré, ce qui est cohérent avec les autres mouvements. Cependant, si vous préférez que la position du curseur reste inchangée lorsque vous effectuez des yanks, activez cette option.

C'est un peu trop pour moi d'installer un plugin entier juste pour cette petite fonctionnalité, donc je préfère utiliser les marques selon mon commentaire.

fruglemonkey
la source
0

En étendant la réponse d'Al.G., Nous pouvons aller à l'emplacement requis sans modification. La solution est gi. Nous atteindrons la même position où nous étions en dernier mode d'insertion auparavant.

  • Vous êtes au milieu du paragraphe.
  • passer en mode insertion.
  • passer en mode normal.
  • appuyez sur vip.
  • appuyez sur gi.
  • passer en mode normal. ( ginous laissera insérer le mode)

Si nous voulons aller au début ou à la fin du texte en surbrillance.

 :help v_o 

Lorsque vous tirez sur le texte en surbrillance, vous revenez également au mode normal et vous pouvez ou non conserver la position d'origine du curseur.

  1. Si vous commencez à surligner de la position du curseur la plus élevée à la position la plus basse (du numéro de colonne de ligne inférieur à la ligne de colonne de ligne supérieure), vous conserverez la position d'origine du curseur en appuyant sur y
  2. Le curseur restera à sa position actuelle si la surbrillance commence de la position de curseur inférieure à supérieure.

Revenir à l'emplacement d'origine après avoir tiré:
gv pour obtenir le surlignage précédent.

Vous pouvez maintenant basculer entre l'emplacement d'origine et l'emplacement actuel en mode visuel avec la touche
oou O.

Le numéro de ligne et de colonne de la ligne d'état aidera à connaître la position exacte du curseur.
Documentation:

:help visual-change
vusan
la source
Cela ne fonctionne pas viplorsque le curseur démarre au milieu d'un paragraphe.
Antony
Oh ouais je ne l'ai pas remarqué, pour l'instant je vais modifier ma réponse plutôt que de la supprimer.
vusan
@Antony Maintenant, cela fonctionne également pour vipvérifier ma modification.
vusan