Posso emitir um shell interativo na janela do Vim?

16

Eu sei que posso :!ou :r!para executar um comando externo e, opcionalmente, inserir sua saída no texto. Eu posso até me apresentar :!she criarei um shell que permanecerá vivo até sair dele - mas enquanto o shell estiver ativo, o Vim estará "adormecido" e inacessível. Preciso sair do shell e gerar um novo se quiser retornar ao Vim por um momento - não muito útil.

I pode acessar shell na extremidade oposta, suspendendo Vim com ^Ze gerenciar o trabalho Vim através de bg, fge jobs. Isso faz mais sentido, mas é muito complicado a longo prazo. Posso usar Screense estiver disponível (geralmente não está) ou abrir várias janelas do meu gerenciador de janelas (e ssh para direcionar o host de cada um deles em sequência, para ter o vim e o shell no host remoto, mais complicado novamente).

Seria melhor se o Vim me permitisse abrir uma sessão de shell e mantê-la, digamos, em uma de suas janelas (internas), ou permitir que eu alternasse para ela e voltasse. É algo assim possível?

SF.
fonte
1
Então, basicamente, você deseja abrir um shell em um :splitarquivo, mantendo o arquivo na outra janela? ... Isso me parece um trabalho para tmux ou tela ...
Martin Tournoij 6/15
1
@Carpetsmoker: Muitas vezes não tenho controle sobre o que está instalado no sistema remoto e, na maioria das vezes, nenhum dos dois está, enquanto o Vim está sempre lá.
SF.
Considere mudar para o Neovim. Agora ele possui um emulador de terminal embutido que funciona muito bem e pode ser aberto em um buffer vim.
Zach

Respostas:

16

Existem alguns plugins do vim que permitem isso. Eu uso o Conque ( Github ).

Depois de colocá-lo no diretório de plugins, tudo o que você precisa fazer é:

:ConqueTermSplit bash

E você terá um shell bash interativo no vim. Você pode usar seus gestos regulares do vim para fazer qualquer outra coisa que desejar na janela.

Além disso, o outro plugin é o vimshell .

Bambu
fonte
1
Não há como fazer algo assim sem um plugin?
SF.
3
@SF Veja :help shell-window. (Resposta curta: não).
muru
3

Com o VIM, acredito que os plug-ins que existem para fazer isso não são tão bons assim, embora o vimshell da IMO seja o mais próximo. No entanto, você precisa entender que é um problema de 2 partes.

  1. O VIM não foi projetado para ser capaz de fazer coisas como essa, especialmente complicado é poder executar qualquer tarefa de longa duração e conversar com ela de forma assíncrona sem bloquear o VIM. Nesse caso, não é apenas o próprio shell, mas também outras tarefas que você pode executar dentro do processo do shell.
  2. A filosofia modal do VIM não funciona muito bem com a maneira como interagimos com um shell. Em um shell, apenas a linha atual é editável, embora você possa rolar e ver o texto mais antigo do seu histórico com o shell, não é possível editá-lo. Isso não se encaixa na filosofia do VIM, se você pressionar ESC e voltar ao modo normal, seria muito difícil proibir que um usuário volte e edite partes da história acima.

Na minha opinião, existem 2 abordagens que funcionam muito melhor nesse sentido.

  1. Usando o TMUX / Screen e janelas de terminal multiplex para ter o vim e o shell. Dessa forma, os dois estão bem separados e, no entanto, é possível visualizar ambos com muito pouco esforço e os dois podem trabalhar da melhor forma possível, sem conflitar com o fluxo um do outro.
  2. Usando plug-ins como tpope / vim-dispatch e afins, você pode facilmente iniciar comandos off-shell e executá-los de forma assíncrona em segundo plano em um shell de terminal real e recuperar os resultados no vim assim que estiver concluído. Isso também fornece o mesmo nível de isolamento entre os dois e, portanto, os dois podem novamente trabalhar da melhor maneira possível, sem pisar nos dedos uns dos outros.

Devo acrescentar que há uma boa probabilidade de que o NeoVIM possa causar uma mudança nesse aspecto, uma vez que um de seus principais objetivos é poder executar tarefas de forma assíncrona. Mas até então, é o melhor que podemos obter na minha opinião.

Dhruva Sagar
fonte
3

Em :help shell-windowpodemos ler sobre a execução de comandos shell em uma janela:

Houve dúvidas sobre a possibilidade de executar um shell em uma janela dentro do Vim.

A resposta: você não pode!

A inclusão disso adicionaria muito código ao Vim, o que é um bom motivo para não fazer isso. Afinal, o Vim é um editor , não é para executar tarefas de não edição. No entanto, para obter algo assim, tente dividir a tela do terminal ou exibir a janela com o programa " splitvt ".

Uma alternativa é o comando " window ", encontrado nos sistemas BSD Unix, que suporta múltiplas janelas sobrepostas. Ou o programa " tela ".

No entanto, existem poucas soluções que você pode usar:

  • uso screenespecialmente projetado para esse tipo de coisa, por exemplo:

    • Ctrl+ a, Spara dividir a janela atual horizontalmente
    • Ctrl+ a, Tabpara alternar entre janelas
    • Ctrl+ a, Xpara remover a região atual
    • Ctrl+ a, Qpara remover todas as regiões, exceto uma

    Veja mais em: Guia de Sobrevivência na Tela GNU no stackoverflow SE

    Ou: Divisão de tela GNU , Referência rápida da tela para obter mais detalhes.

  • VIM-Shell - um patch de terceiros

    O shell do VIM é uma extensão do VIM que apresenta janelas divididas e esse patch possibilita iniciar shells nessas janelas. Está disponível apenas para sistemas POSIX

  • vterm - Emulador de terminal dentro do vim.

    O objetivo do vterm é fornecer um clone do terminal unix dentro do vim que funcione imediatamente, sem dependências.

  • Vimux - interaja facilmente com o tmux do vim.

    Inspirado no tslime.vim , um plug-in que permite enviar entrada para o tmux, o vimux é facilitar a interação com o tmux a partir do vim.

  • outro já mencionado: Conque

Relacionado: Como executar um terminal dentro do vim? no stackoverflow

kenorb
fonte
Como se livrar da divisão ?? : - /
0xc0de 31/07/2015
Veja: Divisão de tela GNU
kenorb