简化 OpenVMS 上的终端大小调整

简化 OpenVMS 上的终端大小调整

我对 OpenVMS 有些陌生,但仍在尝试“完成工作”,我想让设置终端高度和宽度变得更容易一些。

目前我可以通过 SSH 连接到基于 OpenVMS-8.4 的服务器(从我的 Tmux 会话内的窗格),但是与 Linux 不同,DCL 命令 shell 不会自动获取我的终端大小。

也就是说,通过 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..."

并将结果粘贴到窗格,就像使用 Tmux 命令以交互方式输入一样paste-buffer

我想喜欢然后要做的事情如下:

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

当然,该SET TERM/ ...位在OpenVMS中分别明确设置了终端的高度和宽度。

data但遗憾的是,该命令的参数似乎set-buffer没有经过“特殊变量”替换。

由于对 OpenVMS 和 Tmux 都不太熟悉,我需要一些指导,以便了解如何完成我需要做的事情。我想另一种方法是总是使用特定大小的终端并在我的脚本中对大小进行硬编码LOGIN.COM,但我想要“一等奖”,即能够动态设置它(如果我可以让上述想法发挥作用,我当然会使用设置bind-key以便能够快速调用它)。

答案1

您可以使用 Tmux 的run-shell命令 - 按照手册页:

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

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

格式部分描述了如何通过替换操作(例如“ ”)来格式化字符串#{pane_width}

因此,run-shell可以调用 shell 脚本,并向其传递与 Tmux 会话、客户端、窗口或窗格相关的任何信息。Tmux允许从命令行向服务器发出针对窗格的命令。发出 DCL 命令来设置终端宽度和高度所需的 shell 脚本如下:

#!/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将快速为您设置一切。

相关内容