Vim: Se déplacer en utilisant un nombre relatif et l'ajouter à la liste de sauts pour l'utiliser avec CTRL-O

2

J'ai activé le nombre et je navigue souvent vers une ligne spécifique en appuyant sur 25k ou 7j, etc. Le problème est qu'après avoir changé la ligne, je me trouve souvent dans l'obligation de revenir à l'endroit où j'étais avant de déménager. J'appuie donc sur CTRL-O mais cela échoue car les mouvements j / k ne sont pas ajoutés à l'historique des mouvements. Au lieu de cela, il me semble que je reviens deux fois en arrière.

L'idéal serait que Vim soit ajouté à l'historique des déplacements chaque fois que j'effectue une opération aj / k avec un multiplicateur. Est-ce que quelque chose comme ça est possible?

Steve Vermeulen
la source

Réponses:

2

Voici un mapping pour j/ kqui réalise ceci:

:nnoremap <silent> k :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'k'<CR>
:nnoremap <silent> j :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'j'<CR>

Crédit: J'ai d'abord vu cela ici .

Ingo Karkat
la source
1

Je ne crois pas que Vim fournisse un moyen d'ajouter des motions à la liste des sauts, mais si vous voulez vraiment pouvoir revenir en arrière ''et traiter les mouvements un peu comme des sauts, vous pouvez faire quelque chose comme ça:

function! MarkJ()
    mark '
    return "j"
endfunction

nnoremap <expr> j MarkJ()

MarkJ()définit manuellement la 'marque, en ajoutant cette ligne à la liste des sauts (toujours à la colonne 0), puis retourne jau mappage. Malheureusement, vous devriez faire la même chose pour chaque motion.

Je ne peux imaginer aucun moyen de limiter facilement cela aux mouvements avec multiplicateurs, mais suivant l' getchar()exemple ci-dessous :help map-expr, il serait théoriquement possible de définir un ensemble de fonctions et de mappages qui n'appelleraient que MarkX()si le mouvement suit un multiplicateur. C’est cependant assez artificiel et pourrait devenir assez coûteux pour réduire les performances.

Nikita Kouevda
la source