Facilitando o dimensionamento do terminal no OpenVMS

1

Sendo um pouco verde com o OpenVMS, mas ainda tentando "fazer as coisas", eu gostaria de tornar as coisas um pouco mais fáceis em relação à configuração da altura e largura do terminal.

Atualmente eu posso SSH para um servidor baseado em OpenVMS-8.4 (a partir de um painel dentro da minha sessão Tmux), mas, ao contrário do Linux, o shell de comando DCL não captura automaticamente o tamanho do meu terminal.

Ou seja, depois de inserir o SSH e emitir SHOW TERM , obtenho:

Terminal: _FTA31:     Device_Type: VT200_Series  Owner: <elided>

Input:    9600     LFfill:  0      Width:  80      Parity: None
Output:   9600     CRfill:  0      Page:   24

Terminal Characteristics:
    Interactive        Echo               Type_ahead         No Escape
    Hostsync           TTsync             Lowercase          Tab
    Wrap               Scope              No Remote          Eightbit
    Broadcast          No Readsync        No Form            Fulldup
    No Modem           No Local_echo      No Autobaud        No Hangup
    No Brdcstmbx       No DMA             No Altypeahd       Set_speed
    No Commsync        Line Editing       Overstrike editing No Fallback
    No Dialup          Secure server      No Disconnect      No Pasthru
    No Syspassword     No SIXEL Graphics  No Soft Characters No Printer Port
    Numeric Keypad     ANSI_CRT           No Regis           No Block_mode
    Advanced_video     Edit_mode          DEC_CRT            DEC_CRT2
    No DEC_CRT3        No DEC_CRT4        No DEC_CRT5        No Ansi_Color
    VMS Style Input    <CTRL-H> Backspace

Os bits importantes acima são Width: 80 e Page: 24 . Isso apesar do fato de que a emissão de um Tmux :display "H: #{pane_height}, W: #{pane_width}" mostra o seguinte:

 H: 51, W: 92

As características do terminal não são atualizadas automaticamente, e isso pode não ser surpreendente, já que o terminal parece estar sendo interpretado como " VT200_Series ". De qualquer forma, notei que o Tmux é bastante flexível nos vários tipos de interação que ele pode ter com o terminal, em particular, há um recurso para exibir um host de atributos de terminal por meio do comando display-message ; como indicado acima, pode-se "pegar" a largura e a altura por meio de algo como:

 :display-message -p "Width: #{pane_width}, Height: #{pane_height}"

O -p indica que o resultado deve ser enviado para stdout (o Tmux limpa a tela e mostra o resultado).

Além disso, é possível definir os dados em um buffer explicitamente por meio do comando set-buffer do Tmux, assim:

 :set-buffer "Mary had a little lamb..."

E cole o resultado em um painel, como se ele tivesse sido inserido de forma interativa, usando o comando paste-buffer Tmux.

O que eu gostaria de fazer > é algo ao longo destas linhas:

 :setb "SET TERM/PAGE=#{pane_height}/WIDTH=#{pane_width}";\
  pasteb;\
  send Enter

Naturalmente, o bit SET TERM/ ... define explicitamente a altura e a largura do terminal, respectivamente, no OpenVMS.

Infelizmente, parece que o parâmetro data do comando set-buffer não passa pela substituição "variável especial".

Sendo um pouco novo tanto para o OpenVMS quanto para o Tmux, preciso de orientação sobre como posso fazer o que preciso fazer aqui. Uma alternativa, eu acho que é apenas sempre usar um terminal de um determinado tamanho e codificar o tamanho no meu script LOGIN.COM , mas eu gostaria de "primeiro prêmio", que é a capacidade de definir isso dinamicamente (se eu pudesse fazer com que a ideia acima funcionasse, eu usaria, é claro, uma configuração bind-key para poder invocá-la rapidamente).

    
por Eric Smith 18.04.2017 / 09:45

1 resposta

1

Você pode usar o comando run-shell do Tmux - conforme a página man:

run-shell -b [-t target-pane] shell-command

... shell-command is expanded using the rules specified in the
FORMATS section ...

A seção FORMATS descreve como as strings podem ser formatadas por meio de operações de substituição, como " #{pane_width} ".

Portanto, com run-shell pode-se chamar um shell script, passando-lhe qualquer informação relativa à sessão, cliente, janela ou painel do Tmux. Tmux também permite que alguém emita comandos para o servidor, direcionado a um painel a partir da linha de comando. O script de shell necessário para emitir o comando DCL para definir a largura e a altura do terminal torna-se:

#!/usr/bin/env sh

# We're assuming the pane identifier is passed as the first
# argument.
#
PANE=$1

# It's possible to "fetch" information by invoking the
# Tmux display-message command (short form: display) and 
# passing it the pane identifier with the target (-t) option.
#
WIDTH=$( tmux display -t $PANE -p "#{pane_width}" )
HEIGHT=$( tmux display -t $PANE -p "#{pane_height}" )

#
# Construct the DCL command to set terminal width and
# height explicitly.
#
CMD="SET TERM/PAGE=$HEIGHT/WIDTH=$WIDTH"

#
# Set the buffer to contain the DCL command string.
#
tmux setb "$CMD"

#
# Paste the buffer contents to the relevant pane.
#
tmux pasteb -t $PANE

#
# Press "Enter" in the relevant pane to execute the DCL command.
#
tmux send -t $PANE Enter

O que resta, então, é configurar uma chave acoplada que chamará run-shell , chamando o script acima e passando o identificador do painel "atual" como o único argumento:

bind-key C-r run-shell "~/bin/resizevms.sh #{pane_id}"

Coloque isso no seu ~/.tmux.conf e depois de fazer login, um rápido C-b C-r definirá as coisas para você.

    
por 19.04.2017 / 02:09