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?



@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

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.


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 ...


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

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.


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ê).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.