Existe-t-il un moyen de faire des allers-retours fiables dans l'historique des fichiers

15

Je voudrais aller au fichier que je viens de modifier en dernier et au prochain type de plugins MRU.

:bnextet :bprevfonctionne parfois, mais le plus souvent je me retrouve juste dans un fichier obscur dont je ne me souviens pas avoir été édité et obligé de retomber sur le plugin MRU.

Y a-t-il un moyen de le réparer?

Ctrl-^permute entre les deux derniers fichiers. Quelle est la meilleure façon de naviguer entre plusieurs?

Je comprends que cela pourrait être délicat, mais je suis d'accord avec tout ce qui peut améliorer le :bn :bpcomportement actuel . Les tampons que je vois souvent sont totalement hors de propos. Peut-être existe-t-il un plugin qui peut garder une trace des fichiers récents et fournir des crochets pour que je puisse créer des mappages?

Répondre aux commentaires a un peu éclairé mes pensées. Je crois que ce que je veux, c'est pouvoir parcourir les fichiers dans l'ordre des dernières sauvegardes. De cette façon, si je retourne dans l'historique, l'ordre ne changera pas tant que je n'aurai pas enregistré le fichier qui deviendra le dernier et que je ferai un pas "en arrière" vers le fichier enregistré juste avant cela, c'est-à-dire celui à partir duquel je suis parti.

Quelque chose comme une Ctrl-O Ctrl-Ipaire qui change de fichiers immédiatement sans sauter dans le tampon actuel. Un peu comme uet Udans netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|
firedev
la source
Par «le fichier que je viens de modifier en dernier», voulez-vous dire littéralement «le fichier sur lequel j'ai effectué les dernières modifications»? Ou voulez-vous simplement dire le dernier que vous aviez vu dans Vim?
Rich
2
Si ce dernier, personnellement, je écrase Ctrl-O(ou parfois Ctrl-T) jusqu'à ce que j'arrive.
Rich
Oui c'est ce que je fais aussi Ctrl-Oet Ctrl-I. Mais cela saute entre les points d'édition et cela brise le flux. Tout ce que je veux aller et venir entre les tampons dans l'ordre d'accès. Comment les plugins affichent une liste des fichiers les plus récents? Les gardent-ils en interne?
firedev
Ctrl-^permute entre les deux derniers fichiers. Mais quelle est la meilleure façon de naviguer entre plusieurs?
firedev
Par accès, il n'est toujours pas clair si vous voulez dire l'ordre dans lequel ils ont été ouverts, écrits, dans une fenêtre ciblée ou modifiés. Ctrl-O/Isont des fwiw spécifiques aux fenêtres, tandis que MRU est généralement global. Si vous voulez commander par le dernier accès, dès que vous sautez en arrière une fois, l'ordre de la liste change, ce qui complique encore les choses.
Matt Boehm

Réponses:

7

J'ai écrit une petite fonction pour frapper CTRL-O à plusieurs reprises pour moi, jusqu'à ce que le tampon change.

Vous pouvez le trouver ici . Je l'ai mappé à CTRL-U mais vous pouvez remplacer CTRL-O si vous le souhaitez.

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

Vous pourriez probablement écrire quelque chose de similaire pour <C-I>.

Problèmes:

  • S'il n'y a pas de tampon précédent, il continuera en boucle silencieusement jusqu'à ce que vous appuyiez sur CTRL-C!

En relation:

  • :jumps répertorie les emplacements historiques que CTRL-O va parcourir.
  • Le CTRL-T par défaut de Vim est une bonne alternative à la purée du CTRL-O, car il est plus grossier: il ne recule que par sauts d'étiquette.
joeytwiddle
la source
Vim semble n'offrir qu'un seul niveau d'historique de fichier MRU, exposé sur CTRL- ^. Cependant, j'ai remarqué lors de l'utilisation :kwbdpour fermer quelques tampons, que Vim revient aux tampons précédents dans l'ordre inverse de l'historique attendu. Peut-être que Vim a une liste MRU qu'il ne partage pas avec nous, ou peut-être qu'il choisit le tampon vers lequel se baser en fonction de l'historique de l'emplacement CTRL-O ( :jumps).
joeytwiddle
1
Sinon, autocmd InsertLeave * normal mZse souviendra du dernier fichier édité dans la marque globale Z . Vous pouvez y revenir avec g'Z. // Oui, nmap <C-y> g'Zmais j'ai toujours tendance à utiliser Ctrl-U plus souvent.
joeytwiddle
6

Vous pouvez utiliser :lspour afficher tous les tampons. Par exemple:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

Pour revenir au tampon ext.markdown, utilisez :e +Nbuf, où Nest le numéro de tampon de la première colonne. Par exemple: :e +2buf.

Vous pouvez créer une fonction simple pour une expérience plus interactive:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

Après avoir utilisé :ChooseBufou <Leader>bvous pouvez simplement taper le numéro du tampon que vous souhaitez modifier.

Ce n'est pas tout à fait "le plus récemment utilisé", car la commande est "le plus récemment ouvert" (c'est probablement aussi pourquoi :bnext/ :bprevne fonctionne pas comme prévu).

Martin Tournoij
la source
4

<C-6>est ce dont vous avez besoin, qui vous ramène au tampon précédent que vous aviez ouvert avant celui en cours. Il y a aussi :bprev& :bnextque vous pourriez utiliser pour la même chose.

Dhruva Sagar
la source
<C-6>n'est pas mauvais mais je ne peux pas l'utiliser pour reculer de deux tampons. bprevet bnextne sont pas dans l'ordre des sauts.
Praxeolitic
Oui, je ne pense pas qu'il y ait une bonne manière native d'approfondir l'histoire. Vous devez utiliser un plugin MRU, même CtrlP en a un, il doit y en avoir d'autres
Dhruva Sagar
2
Remarque: ce n'est pas <C-6>le cas <C-^>. Alors que sur de nombreux émulateurs de terminaux, il n'y a pas de distinction, sur certains (y compris celui fourni avec OS X), il y en a. Pour ce dernier cas, l'utilisation de la Shiftclé est requise (en supposant la disposition Qwerty).
tommcdo
@tommcdo intéressant, je suis sur osx, mais utilisez iterm au lieu de terminal.app, cela fonctionne de la même manière pour moi. Exiger la touche Maj enfoncée serait une déception.
Dhruva Sagar
À bien y penser, il se pourrait que mon système d'exploitation saisisse cette liaison de clé et ne la propage pas à Vim. Mon OS doit être arrêté!
tommcdo
2

Vous pouvez également utiliser :oldfilespour obtenir une liste des fichiers que vous avez modifiés.

La liste aura des numéros associés aux noms de fichiers. Choisissez un fichier, notez le numéro (disons 14) et ouvrez-le avec:edit #<14

Vous pouvez également exécuter d'autres commandes sur ce fichier ou transmettre plusieurs fichiers à la fois à une commande. En savoir plus ICI

Karolis Koncevičius
la source
1
L' autre réponse dans le lien m'a appris:bro[wse] ol[dfiles][!]
Steve