Come posso eseguire una funzione o una macro in una cartella di file?


Risposte:


10

È possibile utilizzare l' -cargomento per eseguire un comando all'avvio, da vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Esempio:

vim -c ':call StripWhitespace()' file1 file2

Per uscire in seguito, aggiungi | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2

1
Vuoi un: argdo, se lo esegui per un paio di file dalla riga di comando
Christian Brabandt

19

Se sei già in Vim, puoi usare i comandi :argdoo :bufdoper eseguire un comando su ogni elemento nell'elenco degli argomenti o nell'elenco dei buffer, rispettivamente.

ad es. per eseguire un :comando su ogni file nell'elenco degli argomenti:

:argdo StripWhitespace

O per invocare una funzione da ogni file nell'elenco buffer:

:bufdo call StripWhitespace()

Oppure per eseguire la macro qsu ogni file nell'elenco degli argomenti:

:argdo normal @q

È quindi possibile salvare tutti i buffer modificati con :wallo salvare tutto ed uscire da Vim con :wqall.

Se si desidera scrivere i file mentre si procede, è possibile aggiungere una chiamata a :update, in questo modo:

:argdo s/foo/bar/ge | update

Ci sono vari modi in cui puoi ottenere i file in Vim in primo luogo, tra cui:

  • Fornisci i parametri alla riga di comando di vim: vim *(questo aggiunge tutti i file all'elenco degli argomenti),
  • Utilizza il :argscomando (che supporta i caratteri jolly e le espressioni backtick) per popolare l'elenco degli argomenti o il :argaddcomando per aggiungere file ad esso,
  • Basta aprire tutti manualmente :e, :Exo un plugin di file-apertura.

1
Mi piace questa risposta perché non richiede di lasciare Vim, che secondo me è troppo costoso (il mio prezioso elenco di buffer!). Ho alcune note: (1) lasciare buffer senza scrivere richiede 'hidden'di essere impostato; (2) il : updatecomando è un leggero miglioramento rispetto al :wfatto che scrive solo se è stata apportata una modifica, quindi :bufdo updateo :argdo updatescriverà tutti i buffer o gli argomenti modificati.
Tommaso,

Buon punto update. Ho pensato di menzionare hiddenquando stavo scrivendo la risposta, ma ho deciso di non farlo perché non volevo complicarla eccessivamente. Riflettendoci però, dovrebbe essere lì dentro. Aggiornerò la risposta per includere entrambi i suggerimenti al momento.
Ricco

@tommcdo Ho appena controllato la documentazione per: wall e scrive solo i buffer modificati, quindi: dopo tutto l'aggiornamento bufdo non è necessario.
Ricco

buona cattura per quanto riguarda :wall, che ha anche il vantaggio di non spostarsi tra i buffer e allontanarti da dove sei partito. Suppongo che :argdo updatesia ancora una storia diversa - forse non vuoi scrivere a buffer che non sono nella tua lista di argomenti.
Tommaso,

@tommcdo Ottimo punto.
Ricco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.