web-dev-qa-db-ja.com

urxvtのプロンプトを閉じる

フォアグラウンドでプロセスが実行されている場合、ターミナルを閉じる前にurxvtにプロンプ​​トを表示させることはできますか?

これは、たとえばのデフォルトの動作です。 gnome-terminal。

私はi3 これを処理するためにWM_DELETEプロトコルを使用します それが関連している場合は使用します。

4
fredefox

Perlスクリプトがそのトリックを行いました。私はこれで終わった:

#!/usr/bin/Perl

sub on_wm_delete_window {
    my ($self, $event) = @_;
    my $CP = `ps --ppid $self->{Shell_pid} -o pid= | wc -l`;
    chomp $CP;
    if ( $CP != 0 ) {
        return system("zenity --question --title 'Close window' --text 'Subprocess is running. Really close?'")
    } else {
        return 0;
    }
}

sub on_child_start {
    my($self, $pid) = @_;
    $self->{Shell_pid} = $pid;
}

それは私が望むことをします。 (これは この回答 の変更です)サブプロセスが実行されている場合、ユーザーはウィンドウを閉じることを確認するように求められます。

プロンプトにはzenityが必要です。

2
fredefox

この問題は、投稿のUnix StackExchangeで回答されているようです
子プロセスの実行中にurxvtウィンドウが閉じないようにする

上記の投稿からの2つの回答を以下にまとめます。考えられるケースは2つあります。

タブ付き拡張機能を使用する場合

解決策はurxvt wordpress articleにあります
tabbedex拡張機能の1行をコメントアウトすると、URxvtウィンドウが誤って閉じないようにすることができます

Tabbedex拡張ファイルで次のコードを見つけます。このファイルは、おそらく/usr/local/lib/urxvt/Perl/tabbedexの近く、またはシステム上の同等の場所にあります。

これは、探すべきPerlコードスニペットです。

sub on_wm_delete_window {
my ($self) = @_;
$_->destroy for @{ $self->{tabs} };
1;
}

以下に示すように、1行コメントアウトするだけです。

sub on_wm_delete_window {
my ($self) = @_;
# $_->destroy for @{ $self->{tabs} };
1;
}

タブ付き拡張機能を使用しない場合

次のスクリプトを使用します。そのファイル名はclose-preventです。

#!/usr/bin/Perl  
sub on_wm_delete_window {
    return 1;
}

スクリプトをシステム全体の可用性の場合は/usr/lib/urxvt/Perl/に配置し、ユーザーのみの可用性の場合は~/.urxvt/ext/に配置し、~/.Xdefaultsを変更します。

URxvt.Perl-ext-common: ...,close-prevent

変更するたびにxrdb ~/.Xdefaultsを実行します。

使用時にuxrvtターミナルウィンドウが閉じないようになりました Alt+F4 または閉じるボタン。
exitコマンドまたは Ctrl+D 引き続き機能します。

0
harrymc