Comment ouvrir plusieurs onglets à la fois?

14

Si j'utilise:

:tabedit file1 file2

Je reçois:

E172: Only one file name allowed

Existe-t-il un moyen d'utiliser :tabeditavec plusieurs noms de fichiers? Ou une autre façon d'ouvrir plusieurs onglets à la fois?

Martin Tournoij
la source
@kenorb Oui. Et il a déjà exactement la même réponse ici, sauf sans explication sur ce qu'il fait. Alors, comment y créer un lien ajoute-t-il une valeur?
Martin Tournoij
Il y a d'autres réponses, et de nouvelles réponses peuvent y arriver. Deuxièmement, il y a peu d'autres liens / liens similaires là-bas, de sorte que les utilisateurs peuvent également en apprendre davantage sur des onces connexes.
kenorb
Je l' ai appris ce one-liner: :args *.c | tab all. L'autre question est plus populaire que celle-ci, il est donc bon de la lier également.
kenorb
Connexes: Ouvrez plusieurs fichiers dans de nouveaux onglets avec VIM à Stack Overflow.
Mihai Capotă

Réponses:

10

Étant donné les problèmes et la complexité de mon autre réponse en utilisant la méthode "intégrée" en modifiant la liste d'arguments, j'ai ajouté une petite fonction pour le faire:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Vous pouvez maintenant utiliser :Tabedit *.vim. Cette fonction étendra tous les modèles de globbing et s'exécutera :tabedit <f>pour chaque fichier. Vous pouvez ajouter autant de chemins que vous le souhaitez, par exemple tout cela fonctionne:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Eh bien, et ainsi de suite ...

Je mets cela dans un petit globedit.vim plug - in, qui contient également commande pour :Edit, :Splitetc.

Martin Tournoij
la source
2
Grande fonction et commande! Quelques améliorations: (1) Utilisez [<f-args>]au lieu de "<args>"- de cette façon, le patternparamètre sera une liste (tableau) et vous n'aurez pas à gérer le fractionnement manuel de la chaîne. (2) Passez un non-zéro comme troisième argument pour glob()qu'il renvoie une liste. Ensuite, vous pouvez également éviter de vous séparer manuellement. Vous aurez besoin de passer 0comme second argument de l' ignorer sans affecter le comportement: glob(l:p, 0, 1).
tommcdo
7

Pour autant que je sache, la seule façon intégrée de le faire est:

:args *.vim
:tab all

Tout d'abord, le :argsremplacera la liste des arguments. La liste des arguments répertorie les fichiers avec lesquels vous avez ouvert Vim; vim file1 file2signifie donc que la liste d'arguments contient file1et file2.
Nous pouvons le modifier au moment de l'exécution, et Vim ouvrira un tampon pour chaque nouvelle entrée dans la liste des arguments.
Voir :help argument-listpour plus d'informations.

La :allcommande ouvre une fenêtre pour chaque entrée de la liste des arguments, la :tabcommande exécute une commande et ouvre un nouvel onglet lorsque la commande donnée ouvre une nouvelle fenêtre.

Avertissements

Il y a quelques mises en garde à cette méthode.

Tout d'abord, il n'y a pas de vérification des doublons, vous pouvez donc vous retrouver avec 2 onglets ou plus pour le même tampon.

Mais le plus gros problème est qu'il remplace tous vos onglets par ce qui se trouve dans la liste des arguments; vous avez donc perdu tous les onglets existants.
Vous pouvez légèrement contourner cela en utilisant :argadd *.vimpour ajouter à la liste des arguments, au lieu de la remplacer; mais des commandes telles que :editou :tabeditne modifient pas la liste des arguments, et vous perdrez ces onglets à moins que vous ne les ajoutiez à la liste des arguments (vous les avez toujours dans la liste des tampons, cependant). Vous pouvez également ne pas vouloir tout ouvrir dans votre liste d'arguments dans un onglet, peut-être voulez-vous simplement ouvrir 2 fichiers en tant qu'onglet supplémentaire.

Vous pourriez peut-être améliorer légèrement cela en ajoutant d'abord l'ajout de tous les onglets actuellement ouverts à la liste des arguments (que je ne peux pas vraiment travailler), mais cela est encore loin d'être parfait. Si un onglet a 2 fenêtres ou plus, il les modifiera quand même ...

Martin Tournoij
la source
Je peux me tromper, mais cela n'ouvre-t-il pas un onglet supplémentaire (comme vu dans ma question sur l'ouverture des onglets par défaut)?
muru
1
Si vous faites référence à ma réponse à cette question, la différence est que j'ai utilisé :argdo tabedit %, ce qui ouvre un nouvel onglet pour chaque argument. Commencer avec un onglet et en ouvrir n nouveaux vous laisserait naturellement avec n + 1 onglets. :tab allest une bien meilleure solution.
tommcdo
@tommcdo Je parlais de la réponse de Josh Petrie . Vous n'arriveriez pas à l'un de ses pseudonymes, n'est-ce pas? :)
muru
Haha, non. J'ai dû penser à une autre question!
tommcdo
2

Vous pouvez utiliser la :nextcommande à la place, par exemple:

:n file1 file2

ou:

:n *.txt
Kenorb
la source
C'est la même chose que d'utiliser :args *.vim? Au moins, il se comporte de la même manière, et le :help next_fdocumente comme étant le même ...
Martin Tournoij
C'est plus court et simple et vous ne l'avez pas mentionné. Le comportement est le même, comme vous l'avez demandé dans la question.
kenorb
2

Depuis la ligne de commande, vous pouvez utiliser:

vim file1 ... filen -p

Et si vous avez oublié d'utiliser -pencore, vous pouvez utiliser

:tab ball

Btw, n'oubliez pas que la variable tabpagemax(valeur par défaut 10) limite le nombre d'onglets que vous pouvez ouvrir de cette façon.

dsueiro
la source
0

Vous pouvez réellement ouvrir de nouveaux onglets et conserver vos onglets actuels sans écrire de nouvelles fonctions (voir cette réponse sur Stack Overflow ):

:args file1 file2 | argdo tabe

Vous voudrez peut-être ouvrir un nouvel onglet vide ( :tabe) avant de le faire, car le premier fichier s'ouvrira dans l'onglet actuel. De plus, un onglet vide supplémentaire sera laissé ouvert (voir :help argdopour comprendre pourquoi).

Mihai Capotă
la source
Vous devez également corriger la mise en surbrillance de la syntaxe (pour une raison quelconque), comme expliqué dans le lien et fermer le dernier onglet, de sorte que la commande `` complète '' serait: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onla vous devez appuyer sur Entrée pour effacer l'invite et taper :closepour supprimer le dernier ( vide) onglet ... c'est énormément de frappe, et ça ne vaut le coup que si vous ouvrez beaucoup d'onglets (pour 2 ou 3 fichiers, une simple utilisation :tabedeux fois serait plus rapide).
Martin Tournoij