シェルからこれを行うと:
$ sleep 100
私はそれをバックグラウンドにすることができます:
^Z
$ bg
そして、私のシェルを使い続けます。&
コマンドの最後にa を追加することで同じ効果を得ることができますが、これはよく忘れます。
Vimでは、私はよくします:
:!sleep 100
そしてここでも、を追加するのを忘れがち&
です。このプロセスをバックグラウンドで実行し、シェルのようにVimを引き続き使用できますか?
シェルからこれを行うと:
$ sleep 100
私はそれをバックグラウンドにすることができます:
^Z
$ bg
そして、私のシェルを使い続けます。&
コマンドの最後にa を追加することで同じ効果を得ることができますが、これはよく忘れます。
Vimでは、私はよくします:
:!sleep 100
そしてここでも、を追加するのを忘れがち&
です。このプロセスをバックグラウンドで実行し、シェルのようにVimを引き続き使用できますか?
回答:
<C-z>
Vimの自体だけでなく、立ち上げたシェルコマンド、それはないだろう作業を中断します。
私がやろうとしていることは、で長時間実行されているコマンドを中止してから<C-c>
、同じコマンドをバックグラウンドで再起動することです
:!! &
(この:!!
コマンドは、前の外部コマンドをここで呼び出すために便利です。また、を介してExコマンド履歴を使用することもできます<Up>
。)
コマンドは、バックグラウンドで実行されるシェルスクリプトに配置できます。たとえば、コンテンツは次のようになります。
#!/bin/sh
sleep 100 &
tmux
デフォルトで使用していますが、問題は私のVimセッション(開いているファイルなど)がまだ役に立たないことです。私は可能性があり、別のウィンドウに切り替えて、そこに私のスクリプトを実行しますが、より多くのアクションであること:!gitk %
例えばが...スクリプトを使用しての事は、私はすべての可能なコマンドのためにこれらのスクリプトの多くを事前に作成しなければならないということです。おそらく、最もよく使われるコマンド(gitk
&などmupdf
)のいくつかにとっては、それは悪い考えではありません。
通常、プロセスが開始されたとき、プロセスを終了(Ctrl+ c)または一時停止(Ctrl+ z、ただし親プロセスを含む)する以外に、それを制御することはできません。
ただし、プロセスの種類とオペレーティングシステムによっては、次のようなトリックを試すことができます。
送信SIGTSTP
又はSIGSTOP
プロセス(によって送信された同一の信号を停止しますCtrl+をz)、及びSIGCONT
(レジューム)処理を継続します。でのテストはsleep
機能しないため、信号を処理する方法を特定のソフトウェアでテストする必要があります。例えば
killall -SIGSTOP sleep
killall -SIGTSTP sleep
kill -SIGTSTP PID
SIGSTOP停止プロセスの停止(キャッチまたは無視できません)
キーボードから生成されたSIGTSTP停止プロセス停止信号
SIGHUP
プロセスに送信しています。デフォルトでは、このシグナルはプロセスを終了しますが、プロセスがSIGHUPシグナルを実装している場合は、制御ttyから切り離し、新しいプロセスIDでバックグラウンドで再実行する必要があります(通常、デーモンで使用されます)。残念ながら、多くのアプリケーションはそれを正しく処理せず、単に(を含めてsleep
)終了します。例えば
killall -SIGHUP sleep
SIGHUP
プロセス端末回線のハングアップを終了する
他の解決策は、次のようなツールを使用することができるretty
(仮想端末に再付着)、 detach
(端末からプロセスを切り離し)、 nohup
(切断端末からの処理)またはgdb
(既存のプロセスにアタッチ-p
して閉じ、そのファイルがtty、同様のような記述子の例)。
詳細については、ジョブコントロール(Unix)-Wikipediaの実装を確認してください。
man kill
またはも参照してくださいman sigaction
。
注:この回答はtcsh
とfish
シェルでのみ機能するようです。私も試してみましたbash
、dash
、mksh
、そしてzsh
、それはしませんが動作します。Vimなしでこれらのシェルから同じアクションを実行した場合、期待どおりに動作するため(理由はわかりません)(:!
コマンドはシェルを介して実行されます)。
私はたまたま使用tcsh
しているので、うまくいきます...
を使用:set shell=/bin/tcsh
してシェルを設定できます。ただし、これはグローバルです。したがって、これが非常に重要な機能であると思われる場合にのみ使用してください:-)
^Z
送信SIGTSTP
信号を、あなたは、この信号を送信することができますkill
使用した後、およびSIGCONT
(再開)プロセスを継続します。これはプロセスをVimから切り離します。
これを表示するのは難しいためsleep
(実行が継続していることをどのようにして知ることができますか?)、gitk
例として使用します(ただし、どのGUIプログラムでも実行できます)。
たとえばVimの場合:
:!gitk %
そして別のターミナルで:
$ 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
もちろんkillall
、またはpkill
; も使用できます。例えば:
$ killall -TSTP wish
$ killall -CONST wish
これには別のターミナルを開く必要がありますが、これは理想的ではありませんが、Vimと外部プロセスの両方を使い続けることができます。
&
毎回追加するように要求できます:nnoremap :! :!&<Left>
。...もちろん、場合によっては、を必要とせず&
、<Del>を押して削除する必要があります。