Door een reeks bestanden navigeren in Vim

Bij het wijzigen van code vind ik dat ik vaak tientallen bestanden moet doorlopen om de eenvoudigste dingen te veranderen. Laten we zeggen dat ik bijvoorbeeld een functie pretty_print heb en deze verander om overeen te komen met camel case prettyPrint . Nu wil ik de bestanden apple1.js doorlopen naar apple99.js , en mogelijk een paar orange.js bestanden daarin. Is er een snelle manier om dit in Vim te doen?

LET OP: dit is niet iets dat ik kan automatiseren, ik moet eigenlijk zelf de code invoeren en wijzigen.

I know I can do :b , but, although it supports name completion/pattern matching, I don't think the pattern is carried over.

Bijvoorbeeld, als ik dat doe

:b apple*.js

en ik klik op het tabblad, ik haal het

:b apple1.js

maar als ik die functie opnieuw bezoek (door op : + upArrow of q: ) te drukken, dan zal ik als ik op het tabblad ga niet naar

:b apple2.js

Wat ik wil is om iets als te specificeren

:b apple*.js

bewerk het bestand, en wanneer ik : w typ, gaat het naar de volgende buffer. Ik blijf liever in Vim, ik wil niet naar buiten komen, typ vim apple * .js , ga terug naar Vim en gebruik vervolgens de opdracht : x . Ik weet dat dit werkt, maar ik heb nog steeds alle andere bestanden nodig voor het geval ik wil, bijvoorbeeld tussen tags springen.

3

3 antwoord

begin met dit:

:set hidden "required because `argdo` won't load next argument into current window
            "if there is a modified buffer displayed inside this window
:args apple*.js
:argdo %s/\/prettyPrint/g
:rewind " if you want to proofread all files then use :next and :prev
:wa

Je kunt je bestanden beter versieren en na zo'n verandering een diff doen.

1
toegevoegd

Werkt de BufSel -functie van Wikia aan jouw behoeften?

Als u liever de buffer in de lijst van selecteert   gedeeltelijke overeenkomsten de volgende functie kan worden gebruikt. Het zal naar springen   de overeenkomende buffer als slechts één overeenkomst wordt gevonden, of als er veel overeenkomsten zijn   komt overeen met een lijst met de overeenkomende buffers in de   opdrachtregelgebied en u kunt een van de overeenkomende buffers selecteren   op buffernummer.

function! BufSel(pattern)
  let bufcount = bufnr("$")
  let currbufnr = 1
  let nummatches = 0
  let firstmatchingbufnr = 0
  while currbufnr <= bufcount
    if(bufexists(currbufnr))
      let currbufname = bufname(currbufnr)
      if(match(currbufname, a:pattern) > -1)
        echo currbufnr . ": ". bufname(currbufnr)
        let nummatches += 1
        let firstmatchingbufnr = currbufnr
      endif
    endif
    let currbufnr = currbufnr + 1
  endwhile
  if(nummatches == 1)
    execute ":buffer ". firstmatchingbufnr
  elseif(nummatches > 1)
    let desiredbufnr = input("Enter buffer number: ")
    if(strlen(desiredbufnr) != 0)
      execute ":buffer ". desiredbufnr
    endif
  else
    echo "No matching buffers"
  endif
endfunction

"Bind the BufSel() function to a user-command
command! -nargs=1 Bs :call BufSel("")
1
toegevoegd
Ik heb BufSel daadwerkelijk geïnstalleerd en in eerste instantie gebruikt, maar toen gaf ik op, ik vraag me af of het doet wat ik hier wil. In elk geval was het niet echt een verbetering ten opzichte van : b en het bleek zo veel eenvoudiger om vim te sluiten en herstart het alleen met de bestanden die ik wilde bewerken.
toegevoegd de auteur puk, de bron

Probably the most suitable solution for you in this case would be to use the grep capabilities integrated in Vim. The following command performs a search for the pattern \ in files matching the wildcard apple*.js, and stores locations of the pattern's occurrences in the quickfix list allowing to easily jump through all the matches.

:vimgrep /\/ apple*.js

Voor meer gedetailleerde introductie in de quickfix-lijst met betrekking tot zoeken in bestanden, zie mijn antwoord op de vraag " Een reeks verkregen bestanden laden via cmd-exec in Vim-buffers ".

Als u eenvoudigweg een lijst met bestanden wilt openen die overeenkomen met een bepaald bestand jokerteken, laadt de namen van de bestanden in de lijst met argumenten

:args apple*.js

en ga dan zoals gebruikelijk heen en weer tussen hen met behulp van : n en : N .

1
toegevoegd