Будучи несколько «зеленым» с OpenVMS, но все еще пытаясь «закончить работу», я хотел бы немного упростить настройку высоты и ширины терминала.
В настоящее время я могу подключиться по SSH к серверу на базе OpenVMS-8.4 (из панели в моем сеансе Tmux), но, в отличие от 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: 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..."
И вставьте результат в панель, как если бы он был введен в интерактивном режиме, используя paste-buffer
Команда tmux.
Что бы я лайк тогда делать что-то в этом роде:
:setb "SET TERM/PAGE=#{pane_height}/WIDTH=#{pane_width}";\
pasteb;\
send Enter
Конечно, SET TERM/ ...
bit явно устанавливает высоту и ширину терминала в OpenVMS соответственно.
К сожалению, похоже, что data
параметр set-buffer
команда не подвергается замене "специальной переменной".
Поскольку я новичок как в OpenVMS, так и в Tmux, мне нужны некоторые рекомендации относительно того, как я могу делать то, что мне нужно здесь. Альтернатива, я думаю, просто всегда использовать терминал определенного размера и жестко запрограммировать размер в моем LOGIN.COM
скрипт, но я бы хотел "первый приз", то есть возможность устанавливать это динамически (если бы я мог заставить описанную выше идею работать, я бы, конечно, использовал bind-key
настройка, чтобы иметь возможность вызывать его быстро).
Вы можете использовать Tmux run-shell
команда - согласно странице руководства:
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 также позволяет отправлять команды серверу, направленные на панель из командной строки. Необходимый сценарий оболочки для выдачи команды 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
все настроит для вас.