Como posso abrir várias guias ao mesmo tempo?

14

Se eu usar:

:tabedit file1 file2

Eu recebo:

E172: Only one file name allowed

Existe alguma maneira de usar :tabeditcom vários nomes de arquivos? Ou outra maneira de abrir várias guias ao mesmo tempo?

Martin Tournoij
fonte
@kenorb Sim. E já tem exatamente a mesma resposta aqui, exceto sem nenhuma explicação sobre o que faz. Então, como vincular a ele agrega algum valor?
Martin Tournoij 23/02
Existem outras respostas e novas respostas podem chegar lá. Em segundo lugar, existem poucos outros links / relacionados semelhantes por lá, para que os usuários possam aprender mais com as forças relacionadas.
23415 kenorb
Eu aprendi este one-liner: :args *.c | tab all. A outra pergunta é mais popular que essa, por isso é bom vinculá-la também.
kenorb
Relacionado: Abra vários arquivos em novas guias com o VIM no Stack Overflow.
Mihai Capotă 26/03

Respostas:

10

Dados os problemas e a complexidade da minha outra resposta, usando o modo "interno", modificando a lista de argumentos, eu adicionei pela própria função pequena para fazer isso:

" 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>])

Agora você pode usar :Tabedit *.vim. Essa função expandirá todos os padrões de globbing e será executada :tabedit <f>para cada arquivo. Você pode adicionar quantos nomes de caminho quiser, por exemplo, tudo isso funciona:

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

Bem, e assim por diante ...

Eu coloquei isso em um pouco globedit.vim plugin, que também contém comandos para :Edit, :Split, etc.

Martin Tournoij
fonte
2
Ótima função e comando! Algumas melhorias: (1) Use em [<f-args>]vez de "<args>"- dessa forma, o patternparâmetro será uma Lista (matriz) e você não terá que lidar com a divisão manual da string. (2) Passe um diferente de zero como o terceiro argumento glob()para que ele retorne uma lista. Então você pode evitar a divisão manual também. Você vai precisar para passar 0como o segundo argumento para ignorá-lo sem afetar o comportamento: glob(l:p, 0, 1).
Tommcdo
7

Até onde eu sei, a única maneira integrada de fazer isso é:

:args *.vim
:tab all

Primeiro, o :argssubstituirá a lista de argumentos. A lista de argumentos lista os arquivos com os quais você abriu o Vim; isso vim file1 file2significa que a lista de argumentos contém file1e file2.
Podemos modificar isso em tempo de execução, e o Vim abrirá um buffer para cada nova entrada na lista de argumentos.
Veja :help argument-listpara mais informações.

O :allcomando abre uma janela para cada entrada na lista de argumentos, o :tabcomando executa um comando e abre uma nova guia quando o comando fornecido abrir uma nova janela.

Ressalvas

Existem algumas advertências para esse método.

Antes de tudo, não há verificação de duplicatas; portanto, você pode terminar com 2 ou mais guias para o mesmo buffer.

Mas o maior problema é que ele substitui todas as suas guias pelo que está na lista de argumentos; então você perdeu todas as guias existentes.
Você pode contornar um pouco isso usando :argadd *.vimpara adicionar à lista de argumentos, em vez de substituí-lo; mas comandos como :editou :tabeditse não alterar a lista de argumentos, e você vai perder os guias a menos que você adicioná-los à lista de argumentos (você ainda tem-los na lista de buffer, embora). Você também pode não querer abrir tudo na sua lista de argumentos em uma guia, talvez apenas queira abrir 2 arquivos como uma guia adicional.

Talvez você possa tornar isso um pouco melhor adicionando primeiro adicionando todas as guias atualmente abertas à lista de argumentos (que eu realmente não consigo trabalhar), mas isso ainda está longe de ser perfeito. Se uma guia tiver 2 ou mais janelas, ela ainda será modificada ...

Martin Tournoij
fonte
Posso estar errado, mas isso não abre uma guia extra (como visto na minha pergunta sobre como abrir guias por padrão)?
muru
1
Se você está se referindo à minha resposta a essa pergunta, a diferença é que eu usei :argdo tabedit %, o que abre uma nova guia para cada argumento. Começar com uma guia e abrir n novas naturalmente deixaria você com n + 1 guias. :tab allé uma solução muito melhor.
23415 tommcdo
@ tommcdo Eu estava falando da resposta de Josh Petrie . Você não aconteceria com um dos pseudônimos dele, aconteceria? :)
muru
Haha, não. Eu devo ter pensado em uma pergunta diferente!
23415 Tommcdo
2

Você pode usar o :nextcomando, por exemplo:

:n file1 file2

ou:

:n *.txt
kenorb
fonte
Parece que é o mesmo que usar :args *.vim? Pelo menos, ele se comporta o mesmo, e :help next_fdocumentos como sendo o mesmo ...
Martin Tournoij
É mais curto e simples e você não mencionou isso. O comportamento é o mesmo, como você fez na pergunta para isso.
kenorb
2

Na linha de comando, você pode usar:

vim file1 ... filen -p

E se você esqueceu de usar -painda, pode usar

:tab ball

Aliás, não se esqueça que a variável tabpagemax(valor padrão 10) limita quantas guias você pode abrir dessa maneira.

dsueiro
fonte
0

Na verdade, você pode abrir novas guias e manter suas guias atuais sem escrever novas funções (consulte esta resposta no Stack Overflow ):

:args file1 file2 | argdo tabe

Você pode abrir uma nova guia vazia ( :tabe) antes de fazer isso, porque o primeiro arquivo será aberto na guia atual. Além disso, uma guia extra vazia será deixada aberta (veja :help argdopara entender o porquê).

Mihai Capotă
fonte
Você também precisa corrigir o realce da sintaxe (por algum motivo), conforme explicado no link e fechar a última guia, para que o comando 'full' seja: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onVocê precisa pressionar Enter para limpar o prompt e digitar :closepara remover o último ( aba vazia) ... é muita digitação, e só vale a pena se você estiver abrindo muitas abas (para 2 ou 3 arquivos, usar apenas :tabeduas vezes seria mais rápido).
Martin Tournoij 26/03