Облегчение размеров терминала на OpenVMS

Будучи несколько зеленоватым с 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/ ... бит явно устанавливает высоту и ширину терминала соответственно в 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 ...

Раздел 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 будет настраивать вещи для вас.

Другие вопросы по тегам