私は多くのvimウィンドウを実行し、しばしばbgに入れます。問題は、vim
私がリストをリストすると、誰もがそう言うので、jobs
違いを言うのは難しいということです。
[1] - suspended nvim
[2] - suspended nvim
[3] + suspended nvim
この問題を解決する1つの方法は、vimの起動時に特定のファイルを開くことです。
nvim ./myfile
jobs
:
[1] + suspended nvim myfile
しかし、それは不都合な名前の代替品です。
別のオプションは、次の環境変数を(誤って)使用してバッファ名を指定することです。
vim name=my_name
ただし、出力がjobs
より便利になる可能性があり、プロセスを開始するときに望ましくないプロセスの背景を準備する必要があるという欠点があります。
[1] - suspended nvim name=my_name
[2] + suspended nvim name=other_name
理想的には、ボタンを押したときにプロセスのオプション名を指定するように求められますctl-z
。たぶんこれを処理するプラグインがあるかもしれませんが、まだ見つかりませんでした。
自分で書いたいのですが、どこから始めるべきかわかりません。おそらくctl-z
他のプログラムに再マップするのでしょうか?たぶん、前にfg
座ってjobs
出力を制御するために書く必要があるかもしれません...
これに提案がありますか?
答え1
nvim
名前と現在のパラメータと一致するバックグラウンドジョブを確認するシェル関数を作成できます。見つかったら、再び前景に戻ります。そうでない場合は、新しいコマンドラインを実行してください。
コマンド全体を再入力しなくても、シェル履歴を使用できます。
- 新しいコマンドを開始しました
nvim foo.txt
- このコマンドをバックグラウンドにします。
- [通常のbash設定を使用]をクリックするとCtrlr foo表示されるため、実行コマンドラインをもう一度
nvim foo.txt
押すとEnter、シェル機能が呼び出され、一時停止したvimプロセスに戻ることができます。
コメントへの返信
Ctrl-zそのように動作しません。設定可能なシェル機能を割り当てません。bash
すべての文字(および他のいくつかの文字)を確認できます。
start cmd:> bind -p | grep -F '\C-a'
"\C-a": beginning-of-line
ほとんどはシェル(readline
プロンプト編集コンポーネントなど)にいくつかの設定がありますが、Ctrl- はありませんz。これは、これが「より高い優先順位」として他の場所で定義されているため、シェルに到達しないためです。
start cmd:> stty -a
speed 38400 baud; rows 47; columns 210; line = 0;
intr = ^C; [...] kill = ^U; eof = ^D; [...] start = ^Q; stop = ^S; susp = ^Z;
ターミナルエミュレータはこのキーの組み合わせをキャプチャし、SIGTSTP
(TERMINAL STOP)信号をフォアグラウンドプロセスグループに送信します。
start cmd:> strace -f -p 20171
strace: Process 20171 attached
restart_syscall(<... resuming interrupted read ...>) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTSTP {si_signo=SIGTSTP, si_code=SI_KERNEL} ---
--- stopped by SIGTSTP ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=3583, si_uid=1000} ---
これがカーネルレベルで起こることです。フォアグラウンドプロセスが停止し(信号を捕捉できなかったため)、シェルは子プロセスがカーネルから信号を受信して停止したことを知らせます。実行fg
結果は、ユーザープロセス(シェル)から送信された継続シグナルである最後の行に表示されます。