web-dev-qa-db-ja.com

opensOpenVMSでの端末サイズ設定の緩和

私はOpenVMSでやや環境に配慮していますが、それでも「作業を完了」しようとしているので、端末の高さと幅の設定に関して少し簡単にしたいと思います。

現在、OpenVMS-8.4ベースのサーバーに(Tmuxセッション内のペインから)SSHで接続できますが、Linuxとは異なり、DCLコマンドシェルは端末サイズを自動的に取得しません。

つまり、SSHで接続し、SHOW TERMを発行すると、次のようになります。

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

上記の重要なビットはWidth: 80Page: 24です。これは、Tmux :display "H: #{pane_height}, W: #{pane_width}"を発行すると次のように表示されます。

 H: 51, W: 92

その場合、端末の特性は自動的に更新されません。端末が「VT200_Series」として解釈されているように見えることを考えると、これは驚くべきことではありません。いずれにせよ、Tmuxは端末と対話できる方法にかなり柔軟性があることに気づきました。特に、display-messageを使用して端末属性のホストを表示できる機能があります。コマンド;上に示したように、次のような方法で幅と高さを「取得」できます。

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

-pは、結果をstdoutに出力する必要があることを示します(Tmuxは表示をクリアし、結果を表示します)。

また、次のように、Tmuxコマンドset-bufferを使用して、バッファにデータを明示的に設定することもできます。

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

そして、paste-buffer Tmuxコマンドを使用して、インタラクティブに入力されたかのように、結果をペインに貼り付けます。

私がしたいことlikeそれなら、これらの線に沿った何かです:

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

もちろん、SET TERM/ ...ビットは、OpenVMSで端末の高さと幅をそれぞれ明示的に設定します。

ただし、残念ながら、set-bufferコマンドのdataパラメータは「特別な変数」の置換を受けていないようです。

私はOpenVMSとTmuxの両方にやや新しいので、ここで必要なことをどのように行うことができるかについてのガイダンスが必要です。別の方法としては、常に特定のサイズの端末を使用し、そのサイズをLOGIN.COMスクリプトにハードコーディングすることだと思いますが、能力である「一等賞」が欲しいです。これを動的に設定します(上記のアイデアを機能させることができれば、もちろんbind-key設定を使用してすばやく呼び出すことができます)。

1
Eric Smith

Tmuxのrun-Shellコマンドを使用できます-manページに従って:

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

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

FORMATSセクションでは、「#{pane_width}」などの置換操作を使用して文字列をフォーマットする方法について説明します。

したがって、run-Shellを使用すると、シェルスクリプトを呼び出して、Tmuxセッション、クライアント、ウィンドウ、またはペインに関連する任意の情報を渡すことができます。 Tmux alsoは、コマンドラインからペインに向けてサーバーにコマンドを発行できるようにします。端末の幅と高さを設定するためにDCLコマンドを発行するために必要なシェルスクリプトは次のようになります。

#!/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

残っているのは、run-Shellを呼び出すバインドされたキーを設定し、上記のスクリプトを呼び出して、それを唯一の引数として「現在の」ペイン識別子として渡すことです。

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

それを~/.tmux.confに入れて、ログインした後、簡単なC-b C-rで設定します。

1
Eric Smith