我对 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: 80
和Page: 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
将快速为您设置一切。