Por que os especialistas em Vim preferem buffers em vez de guias?

243

Eu não entendo buffers. Quando abro 3 arquivos na mesma aba e fecho minha janela, geralmente fico aborrecido ao descobrir na próxima vez que abro um desses arquivos que existem arquivos de troca estranhos persistentes e que me transmitem mensagens incômodas. Mas, repetidamente, li que essas coisas são o nirvana da produtividade que estou perdendo e que foram feitas guias para os plebeus usarem.

Por isso, pergunto a você, especialista em Vim: quais são as vantagens de usar buffers sobre guias? Não vejo como a diferença possa ser profundamente diferente, mas me consideraria apenas no nível iniciante-intermediário na operação do Vim. É :ls :b#realmente muito mais rápido do que isso gt? Eu sinto que deve ser mais profundo do que isso.

2c2c
fonte
6
Para aqueles que aprendem o Vim ou vêm para o Vim fortemente influenciados por outros editores baseados em GUI, recomendo primeiro ler a resposta de @Jonathan Brink e, em seguida, voltar à resposta principal aqui.
icc97
1
Não se preocupe muito com isso. Eu uso guias como minha principal forma de navegação entre arquivos. Como você diz, <#> gt é fácil de digitar. Para facilitar ainda mais o uso, eu personalizo meus dados de linha de tabulação para incluir o número da guia. Se eu precisar exibir mais de um buffer por vez, divido uma nova janela na guia. Apesar do que a @romaini afirma, essa maneira de usar o Vim me torna muito produtivo porque se encaixa nas minhas metáforas pessoais. Observe também que em uma carreira de 37 (até agora) anos como programador, ainda não precisei abrir mais de cinco ou seis arquivos de uma só vez - e isso muito raramente. Faça o que for melhor para você. :)
Tony
Faça o que funciona. Algumas pessoas usam muitos arquivos em uma sessão, portanto os buffers são muito mais importantes. Até Bram Moolenaar diz "organize-os como quiser". Ter 20 guias abertas não é o caminho certo, mas as guias para alguns arquivos não são o fim do mundo. A solução da Bram para gerenciar muitos arquivos está abrindo várias sessões de terminal. Ele diz que é assim que ele faz, mas não é assim que todos devem fazê-lo.
craft
A diferença mais óbvia que parece não ser destacada corretamente é que, se você permanecer em uma guia, poderá visualizar vários buffers ao mesmo tempo usando as :split"janelas". Se você tiver todos os seus buffers (arquivos) em guias separadas, não terá essa visualização simultânea. Eu recomendo aprender o vim usando uma guia para começar e se acostumar com as divisões.
23419 NeilG

Respostas:

500

Como o ZyX disse no #vim, essa pergunta soa como "Por que os especialistas em Vim preferem saboroso do que quente?".

Os "especialistas em Vim" não preferem buffers em vez de guias: eles usam buffers como os proxies de arquivos e as guias como os espaços de trabalho. Buffers e guias têm propósitos diferentes, portanto, preferir um ao outro não faz sentido algum.

O problema com buffers e guias é de confusão , causado por uma combinação de fatos independentes.

  1. A maioria dos editores de texto e IDEs "modernos" usa uma metáfora de tabulação para representar arquivos carregados. Essa metáfora atua como um sistema de informação - mostra ao usuário quais arquivos são abertos e seu estado - e como um dispositivo interativo - permite ao usuário manipular (reordenar, selecionar, fechar ...) esses arquivos abertos. Apesar de suas muitas limitações, as guias estão em todos os lugares e as pessoas estão acostumadas a elas e as esperam em todos os lugares.

  2. O Vim introduziu as guias na 7.0 como uma maneira de seus usuários criarem "espaços de trabalho" ad-hoc. Nada em seus recursos, opções específicas, comandos específicos ou :helpseções sugere que as guias possam ou devam ser usadas como proxies de arquivo.

    Nada, exceto o nome e a aparência das "guias", é claro, o que leva a muita confusão.

  3. Sem :set hidden, que é desativado por padrão e não é muito fácil de encontrar, o Vim torna impossível mudar para outro buffer sem gravar o atual ou abandonar suas alterações. Os novos usuários, que desconhecem essa opção, não têm escolha a não ser recorrer ao uso intenso de janelas ou ao recurso "semelhante a guia" mais próximo que podem encontrar: guias.

"Página de guia" é uma escolha infeliz de nome para esse recurso, especialmente em uma época dominada pela idéia de que ler a documentação é uma perda de tempo.

No Vim, as guias são uma abstração criada em cima de janelas, elas mesmas uma abstração criada em cima de buffers. Cada novo nível adiciona recursos úteis, mas restringe seu fluxo de trabalho.

O "caminho do buffer"

Com um fluxo de trabalho baseado em buffer, os arquivos com os quais você está trabalhando são distribuídos em uma única dimensão. Você pode percorrer seus buffers, acessar um buffer específico digitando parte de seu nome (com conclusão) ou seu número, alternar entre buffers, segmentá-los facilmente. Basicamente, não há atrito.

  1. Oito buffers abertos, apenas um visível:

    Oito buffers abertos

  2. Mudando por número:

    Mudando por número

  3. Mudando por nome:

    Mudando por nome

Buffers são proxies de arquivo do Vim. Se você pensa em termos de arquivos, pensa em termos de buffers.

O "caminho da janela"

Com um fluxo de trabalho baseado em janela, seus "arquivos" são distribuídos ao longo da mesma dimensão "virtual" única como seriam se você usasse apenas buffers e ao longo de duas outras dimensões "físicas". Mas os espaços cartesianos nos quais essas dimensões são encontradas são quase completamente separados: mover para outro buffer ainda significa "mover para outro arquivo", mas mover para outra janela não. O buffer que corresponde ao arquivo desejado pode ser exibido nessa janela, mas também pode ser exibido em outro, talvez em outra página da guia, ou de modo algum.

Com o Windows, a navegação entre arquivos abertos se torna muito complexa ou simplista, mesmo com 'switchbuf'e :sb. Principalmente porque você é forçado a usar dois conjuntos de comandos para o que é essencialmente a mesma coisa: acessar um buffer.

O Windows tem seu uso, conforme descrito abaixo, mas eles não têm o necessário para substituir os buffers no fluxo de trabalho de ninguém.

Aqui estou trabalhando em um esquema de cores Vim. As duas janelas têm visões diferentes do mesmo buffer: a superior serve como referência, com uma tabela dos códigos de cores usados ​​no esquema de cores, e a inferior é onde trabalho:

Trabalhando em um esquema de cores

O Windows não é projetado como proxies de arquivo e não pode ser transformado em um: são "contêineres" ou "viewports" projetados para oferecer uma visualização em um buffer. Nem mais nem menos.

O "caminho da guia"

Com um fluxo de trabalho baseado em guias, você basicamente tenta imitar a experiência do usuário com a qual está acostumado em seu editor anterior, ignorando completamente a própria natureza das páginas de guias do Vim. Se esquecermos por um momento que essa estratégia geralmente é muito improdutiva, também é impossível, assim como no Windows, forçar o Vim a aderir ao paradigma "um arquivo = uma guia" sem perder muita flexibilidade.

Ainda trabalhando com os mesmos arquivos acima, a tabline ocupa um espaço significativo para praticamente nenhum benefício. Todos os meus arquivos e todas as minhas guias são chamados, javascript*.vimentão não posso fazer isso 3gte ter certeza de que acabarei no lugar certo e é impossível alcançar uma guia específica por nome. Acrescente a isso o fato de que seu rótulo pode muito bem ser inútil, mas perfeitamente lógico [Quickfix List]… Como não há uma maneira prática de vincular um arquivo / buffer a uma página de guia, você basicamente tem apenas uma maneira prática de navegar entre as páginas de guia. / buffers / arquivos: ciclismo.

E sim, minha tabline está cheia de apenas 8 tabs, imagine se eu tivesse 20!

  1. Oito buffers abertos em oito guias (incorretas)

    Errado

  2. Duas guias para duas tarefas específicas (direita)

    Certo

As páginas da guia são "contêineres" ou "viewports" projetadas para conter uma ou mais janelas; elas também são "contêineres" projetadas para conter buffers.

Em conclusão

Os "especialistas em Vim" (suponha que eu possa falar como se eu fosse um) não preferem buffers em vez de abas: eles apenas usam o Vim como ele foi projetado e estão perfeitamente confortáveis ​​com esse design:

  • Os "especialistas em Vim" têm 2, 30 ou 97 buffers carregados e estão muito felizes por não terem de lidar com a distribuição espacial;

  • quando eles precisam comparar dois arquivos ou trabalhar em uma parte do buffer atual, mantendo outra como referência, os "especialistas em Vim" usam o Windows porque é assim que eles devem ser usados;

  • quando eles precisam trabalhar por um tempo em uma parte separada do projeto sem mexer com a visualização atual, os "especialistas em Vim" carregam uma nova página de guia.

romainl
fonte
10
Para alguns links adicionais ver meus Use tampões efetivamente pós
Peter Rincker
7
@ DavididEG, ter 20 buffers não é nada problemático, então não há realmente nenhuma necessidade de um plugin. Por outro lado, 20 páginas de guia - sejam ou não convincentes - proxies de arquivo - não podem caber na maioria das telas, plug-in ou não.
Romainl 3/11
2
@ Kache, sim, esse é exatamente o ponto central do meu argumento: você pode usar as janelas e as guias como são, mas não como proxies de arquivo. Portanto, o argumento não é se as pessoas devem usar tabulações ou buffers , é se as pessoas devem usar tabulações como proxies de arquivo ou não.
romainl
14
Como um “Vim expert” Posso dizer que mais de 4 centenas de buffers “aberto” (realmente “listados, mas sem carga, com exceção de uns poucos”) é uma situação normal quando eu lidar com projeto como NeoVim (I basta abrir tudo *.c, *.h, scripts/*e test/**/*.luaarquivos). Dado que meu terminal tem apenas 239 colunas de largura, a abordagem "um arquivo por guia" é impossível de usar.
ZyX
3
E considerando que há vários plugins (Command-T,…) que facilitam a alternância entre buffers e / ou arquivos, usando guias para qualquer projeto relativamente grande não faz sentido. E o neovim com ≈500 arquivos “interessantes” é um projeto grande, mas não o maior. Quando você enfrenta a necessidade de lidar com esses projetos, sempre usa algum tipo de pesquisa para navegá-lo (pesquisa de arquivo / tag com o Command-T e amigos, várias maneiras de ir para a definição de símbolo) e, portanto, você não tem absolutamente nenhum motivo para usar guias desta maneira: em qualquer caso, você não estará usando a funcionalidade vinculada a tabulação para navegar no projeto.
ZyX
88

Eu costumava manter cada tampão em uma aba separada, mas eu cresci cansado de constantemente gte gTing ao redor em toda parte.

Eu também senti que os buffers eram muito difíceis de gerenciar.

Aqui estão algumas técnicas que mudaram totalmente minha opinião anterior:

Aqui está o meu fluxo de trabalho típico:

  • Abra o Vim e use :e(geralmente com um regex como :e src/**/F*Bar.js) para abrir um buffer
  • Percebo que preciso abrir outro arquivo. Usar:e para isso também. Se eu quiser alternar entre esse buffer e o buffer aberto no momento, usarei :spou :vsppara abri-lo em uma janela separada.
  • Repita até que eu tenha os 3 a 5 arquivos que alternarei entre as técnicas da lista com marcadores acima para voar entre os buffers.
  • Se eu quiser "começar de novo" com meus buffers, feche o Vim e abra novamente.

Senti que, depois de mais ou menos uma semana forçando esses novos padrões, ficou muito mais fácil visualizar quais buffers eu tinha aberto e como chegar a qualquer um deles com apenas alguns golpes automáticos.

Jonathan.Brink
fonte
24
É uma pena que explicações amigáveis ​​para usuários / novatos como essa recebam cerca de 3% dos votos positivos de respostas muito opinativas e depreciativas demais complexas, como a mais votada aqui. Eu nem sabia que esse gTera o comando para trocar de guia, estava procurando o substituto ctrl+tab. Então, obrigado por realmente ajudar um novo usuário, em vez de apenas fazê-lo parecer estúpido.
icc97
11
Devo dizer que meu comentário é injusto com a resposta de @ romainl, ele ficou muito feliz em responder às perguntas que eu tinha sobre isso. Mas certamente como alguém que tenta aprender o Vim, sua resposta é muito mais fácil de entender, mas a resposta é mais completa quando você sabe um pouco mais.
Icc97 30/03/19
3
Acho que a resposta da @ romainl é extremamente útil e nos dá uma imagem clara de como os buffers, janelas e guias são projetados e como eles devem ser usados. Mesmo assim, acho que os usuários do Vim têm a chance de responder perguntas de uma maneira que você não entende , e isso pode ser frustrante.
Keyfnight
3
Não me lembro de onde eu o peguei, mas nnoremap <leader>b :ls<CR>:b<space>é muito bom para alternar rapidamente os buffers, pois mostra uma lista dos buffers abertos no momento. Além disso, nomes parciais são aceitos (desde que haja apenas uma correspondência).
#
1
Esse método também tem o benefício realmente impressionante do preenchimento automático do vim (padrão, sem plugins adicionais). Como você usa vários buffers, quando está no modo de inserção e faz um ctrl Nou ctrl P(P é o que eu costumo usar), ele fornecerá uma lista de palavras para concluir o que você estava digitando ... É inteligente com base no seu atual buffer, aqueles em divisões, aqueles que você estava olhando e todos os outros arquivos abertos!
g19fanatic 12/09/19
12

A desvantagem das guias é que você só pode ver o conteúdo de uma por vez. Portanto, se você usá-los como em um navegador, estará perdendo a visualização de vários buffers lado a lado ou até a visualização de partes separadas do mesmo arquivo em divisões. Portanto, muitos recomendam usar guias apenas para segregar áreas de trabalho diferentes (por exemplo, uma para um projeto Java, outra para uma lista de tarefas, uma terceira para invadir um script ao lado).

Os problemas que você descreve fazem parecer que você está usando o Vim errado. Ou (principalmente) uma instância única e dedicada. Em seguida, os buffers que ficarem ocultos simplesmente "reaparecerão" se você os editar novamente (e agora você pode usar a lista de buffers para recuperá-los) e não haverá mensagens de arquivo de troca. Ou use instâncias separadas do Vim por projeto / arquivo / sessão de edição, mas, em seguida, crie o hábito de executar totalmente :quitcada instância quando terminar o arquivo.

Ingo Karkat
fonte
Uso divisões ocasionalmente. Eu não sabia que eles eram considerados 'usando buffers'. É um conceito misterioso para mim realmente.
2c2c
1
Como uma redescoberta interessante de guias, o tabman pode gerar um painel lateral semelhante ao NerdTree, que detalha todos os buffers conforme eles foram exibidos em cada guia.
llinfeng
7

Outra dica, ao usar o nome do buffer como argumento para: buffer, você não precisa especificar nomes inteiros. No entanto, se mais de um buffer corresponder ao argumento fornecido, os buffers não serão alternados.

Qualquer fragmento do nome do buffer pode ser usado para corresponder. Por exemplo, se você tiver os buffers request_manager.javae, em queue_manager.javaseguida, :buffer queou :b quecorresponder a ambos, mas alternará para queue_manager.java, conforme corresponder no início.

Julius Martin
fonte
3

Eu uso as guias Ctrl- Pe as sessões do Vim no meu fluxo de trabalho e já há mais de um ano:

  • Eu mapei )e (mapeei para "ir para a próxima guia" e "ir para a guia anterior", respectivamente. tnabre uma nova guia. Também uso o tabm para ajudar a manter as coisas organizadas.

  • Uso sessões do Vim para grupos de arquivos relacionados à história / bug atual em que estou trabalhando, geralmente feito por categoria. Essas sessões são substituídas durante o curso do processo.

  • Ainda não encontrei nada melhor que Ctrl- P, mas é preciso um pouco para processar todos os arquivos para encontrá-lo.

ShangoThrax
fonte
1

Joga 2c na pilha.

TLDR; :b *part-of-filename*é a melhor maneira de encontrar um arquivo que você precisa na lista de buffers, ou seja, é MAIS RÁPIDO e tem menos carga cognitiva que os números, guias ou janelas do buffer para rastrear arquivos.

Não é nada para mim ter 30 buffers abertos (ou seja, eu não tenho arrumação doméstica), e a beleza dos buffers usados ​​- bem, é que isso não me deixa mais lento. Na verdade, ele acelera as coisas quando quatro dias depois que eu abri o arquivo eu preciso, ligue:b *part-of-filename* e ele aparece magicamente, impressionando colegas de trabalho e colecionadores.

Buffers são para arquivos.

Para ser efetivo:

  • Abra um primeiro arquivo importante a partir de um diretório raiz diabolicamente bem escolhido
  • Abra arquivos subsequentes com :e
  • Usar ls TODO o tempo em que começar a obter um bom modelo mental (você não pode grocar o que não pode ver, mental ou literalmente)
  • Nunca :qsopra
  • Entre :bna sua memória muscular
  • :b1 é bom para o primeiro arquivo que você sabe que abriu, caso contrário, números e letras ficam desajeitados rapidamente
  • :b# é bom para mudar para o seu último arquivo, o que é uma necessidade comum
  • :bd#é bom para quando você alterna para um arquivo temporário, faz o que você precisa fazer, retorna :b#e agora deseja fechar esse arquivo temporário
  • :b *part-of-filename* caso contrário, é a melhor maneira de encontrar um arquivo que você precisa na lista, ou seja, é MAIS RÁPIDO e tem menos carga cognitiva do que números de buffer, guias ou janelas para rastrear arquivos.

O único incômodo :b *part-of-filename*é que às vezes você ainda não abriu o arquivo e precisa voltar e:e path/to/full-filename primeiro.

As guias são para diferenciar arquivos realmente não relacionados.

Ou mantendo um layout de janelas específico à mão (isenção de responsabilidade: eu nunca o usei para isso).

Ou para arquivos raramente usados, mas previsivelmente necessários. Para mim, geralmente é um commitMessagearquivo que eu anoto enquanto trabalho, para que eu não precise pensar muito na hora de confirmar. gté mais rápido que :b com<enter>(se você estiver com sorte, caso contrário :b com<tab><enter>)

  • :tabe commitMessage
  • gtou gTtambém um favorito da memória muscular

As divisões de janela são para comparar visualmente informações

Ou ter acesso imediato a informações importantes (sinceramente, a menos que essas informações sejam algo que eu precise atualizar com :eum arquivo de log, geralmente eu apenas puxo o conteúdo para o arquivo atual e lido com ele).

  • :vspou C-w vabre uma divisão vertical, ou seja, esquerda | certo, use :bou :epara obter o arquivo que deseja
  • :spou C-w sabra uma divisão horizontal, isto é, superior / inferior
  • C-w C-w ou seja, duplo Ctrl-w, gira você pelas janelas disponíveis
  • C-w c fechar janela atual
  • C-w o feche todas as outras janelas, mantenha SOMENTE atualizado
Paul Parker
fonte
Resposta incrivelmente útil, deve ter muito mais votos. Obrigado pelas dicas, especialmente a percepção do seu fluxo de trabalho com :b#e :bd#!
Alacritas 14/06
0

Adicione-os ao seu .vimrce comece a amar buffers:

:nnoremap <Tab> :n<cr>
:nnoremap <S-Tab> :N<cr>

Dessa forma, você pode avançar / retroceder através deles no modo normal via Tab/ ShiftTab.

sjas
fonte
5
Não faça isso. Você perderá o mapeamento para <C-I>. Mapeie, <C-Tab>se você realmente quiser.
6
Além disso, :ne se :Nrelacionam à lista de argumentos, não aos buffers abertos. Você gostaria :bne :bp( :bnexte :bprev). O intopped do tpope fornece mapeamentos ]be [bpara isso (e outras coisas boas), se você quiser. (e ), ou <left>e <right>setas, seria sem dúvida menos teclas úteis para substituir do que tabulação, se você realmente quiser um breve mapeamento.
Vaz
1
@ jeyoung concordou - também faz muito mais sentido usar, Ctrl + Tabpois é o que a maioria dos outros editores e navegadores de GUI usa.
Icc97 30/03/19
0

Gostaria de sugerir uma implementação brilhante de um bom número de anos atrás: kien / tabman.vim . Esclarece o seguinte:

  • Pode-se ter tantos buffers cuidadosamente escondidos em algum lugar;
  • Por design, as guias são destinadas a exibir bufferes de maneira criativa.
    • Com algum plugin de tabline adequado, é possível exibir todos os buffers ocultos na linha superior (tabline);
    • De acordo com minha experiência com a vim- airlines, a tabline mostrará muito poucas informações relevantes quando eu criar uma nova guia.
    • Duas tags ocuparão o espaço da tabline, lado a lado, desperdiçando o restante dos espaços horizontais
    • Pior ainda, não tenho mais idéia de quais são os buffers ocultos.

Foi uma redescoberta maravilhosa deste plugin mágico, que deveria ter permanecido na minha configuração do Vim por um bom número de anos também. Embora eu continue procurando por algo que também exiba todos os buffers ocultos, o TabMan é o meu super-homem quando se trata de ter uma visão geral de como os buffers foram organizados em diferentes guias.

llinfeng
fonte
0

Carrego os buffers "selecionados" como guias para alternar rapidamente (TAB / S-TAB) entre eles. A estrutura dos espaços de trabalho se encaixa aqui, pois para mim, os buffers das guias VS são principalmente a visibilidade. Posso abrir arquivos importantes / de trabalho em janelas e guias e ocultar os que atualmente não preciso utilizar em segundo plano em tempo real, sem ter que lembrar de caminhos ou ter tempo para pesquisar e carregá-los novamente quando necessário. Isso permite lidar com várias tarefas ou projetos em uma sessão do VIM, acho que isso costumava ser importante em máquinas com pouca memória, mas também é bom para concentrar todas as tarefas de edição em um único quadro de aplicativo. Também tenho atalhos de deslocamento de buffer definidos como Ctrl-Direita / Esquerda, para que eu possa alternar rapidamente também entre vários buffers.

Resumindo, é possível dividir até algumas janelas para seus usos tanto quanto a propriedade da tela, mas é possível manter várias configurações de janelas em várias guias, expandindo assim o espaço de trabalho e melhorando o fluxo de trabalho, permitindo a divisão conveniente de tarefas complicadas, revolvendo mais de um arquivo .

Para os arquivos de troca, você pode dizer ao VIM para manter todos eles em uma pasta da sua designação. Para este uso :set directory.

elegível
fonte