Comment puis-je utiliser des repères pour accéder à des emplacements dans des fichiers que j'ai récemment ouverts, mais qui n'ont pas été modifiés?

11

Souvent, je modifie un fichier - je pense que mon travail est terminé - puis je ferme le fichier et je passe à la chose suivante. Mais je me rends compte que je dois revenir à ce code et le modifier un peu plus.
Si j'ouvre à nouveau le fichier, je peux utiliser la .marque et sauter à la position de la dernière modification avec '..
Maintenant, j'essaie de trouver un moyen d'utiliser les marques de vim pour accéder à des emplacements dans des fichiers que j'ai récemment visités, mais qui n'ont pas changé.
Je sais que je peux définir une marque manuellement, mais la plupart du temps, je ne m'attends pas à revenir et je ne fixe donc pas de marque et je dois utiliser une marque générée automatiquement par vim.
La "marque semble que cela pourrait être un moyen d'y parvenir, à partir de :h motion.

" À la position du curseur lors de la dernière sortie du tampon actuel. Par défaut, le premier caractère de la première ligne. Voir | saut de dernière position | pour savoir comment l'utiliser pour chaque fichier ouvert. Une seule position est mémorisée par tampon, pas une pour chaque fenêtre. Tant que le tampon est visible dans une fenêtre, la position ne sera pas modifiée. {pas à Vi}.

Mais si je

  • ferme toutes les fenêtres affichant un tampon (mais le tampon est toujours présent dans la liste des tampons). ou:
  • tuer toutes les instances du tampon

la marque ne semble pas se mettre à jour, comment puis-je utiliser une marque pour sauter à un emplacement de la dernière position du curseur dans le tampon / fichier?

the_velour_fog
la source
2
Je pense que vous cherchez Ctrl+oet Ctrl+i... :h jump-motionspour plus d'infos
Sundeep
@spasic ce n'est pas une mauvaise suggestion, mais une fois que vous avez fait quelques dizaines de sauts, la position serait perdue dans une liste de sauts massive. En délimitant les marques dans le tampon, vous avez une liste plus petite de marques / emplacements à gérer
the_velour_fog
Si vous ne l'avez pas déjà lu, je pense que cette astuce serait intéressante. Vous devrez peut-être modifier votreviminfo
statox
@statox merci. J'ai vu cela et la pointe dans l'aide de vim. Je pense que ces solutions provoquent un saut automatique à la "marque lorsque vous ouvrez un fichier. Je voulais vraiment sauter uniquement à la dernière position du curseur manuellement. De plus, je ne pouvais tout simplement pas comprendre quand la "marque est définie et mise à jour, donc pour moi, la "marque est inutilisable.
the_velour_fog

Réponses:

6

Voici une solution classique: utiliser

`H

pour passer au dernier fichier HTML et ainsi de suite…

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END
romainl
la source
2
merci, cela semble vraiment utile. Je l'ai chargé dans mon vimrc pour l'essayer. Je suis passé à autocmd WinLeavecar j'ai remarqué BufLeavequ'il ne semble pas se déclencher lorsque vous fermez un fractionnement et que le tampon est toujours ouvert ailleurs. Je sais que c'est un peu un cas de bord, mais WinLeavesemble fonctionner sur un plus large éventail de situations de type "fermeture de fichier", mais je suis encore en train de tester ...
the_velour_fog
3

J'ai écrit cette déclaration vimscript qui semble fonctionner

autocmd BufLeave * :normal ml

Explication

  • BufLeave commande automatique: cela semble se déclencher lorsque vous
    • passer à une autre fenêtre
    • lorsque vous fermez la dernière fenêtre affichant le tampon
    • lorsque vous fermez le tampon lui-même avec bd
  • :normal- il semble que par défaut, la commandpartie de autocmd est une commande ex. Donc, pour dire à vim d'exécuter une commande en mode normal, vous devez ajouter:normal
  • ml- mettre une marque l(mnémonique: dernier )

Usage

pour rappeler la position du curseur de la dernière fois que vous étiez dans le tampon, appuyez simplement sur

'l

ou

`l
the_velour_fog
la source
0

Si vous souhaitez que votre curseur rétablisse la dernière position connue de viminfo , vous pouvez utiliser

autocmd BufReadPost * call setpos(".", getpos("'\""))

La réponse de romainl m'a été particulièrement utile, et je l'utilise beaucoup (depuis que je suis développeur web):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

La dernière chose potentiellement utile est l'option :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
dylnmc
la source