Nota : Esta resposta parece funcionar apenas com as conchas tcshe fish. Eu também tentei bash, dash, mksh, e zsh, 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/tcshpara definir seu shell; isso é global, no entanto. Portanto, use-o somente se você acha que esse é um recurso muito importante :-)
^Zenvie um SIGTSTPsinal, você pode enviar esse sinal com kille, em seguida, use-o SIGCONTpara 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?), Usarei gitkcomo exemplo (mas qualquer programa GUI o fará):
Por exemplo, no Vim:
:!gitk %
E então em outro terminal:
$ ps ax | grep gitk
30105 pts/10 S+ 0:00 -bin/tcsh -c gitk
30108 pts/10 Sl+ 0:00 wish /sbin/gitk --
$ kill -TSTP 30108
$ kill -CONT 30108
Obviamente, você também pode usar killall, ou pkill; por exemplo:
$ killall -TSTP wish
$ killall -CONST wish
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.
&todas as vezes::nnoremap :! :!&<Left>... Mas é claro, às vezes você não deseja o&e precisa pressionar <Del> para removê-lo.