Come aprire più file corrispondenti a un'espressione jolly?


10

Voglio modificare diversi file corrispondenti a un'espressione glob. Ad esempio, per modificare tutti i file di configurazione git nelle directory figlio, posso farlo nella shell:

vim */.git/config

Alla :riga di comando di Vim , mi aspettavo :find */.git/configdi fare qualcosa di simile (ad esempio, aprire tutti i file corrispondenti all'espressione glob), ma invece si lamenta E77: Too many file names.

Esiste il comando Vim o one-liner per aprire più file corrispondenti a un'espressione jolly / glob (che non comporta la scrittura di una funzione)?

Risposte:


8

È possibile utilizzare :args {glob}. Nel tuo globo, **attraverserai ricorsivamente le directory.

Questo popolerà la lista degli argomenti, che è la stessa lista che viene popolata quando avvii Vim con uno o più nomi di file come argomenti.

Una volta popolato il tuo elenco di argomenti, puoi navigare attraverso :nexte :previous. Puoi anche saltare al primo e all'ultimo elemento con i comandi :firste :last.


1
Bello :) in :args */.git/configrealtà popola anche l'elenco dei buffer, quindi :bnextfunziona anche. Ti sembra strano? (Vim 7.4.52 e Neovim)
Justin M. Keyes,

1
Anche un promemoria per gli altri, ]ascorre l' :argselenco se è installato github.com/tpope/vim-unimpaired .
Justin M. Keyes,

Inoltre :argadd file*può fare.
Kenorb,

Per usare i pattern glob ( **), devi aver globstarimpostato, vedi: Abbina tutti i file in tutte le directory nidificate con il globbing della shell .
Kenorb,

@ JustinM.Keyes L'elenco dei buffer è un superset dell'elenco args, quindi è previsto.
Jamessan,

3

Per aprire i file corrispondenti in schede separate ...

:n */.git/config | tab all

Spiegazione: :n ( :next) imposta l'elenco dei file successivi su tutte le corrispondenze. tab allapre tutti i file nell'elenco dei file successivi in ​​nuove schede.

… o …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Spiegazione: In glob(…), lo 0 significa includere tutti i file corrispondenti, anche se altrimenti verrebbero ignorati a causa delle impostazioni suffixeso wildignorecase. 1 indica di restituire un elenco, anziché una stringa. exe "tabe" fè una forma abbreviata di execute "tabedit" fe significa aprire il file specificato dalla variabile fin una nuova scheda.


1
Sembra :n */.git/config | bufferfunziona.
Mateen Ulhaq,

2

Al Vim: riga di comando, mi aspettavo :find */.git/configdi fare qualcosa di simile (ad esempio, aprire tutti i file corrispondenti all'espressione glob), ma invece si lamenta E77: Too many file names.

Non aspettarti nulla prima di leggere la documentazione.

Oltre alla risposta di Tom, puoi utilizzare direttamente :nextcome alternativa a :args.


0

L'apertura dei file vim */.git/configsicuramente dovrebbe funzionare. In caso contrario, dovresti aggiornare Vim a 7.4 (la versione precedente era più difettosa).

In alternativa, prova una delle seguenti (all'interno dell'editor):

:n `find .git/ -name config`
:args `find . -name config`

Non hai letto attentamente la mia domanda. E la risposta accettata già menziona :args.
Justin M. Keyes,

@ JustinM.Keyes Grazie per i tuoi punti. Il carattere jolly dovrebbe funzionare per impostazione predefinita e questa è l'unica risposta che dice che dovrebbe funzionare in 7.4 (dato che avevo esattamente lo stesso errore prima dell'aggiornamento). L'uso argsè solo una soluzione alternativa, ma in più mostra come utilizzare l'espansione della shell all'interno di vim sé nel caso in cui altri utenti desiderino utilizzarlo per soluzioni più complesse, utilizzando find, come questo . Quindi penso che dia un valore aggiunto alla tua domanda. Quindi spero che vada bene per te.
Kenorb,

Non ho mai avuto problemi con vim */foo, e non c'è modo che potesse essere correlato alla versione di Vim, perché è una funzionalità di shell .
Justin M. Keyes,

0

Ovvio, ma non elencato sopra - esempio trova tutti i file sql con la stringa create_table nel loro nome

:args **/*create_table*sql

e controllali

:ls

e apri il primo

:b 1
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.