executa o subprocesso de uma extensão urlvt perl ao chamar a janela urxvt

1

Estou tentando gravar uma extensão rxvt-unicode perl para fazer o que mrxvt PrintScreen . Ou seja, a extensão deve canalizar o conteúdo do urxvt para comandos definidos pelo usuário. O objetivo principal seria ver o conteúdo do urxvt desdobrado em less -S .

Aqui estão minhas primeiras tentativas. (O comando ainda está codificado cat -n , e incluindo códigos de escape de cor e junção de linhas quebradas ainda está faltando.)

#! perl -w
use strict;

sub on_user_command {
    my ($self, $cmd) = @_;
    open PIPE, "|cat -n" or die "urxvt-pipe: error opening pipe: $^E\n";
    for (my $i = $self->top_row; $i < $self->nrow; $i++) {
        print PIPE $self->ROW_t($i), "\n";
    }
    close PIPE or warn "urxvt-pipe: error closing pipe: $^E\n";
    ()
}

Substituir o canal por exec_async não ajuda:

#! perl -w
use strict;

sub on_user_command {
    my ($self, $cmd) = @_;
    open FH, ">/tmp/urxvt.txt" or die "urxvt-pipe: error opening file: $^E\n";

    for (my $i = $self->top_row; $i < $self->nrow; $i++) {
        print FH $self->ROW_t($i), "\n";
    }

    close FH or warn "urxvt-pipe: error closing file: $^E\n";
    $self->exec_async("cat", "-n", "/tmp/urxvt.txt");
    ()
}

O problema com ambos é que o cat é executado dentro do pai do urxvt (por exemplo, outro urxvt ou um buffer do emacs se eu chamar o urxvt como o comando "compile" durante o desenvolvimento da extensão). Eu gostaria que fosse executado na instância cujo conteúdo eu estou tubulação, ou uma nova aba do mesmo. Isso é possível?

Obviamente, como uma solução alternativa, o exec_async poderia ser modificado para abrir uma nova janela: $self->exec_async("urxvt", "-title", "less urxvt scrollback", "-e", "less", "-S", "/tmp/urxvt.txt"); Mas eu preferiria a mesma janela e também evite criar um arquivo temporário.

    
por EndlosSchleife 11.09.2015 / 01:01

1 resposta

0

Isso não responde à pergunta real, mas infelizmente foi rejeitado como muito longo para um comentário.

Eu tornei a solução menos feia, removendo a nova parte da janela da extensão:

  • A extensão usa IPC :: Run3 :: run3 para capturar stdout e stderr do subprocesso e grava isso no urxvt "direito" usando $term->special_encode e $term->cmd_parse . (Não que less tivesse algum resultado útil, mas apenas para torná-lo uma extensão de propósito geral.)
  • O comando configurado (em uma linha URxvt.keysym ... em ~ / .Xdefaults) é: zsh -c 'stdin2fifo | read -r p && urxvt -e less -SNRfI -- "$p"'
  • Script stdin2fifo lê stdin e o grava em um pipe chamado temp. less -f exibe o canal. Portanto, esperamos que não haja E / S de disco para os dados reais, apenas para uma entrada no sistema de arquivos.

Script stdin2fifo:

#!/bin/zsh
if [ $# -ne 0 ]; then
    cat <<EOF
Usage: $(basename "$0")
Reads stdin, writes it to a new named pipe (in the background), and prints the
pipe's pathname.
Can be used (in zsh, at least) to "send stdin to another terminal". For example:
... | $(basename "$0") | read -r p && urxvt -e less -f -- "\$p"
EOF
    exit 4
fi

set -e
dir=$(mktemp -d "/tmp/$(basename "$0")_XXXXXX")
pipe=$dir/pipe
mkfifo "$pipe"
(cat > "$pipe")&
echo "$pipe"
    
por 17.10.2015 / 18:13

Tags