Como executo um terminal dentro do Vim?

305

Estou acostumado ao Emacs, mas estou testando o Vim para ver qual deles eu gosto mais.

Uma coisa que eu gosto no Emacs é a capacidade de executar um terminal dentro do Emacs. Isso é possível dentro do Vim? Eu sei que você pode executar comandos do Vim, mas gostaria de poder executar um terminal dentro de uma guia.

Evan
fonte
2
related: stackoverflow.com/q/1879219/1569
Fator Místico
42
É o :! <command>que você está procurando?
takeshin
48
Desde o Vim 8.0, existe um :termcomando que abre um novo terminal em uma nova janela dividida. Se não funcionar, verifique vim --version | grep -o .terminalse esse recurso está disponível ( +terminal) ou indisponível ( -terminal).
Susam Pal

Respostas:

123

Eu recomendaria definitivamente screenalgo assim. O Vim é um editor de texto, não um shell.

Eu usaria Ctrl+ASpara dividir a janela atual horizontalmente, ou na tela do Ubuntu e em outras versões corrigidas, você pode usar Ctrl+A|(pipe) para dividir verticalmente. Em seguida, use Ctrl+ATab(ou equivalente em alguns sistemas, Ctrl+ACtrl+Ique pode ser mais fácil digitar) para alternar entre as janelas. Existem outros comandos para alterar o tamanho e a organização das janelas.

Ou um uso menos avançado screené apenas para abrir várias janelas de tela cheia e alternar entre elas. É o que normalmente faço, só uso o recurso de tela dividida ocasionalmente.

A pergunta do GNU Screen Survival Guide tem várias dicas boas, se você não estiver familiarizado com o seu uso.

Greg Hewgill
fonte
7
+1 Recentemente, recebi recentemente o evangelho da tela. Eu me pergunto como eu vivi sem isso.
armas
118
eu prefiro escolher tmux em vez de tela.
tomaszkubacki
81
Sim, é claro que é possível executar a tela, o tmux ou o terminador, ou abrir outra janela e a tecla Alt, ou até mesmo usar um comutador KVM ativado com um pedal. Mas esse não é o ponto - todas essas soluções sacrificam a integração entre o terminal e o VIM, e é por isso que alguém se preocupa em procurar soluções nesse espaço. Não entendo como essa resposta é sequer uma resposta, muito menos uma resposta superior ou aceita. Acho que vou tentar Conque.
Stabledog
33
como esta é a resposta superior ??? você precisa cancelar o voto e votar na próxima resposta, que realmente responde à sua pergunta. Usar a tela não executa um shell no vim. É como dizer a alguém para iniciar outro shell. E para quem continua jogando fora ":!" Ele JÁ DISSE que sabia executar comandos, o que NÃO é o que ele pediu ... sheesh. A arrogância é tão grossa aqui que você pode cortá-la com uma faca.
Osirisgothra
6
Esta resposta deve ser atualizado devido a novo recurso vim 8.1 Terminal Janela
Alan Garrido
232

Desatualizado de agosto de 2011

Confira Conque Shell (também no GitHub ). Permite executar qualquer programa interativo dentro do vim, não apenas um shell.

Kyle Simek
fonte
21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... o horror recursiva !!
Keflavich
1
a psihodelia parece estar certa. Acabei de compilar o vim com --enable-pythoninterp (o cygwin não distribui o vim com + python) e depois de instalar o ConqueTerm, recebo um erro de #set_buffer_settings. Não consegui rastrear onde essa função mora ou ter alguma idéia do que significa o erro. A mensagem inclui uma declaração sobre um argumento inválido "edit ++ enc = utf-8 bash \ - \ 2". Argh.
Nate Kennedy
47
Para entender a recursão, você deve primeiro entender a recursão.
Stabledog
19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli
1
Parece que isso não é mais suportado, alguém tem uma alternativa?
precisa saber é
204

Não sei exatamente o que você está tentando alcançar (nunca usei o Emacs), mas você pode executar comandos no Vim digitando:

:! somecommand [ENTER]

E se você quiser digitar vários comandos ou brincar em um shell por um tempo, sempre poderá usar:

:! bash (or your favourite shell) [ENTER]

Quando o comando ou shell terminar, você poderá pressionar Enterpara retornar à sua janela do editor

O Vim é intencionalmente leve e carece da capacidade de executar tarefas não editoriais, assim como executar um shell completo dentro de um painel / guia do Vim, mas, como mencionado acima, existem complementos de terceiros, como o vim-shell, que permitem a você para fazer esse tipo de coisa.

Normalmente, se eu quiser alternar entre o Vim e meu shell (Bash), basta pressionar CTRL+ Zpara pausar o processo do Vim, brincar no meu shell e digitar 'fg' quando desejar voltar ao Vim - mantendo meu editor e meu concha agradável e separado.

David Claridge
fonte
17
E se você deseja copiar a saída do comando no buffer atual:: r! dir #
Cyber ​​Oliveira
6
Eu uso o Emacs e o Vim (e tenho muito mais experiência com o Vim). Mas descobri que muitas vezes é melhor e mais fácil trabalhar com duas visualizações ao mesmo tempo (uma para ver o que você está editando e outra para trabalhar em um shell interativo - por exemplo, para testar o efeito de uma alteração na configuração que você possui apenas editado). Também ajuda no meu conhecimento, retenção e fluxos de trabalho mentais quando coisas importantes que talvez eu precise monitorar de perto não desaparecem da tela (como o que acontece quando você usa Ctrl-Z ou: shell no Vim).
mvanle
É uma ótima resposta que poupará muito do meu tempo.
Json_sjtu
Boa resposta! Para complementá-lo ainda mais, eu também acrescentaria o :r! command [ENTER]mencionado nos comentários.
Jeach
152

A maneira que eu contornar isso é:

  • pausar o Vim com Ctrl+ Z,
  • jogar no terminal,
  • em seguida, voltar a exatamente onde você deixou com Vim apenas digitando o comando fg.
ptrin
fonte
14
:!bashé uma maneira mais agradável de fazer isso # 0
manman
Acho que ele quer uma espécie de dreampie como funcionalidade
Adam Miller
10
@ Oatman Por que é :!bashmelhor do que Ctrl+z? (Basta saber)
Sebastián Grignoli
2
@ SebastiánGrignoli porque com Ctrl+Z, por exemplo, você pode mover para outra pasta, lsentão git status, etc. Ctrl+Zé uma "pausa", você pode "continuar" com fg. Mas com:! Bash, como eu sei até agora, você só pode executar um único comando de uma só vez, ou mesmo se você pode executar mais de um comando de uma vez, ainda não é conveniente. Portanto, em geral, 'Ctrl + Z' é muito melhor
Leo
+1 porque funciona em praticamente qualquer ambiente. Trabalhar em um sistema externo que não posso personalizar e através de um shell PuTTY barato, isso funciona muito bem.
T3sture
121

Se ativado na sua versão do Vim, um terminal pode ser iniciado com o :termcomando

O suporte à janela do terminal foi adicionado ao Vim 8. É um recurso opcional que pode ser ativado ao compilar o Vim com o recurso + terminal. Se sua versão do Vim tiver suporte para terminal, :echo has('terminal')a saída será "1".

Entrar :termentrará no modo Trabalho de Terminal , onde você poderá usar o terminal conforme o esperado.

No modo Terminal-Job , pressione Ctrl-W Nou Ctrl-\ Ctrl-Nalterna o modo para Terminal-Normal , o que permite que o cursor seja movido e comandos sejam executados de maneira semelhante ao modo Normal do Vim . Para voltar ao modo Trabalho de Terminal , pressione i.

Outras respostas mencionam funcionalidades semelhantes no Neovim.

Daniel S.
fonte
5
+1 para saber como voltar ao modo cmd do Terminal iapós alternar do modo de navegação ctrl-wN. Este é um recurso matador mesmo no tmux e funciona no Windows também.
radke
1
É possível dividir verticalmente usando :term?
precisa saber é o seguinte
1
super! É ótimo que o terminal esteja embutido para que não tenhamos mais problemas com mais plugins. Atualizado para o vim 8 via brew install vim --override-system-vie :termfunciona perfeitamente. Obrigado por compartilhar!
LeOn - Han Li
18
@VitalyZdanevich, :vertical :termdividirá verticalmente com o terminal na janela esquerda. :vertical :botright :termdividirá verticalmente com o terminal na janela direita. Como alternativa, você pode :term ++curwincriar um layout manual das janelas e usá-lo para abrir um terminal na janela ativa.
Daniel S.
esc ctrl-w w permite alternar entre janelas
user1869582
87

:shdepois ctrl+dvoltar (bash)

Atualização :

Você pode mapear ctrl+dno vim para executar :sh, o que permite alternar entre o bash e o vim rapidamente.

noremap <C-d> :sh<cr>

testador
fonte
1
Penso ctrl+ze fgsou um pouco mais rápido, já que você não precisa digitar :shnesse caso.
Alex
@ Alex não, você não precisa digitar :shse fizer o mapa. Depois noremap, você pode apenas Ctrl+Ddo vim para sh, e como ^Dé EOF, que finaliza o sh, para que você retorne ao vim. A única tecla pode alternar entre she vim.
Oct1
42

O principal novo recurso do Vim 8.1 é o suporte à execução de um terminal em uma janela do Vim.

:term abrirá o terminal em outra janela dentro do Vim.

Yossarian42
fonte
2
isso funciona perfeitamente, obrigado! sua resposta é muito mais no espírito da pergunta original
subelsky
Oi, você sabe como sair deste modo?
user3289737
2
como no terminal normal, exitvai sair do terminal, em seguida, usar :qpara fechar a janela
Yossarian42
2
@ user3289737 Como alternativa, você pode pressionar Ctrl + W duas vezes seguidas para alternar entre janelas. Isso não é específico para as janelas do terminal, mas também funciona.
flarn2006
39

Eventualmente, um :terminalcomando nativo foi adicionado ao vim em 2017.

Aqui está um trecho do : readme do terminal :

Esse recurso é para executar um emulador de terminal em uma janela do Vim. Um trabalho pode ser iniciado conectado ao emulador de terminal. Por exemplo, para executar um shell:

 :term bash

Ou para executar o comando build:

 :term make myprogram

O trabalho é executado de forma assíncrona no Vim, a janela será atualizada para mostrar a saída do trabalho, também durante a edição em outra janela.

fjardon
fonte
O terminal é executado em um buffer na mesma guia. portanto, se você está acostumado a usar vários arquivos no vim, pode ter alguma dificuldade. Se os buffers de comutação chegarem ao terminal de onde não há retorno, é necessário matar o terminal. contanto que você esteja ciente disso, tudo ficará bem. espero que os desenvolvedores venham com uma solução alternativa para isso.
ArunMKumar
1
@ArunMKumar Use [Ctrl + W] para "escapar" do terminal e faça :bncomo de costume. Não há necessidade de matar o terminal e que não é um ponto de não retorno :)
fjardon
Obrigado, amigo, perdi totalmente. Eu tenho mapeado para chave : bn para uma chave e ela parou de funcionar, está funcionando novamente. Foi o meu mal.
ArunMKumar
2017? Você quer dizer 2018?
precisa
1
@ flarn2006, referente a 2017 versus 2018, o Vim 8.1 foi anunciado no vim.org em 18 de maio de 2018, com "suporte para executar um terminal em uma janela do Vim" listado como seu "principal novo recurso". O recurso foi disponibilizado pela primeira vez antes, em 7 de julho de 2017, no patch 8.0.0693. github.com/vim/vim/commit/…
Daniel S.
32

Essa pergunta é bastante antiga, mas para quem a encontra, há uma nova solução possível: o Neovim contém um emulador de terminal de primeira classe completo, que faz exatamente o que o ConqueTerm tentou. Simplesmente corra :term <your command here>.

<C-\><C-n>sairá do modo termo novamente para o modo normal. Se você é como eu e prefere que o escape ainda saia do modo de termo, você pode adicioná-lo ao seu nvimrc:

tnoremap <ESC><ESC> <C-\><C-N>

E, em seguida, pressionar ESC duas vezes sairá do modo terminal novamente para o modo normal, para que você possa manipular o buffer no qual o comando em execução está gravando.

Embora tenha em mente, como o nvim está em desenvolvimento pesado no momento em que estou postando esta resposta, outra maneira de sair do modo terminal pode ser adicionada. Como Ctrl+\Ctrl+nmuda para o modo normal a partir de praticamente qualquer modo, não espero que essa resposta fique errada, mas saiba que, se não funcionar, essa resposta pode estar desatualizada.

https://github.com/neovim/neovim

Lahwran
fonte
29

:term

Entretanto, esse recurso foi adicionado recentemente no Vim 8.1, que, a partir desta postagem, foi lançado recentemente, portanto, você pode precisar atualizar para poder usá-lo.

flarn2006
fonte
Foi adicionado antes do vim 8.1. É apenas o principal recurso importante que o vim 8.0.001 não tinha. É por isso que é anunciado como uma novidade do vim 8.1. Veja a resposta de Daniel de outubro de 2017 e a de fjardon em abril de 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte
17

Sei que não estou respondendo diretamente à pergunta, mas acho que é uma boa abordagem. Ninguém mencionou o tmux (ou pelo menos não como uma resposta independente). O Tmux é um multiplexador terminal como tela. A maioria das coisas pode ser feita nos dois multiplexadores, mas no afaik tmux é mais fácil de configurar. No momento, o tmux também está sendo desenvolvido mais ativamente do que a tela e existe um ecossistema muito grande em torno dela, como ferramentas que ajudam a configuração, etc.

Também para o vim, existe outro plugin: o ViMUX , que ajuda muito na interação entre as duas ferramentas. Você pode chamar comandos com:

:call VimuxRunCommand("ls")

Esse comando cria uma pequena divisão horizontal abaixo do painel atual do vim.

Também pode permitir que você execute a partir de um prompt, caso não queira executar o comando inteiro:

<Leader>vp :VimuxPromptCommand<CR>

Como não era suficiente, existem pelo menos 6 'plugins específicos de plataforma':

  • vim-vroom : corredor para rspec, pepino e teste / unidade; suporte ao vimux viag:vroom_use_vimux
  • vimux-ruby-test : um conjunto de comandos para executar facilmente testes de ruby
  • vimux-pepino : execute os Recursos do pepino através do Vimux
  • vim-turbux : Teste do Turbo Ruby com tmux
  • vimux-pyutils : um conjunto de funções para o vimux que permitem executar blocos de código no ipython
  • vimux-nose-test : execute testes de nariz no vimux

Aqui está um bom "caso de uso": Testes sob demanda usando o Vimux e o Turbux com Spork e Guard

Pablo Olmos de Aguilera C.
fonte
Importa-se de explicar por que foi rebaixado? (além de ser uma resposta de 6 anos atrás)
Pablo Olmos de Aguilera C.
13

Alguém já sugeriu https://github.com/Shougo/vimshell.vim , mas não mencionou o porquê. Consequentemente, quando me afastei dessa pergunta, perdi muito tempo tentando as outras opções (de classificação muito mais alta).

Shougo / vimshell é a resposta. Aqui está o porquê:

Além de ser um emulador de terminal, o VimShell permite navegar pela saída do terminal no modo normal e visual. Portanto, se um comando executado resultar em uma saída que você deseja copiar e colar usando apenas o teclado ... o VimShell cobre isso.

Nenhuma das outras opções mencionadas, incluindo o comando: terminal no NeoVim, faz isso. Neovim's: terminal chega perto, mas fica aquém das seguintes formas a partir de 18/02/2017:

  • Move o cursor para o final do buffer, em vez de, finalmente, mantê-lo no mesmo local que o VimShell. Enorme perda de tempo.

  • Não suporta modifiable = 1ver uma discussão sobre isso no Github , de modo votos plugins como vim-easymotion não pode ser usado.

  • Não suporta a exibição de números de linha como o Vimshell.

Não perca tempo com outras opções, incluindo o terminal Neovim's. Vá com o VimShell.

user3751385
fonte
1
O NeoVim permite navegar e copiar da saída do terminal no modo normal / visual. Eu faço isso toda hora. Usando NVIM 0.1.6-dev
Alice Heaton
Obrigado, vou tentar o VimShell. Tomei a liberdade de remover uma declaração incorreta da resposta, no entanto. Como o @Alice apontou, o NeoVim :terminalpode absolutamente fazer o mesmo.
Konrad Rudolph
:terminalnão pode fazer o mesmo que :VimShellem termos de navegação e edição e de maneiras fundamentais. Veja a explicação acima.
user3751385
9

Você pode dar uma olhada no :shcomando (veja :help shno Vim).

Vários comandos

Eric Schwabe
fonte
Portanto, não use o zsh com o vim. set shell=/bin/shfará com que o vim use um shell mais silencioso para seus comandos.
Ross Presser
8

Não, você não pode:

http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window

Âmbar
fonte
2
NÃO TOME O CONSELHO splitvt- ele controla os códigos de controle de cores e torna vimtotalmente inutilizável.
new123456
12
"Não" é uma resposta ruim. Uma resposta melhor é "Por padrão, não". Tecnicamente, isso pode ser feito, e talvez você precise escrever um novo código-fonte e compilá-lo você mesmo, ou escrever um plugin. É fácil? Talvez não, mas isso pode ser feito. Simplesmente dizer Não é mais como dizer "não, eu não farei isso".
trusktr
2
@AnishRamaswamy Ainda não é possível executar um shell dentro de um buffer do vim usando o stock vim (diferente do emacs). Era essa a pergunta do OP.
2626 Amber
1
@ Amber, Sim, isso seria bom, exceto que o OP não fez nenhuma menção ao uso do estoque vim.
Anish Ramaswamy
3
Alguém deve apenas editar esta resposta para dizer que você não pode fazê-lo com o stock vim.
still_dreaming_1
4

A única maneira que eu sei é usando o vim-shell , um patch de terceiros.

romandas
fonte
Para ser pedante, o vim-shell é um patch, não um 'complemento' (o que para mim, pelo menos, implica que é um script). Eu não tentei pessoalmente, mas a página vim-shell no wiki do Vim infelizmente sugere que não será compilada com o Vim 7.1+.
Yewge 6/08/09
Mudou para apaziguar o pedante. :) (. Tinha que digitar algo mais de 15 caracteres 'fixo' não foi suficientemente longo)
romandas
Shougo / vimshell ( github.com/Shougo/vimshell.vim ) parece funcionar bastante bem. Ele requer a construção de uma biblioteca dinâmica, mas é bastante simples (cd <vim> / vimproc; make)
Wayne Walker
3

Eu uso isso agora, você pode tentar. VimShell

Gatspy
fonte
2

Experimente o vterm , que é um shell praticamente completo dentro do vim. É um pouco buggy com sua história e funções claras, e ainda está em desenvolvimento, mas ainda é muito bom

Christopher Dumas
fonte
2

Supondo que sua versão do vim suporte +termprimeiro o comando, configure o shell para o vim para usar em um comando (por exemplo set=/usr/bin/zsh) e, em seguida, execute o comando +term(por exemplo bo 15vs +term). pode ser necessário fazer algumas manobras adicionais em suas janelas (por exemplo, excluir uma e girar), mas você terá seu terminal.

ClxKs
fonte
0

Eu reconheço que não estou respondendo estritamente à sua pergunta, mas o que funcionou melhor para mim ao usar o Vim e os Terminais na mesma janela é o Tmux (que é uma espécie de "execução em segundo plano", semelhante à tela, embora isso funciona melhor com divisões e tabulações).

Este post o ajudará a entender como eles funcionam juntos: 'Tmux e Vim - ainda melhor juntos' .

Dessa forma, podemos converter o Vim em um poderoso IDE

Javi
fonte
0

Divida a tela e execute o comando term ++curwinpara executar o terminal dentro do buffer do Vim. O comando a seguir faz as duas coisas e funcionou para mim:

:bo 10sp | term ++curwin
Subrat Prasad
fonte