Se eu fizer isso a partir do shell:
$ sleep 100
Eu posso fazer isso ir para segundo plano, fazendo:
^Z
$ bg
E então continue usando meu shell. Você pode obter o mesmo efeito adicionando &
a ao final do comando, mas geralmente esqueço isso.
No Vim, costumo:
:!sleep 100
E aqui também, muitas vezes esqueço de adicionar o &
. Posso colocar esse processo em segundo plano e continuar usando o Vim como no shell?
external-command
unix
Martin Tournoij
fonte
fonte
&
todas as vezes::nnoremap :! :!&<Left>
... Mas é claro, às vezes você não deseja o&
e precisa pressionar <Del> para removê-lo.Respostas:
Como
<C-z>
irá suspender o próprio Vim, não apenas o comando shell lançado, que não funcionará.O que eu faria é abortar o comando de longa duração e
<C-c>
, em seguida, reiniciar o mesmo comando em segundo plano via(O
:!!
comando é útil para recuperar o comando externo anterior aqui; você também pode usar o histórico de comandos Ex via<Up>
.)fonte
Você pode colocar o comando em um script de shell que se autodenomina. O conteúdo, por exemplo, pode ser:
fonte
tmux
por padrão, mas o problema é que minha sessão do Vim (com arquivos abertos e outras) ainda é inútil. Eu poderia mudar para outro painel e executar meu script lá, mas são muito mais ações do que:!gitk %
por exemplo ... O problema com o uso de scripts é que eu teria que pré-criar muitos desses scripts para todos os comandos possíveis. Talvez não seja uma má idéia para alguns dos comandos mais usados (comogitk
&mupdf
).Normalmente, quando um processo é iniciado, você não tem muito controle sobre ele, exceto encerrá-lo ( Ctrl+ c) ou suspendê-lo ( Ctrl+ z, mas incluindo o processo pai).
No entanto, dependendo do tipo de processo e sistema operacional, aqui estão alguns truques que você pode tentar:
O envio
SIGTSTP
ouSIGSTOP
interromperá o processo (o mesmo sinal enviado por Ctrl+ z) eSIGCONT
continuará (continuará) o processo. Testar comsleep
não funciona, então você deve testá-lo com um software específico sobre como ele lida com os sinais. Por exemploEnviando
SIGHUP
para o processo. Por padrão, esse sinal finaliza o processo, no entanto, se o processo implementa o sinal SIGHUP, ele deve desconectar o controle de tty e executar novamente em segundo plano com o novo ID do processo (geralmente é usado com daemons). Infelizmente, muitos aplicativos não lidam com isso corretamente e simplesmente morrem (inclusivesleep
). Por exemploOutra solução poderia usar ferramentas como
retty
(reconectar a um pseudo-tty),detach
( desconectar um processo do terminal),nohup
( desconectar o processo do terminal ) ougdb
(anexar ao processo existente-p
e fechar seus descritores de arquivo como tty, exemplo semelhante )Para mais informações, consulte: Controle de tarefas (Unix) - Implementação na Wikipedia.
Veja também:
man kill
ouman sigaction
.fonte
Nota : Esta resposta parece funcionar apenas com as conchas
tcsh
efish
. Eu também tenteibash
,dash
,mksh
, ezsh
, e não trabalhar lá; Eu não sei por que, porque se eu faço as mesmas ações dessas conchas sem Vim, que faz trabalho como esperado ... (:!
comandos são executados embora o shell).Eu uso
tcsh
, por isso funciona para mim ...Você pode usar
:set shell=/bin/tcsh
para definir seu shell; isso é global, no entanto. Portanto, use-o somente se você acha que esse é um recurso muito importante :-)^Z
envie umSIGTSTP
sinal, você pode enviar esse sinal comkill
e, em seguida, use-oSIGCONT
para continuar (retomar) o processo. Isso irá desanexar o processo do Vim.Como é difícil mostrar com isso
sleep
(como você sabe que a execução continuou?), Usareigitk
como exemplo (mas qualquer programa GUI o fará):Por exemplo, no Vim:
E então em outro terminal:
Obviamente, você também pode usar
killall
, oupkill
; por exemplo:Você precisa abrir outro terminal para isso, o que não é o ideal, mas permitirá que você continue usando o Vim e o processo externo.
fonte