Nota : questa risposta sembra funzionare solo con le shell tcshe fish. Ho anche provato bash, dash, mksh, e zsh, e non ci lavoro; Io non so perché, perché se faccio le stesse azioni di questi gusci senza Vim, si fa il lavoro come previsto ... ( :!comandi vengono eseguiti anche se il guscio).
Mi capita di usare tcsh, quindi funziona per me ...
Puoi usare :set shell=/bin/tcshper impostare la tua shell; questo è globale, però. Quindi usalo solo se pensi che questa sia una funzione molto importante :-)
^Zinviare un SIGTSTPsegnale, è possibile inviare questo segnale con kill, quindi utilizzare SIGCONTper continuare (riprendere) il processo. Questo distaccerà il processo da Vim.
Poiché è difficile mostrarlo con questo sleep(come fai a sapere che ha continuato l'esecuzione?), Userò gitkcome esempio (ma qualsiasi programma GUI lo farà):
Ad esempio in Vim:
:!gitk %
E poi in un altro terminale:
$ 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
Ovviamente puoi anche usare killall, oppure pkill; per esempio:
$ killall -TSTP wish
$ killall -CONST wish
È necessario aprire un altro terminale per questo, che non è l'ideale, ma ti consentirà di continuare a utilizzare sia il tuo Vim che il tuo processo esterno.
&ogni volta::nnoremap :! :!&<Left>... Ma ovviamente, a volte non vorrai il&, e dovrai premere <Del> per rimuoverlo.