tela gnu - obtém lista de títulos de janelas

tela gnu - obtém lista de títulos de janelas

Como posso obter informações (título, horário de criação, conteúdo visível) sobre janelas em uma sessão de tela? Preciso fazer isso em um script, por isso não estou procurando atalhos de teclado ou comandos interativos.

Algo como o do tmux list-windowsseria ótimo.

Responder1

De acordo comeste tópicoem usuários de tela tal funcionalidade foi implementada em tela. Aparentemente não tenho uma versão recente o suficiente para funcionar, mas deve funcionar em versões recentes da tela.[Editar]Eu apenas tentei com o git mais recente, funciona mesmo que não esteja documentado emscreen -h

screen -Q windows
screen -Q select my_window

A primeira aparição da -Qopção foi emeste commit.

Responder2

Experimente a sequência Ctrl-a wde acordo com as instruçõesaqui.

Pessoalmente, eu uso um arquivo .screenrc que mantém essas informações sempre na parte inferior da tela (como uma barra de tarefas do Windows). Minha configuração de tela (~/.screenrc) se parece com:

hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

Responder3

No GNU Screen, a ligação de tecla padrão para obter uma lista de todas as janelas (e escolher uma para alternar) é:

C-a "

Responder4

Finalmente consegui!

Eu preciso fazer isso em um script ...

Introdução

Eu abri 5 janelas, fechei a janela#2e abriu um arquivo com um nome problemático4$ esp32.pdfna janela#3...

screen -Q windows
0$ man screen  1*$ user@host$  3$ pdfread: 4$ esp32.pdf  4-$ root@server#

Esta string está quase inutilizável! (Veja mais, meufunção mais rápida.)

Minha solução, como uma função

Queria recuperar uma lista correta de janelas abertas, mesmo que alguns títulos de janelas contenham strings como ...2*$...ou algo assim:

Aqui está uma função que procura o número da janela existente, de 0até 99(por padrão).

getWinList() {
    if [[ $1 == -v ]]; then
        local -n _outar="$2";shift 2
        else local _outar
    fi
    _outar=()
    local _string _pointer _maxid=${1:-99}
    case $_maxid in
        '' | *[!0-9]* )
            cat <<EOUsage
Usage:
    $FUNCNAME [-v <varname>] [INT]
       -v varname  Populate array "$varname" with window list
       [INT]       Optional last ID to check for existence (default 99)
EOUsage
            return 1
            ;;
    esac
    for ((_pointer=0;_pointer<=_maxid;_pointer++)); do
        _string=$(screen -p $_pointer -Q title) &&
            printf -v _outar[_pointer] %s "$_string"
    done
    printf >&2 '\e[A\n\e[K'
    [[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
        for _pointer in ${!_outar[@]};do
            printf '  %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
        done
}

Você poderia usar -va opção para armazenar o resultado em umvariedadevariável e adicione um número opcional de janela para testar:

Abri 5 janelas, fechei a janela 2 e abri um arquivo com nome problemático na janela 3...

getWinList
     [0]: man screen
     [1]: user@host$
     [3]: pdfread: Little 4$ esp32.pdf
     [4]: root@server#

getWinList 3
     [0]: man screen
     [1]: user@host$
     [3]: pdfread: 4$ esp32.pdf


getWinList -v array 10                                          
declare  -p array
declare -a array=([0]="man screen" [1]="user@host\$" [3]="pdfread: 4\$ esp32.pdf" [4]="root@server#")

Mais rápido, mas menos confiável:

Como isso é

  • com base na saída dele screen -Q windowsé limitado pela correntejanelalargura,
  • baseado emexpressão regular, qualquer título de janela correspondente a estepoderia quebrar a matriz resultante.
getWinListFast() {
    if [[ $1 == -v ]]; then
        local -n _outar="$2";shift 2
        else local _outar
    fi
    _outar=()
    if [[ $1 ]]; then
            cat <<EOUsage
Usage:
    $FUNCNAME [-v <varname>]
       -v varname  Populate array "$varname" with window list
EOUsage
            return 1
    fi
    . <(screen -Q windows |
            sed '
                :a;
  s/^\(.*\n\|\)\([0-9]\+\)[*!-]*$ \(\([^ ]\| [^ ]\)\+\)\(  \(.*\)\|\) *$/\1[\2]="\3"\n\6/;
                ta;
                s/[|$]/\\&/g;
                s/.*/_outar=(&)\n/')
        printf >&2 '\e[A\n\e[K'
    [[ ${_outar[@]@A} != declare\ -a\ _outar=* ]] ||
        for _pointer in ${!_outar[@]};do
            printf '  %6s: %s\n' "[$_pointer]" "${_outar[_pointer]}"
        done
}

informação relacionada