古い AT&T UNIX の stty: 「行末」の End キーを追加するにはどうすればよいでしょうか?

古い AT&T UNIX の stty: 「行末」の End キーを追加するにはどうすればよいでしょうか?

ctrlemacs モードで+キーボードの組み合わせを使用しeて行末に移動し、Endキーを使用して同じ操作を行うにはどうすればよいでしょうか。stty でこれを設定するにはどうすればよいですか。Linux ターミナルからコピーした次の組み合わせを試しました。

stty eol M-^?

しかし、押すとキーボードEndが表示されますF

システムは、minicom端末上の古いATT System Vです。私の用語は386ATで、これはterminfoの定義です。

#       Reconstructed via infocmp from file: /usr/share/lib/terminfo/3/386AT
AT386|at386|386AT|386at|at/386 console @(#)386.ti 1.4,
        am, bw, eo, xon,
        colors#8, cols#80, lines#25, ncv#3, pairs#64,
        acsc=``aaffggjYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
        cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB,
        cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%02d;%p2%02dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[1M,
        ed=\E[J, el=\E[K, flash=^G, home=\E[H, ht=\t,                                                                   
        ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,                                                             
        ind=\E[S, indn=\E[%p1%dS, invis=\E[9m, is2=\E[0;10m,                                                            
        kbs=\b, kcbt=^], kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,                                                            
        kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y,                                                                  
        kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,                                                            
        kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,                                                               
        kf8=\EOW, kf9=\EOX, khome=\E[H, kich1=\E[@, knp=\E[U,                                                           
        kpp=\E[V, krmir=\E0, op=\E[0m,                                                                                  
        pfx=\EQ%p1%{1}%-%d'%p2%s', rev=\E[7m, rin=\E[S,                                                                 
        rmacs=\E[10m, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm,                                                           
        setaf=\E[3%p1%dm,                                                                                               
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%;%?%p7%t;9%;m,                        
        sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,   

答え1

このeol設定は、行編集バッファの末尾に移動するキー用ではなく、tty 行制御の設定です。

これは、独自のラインエディタを持たないアプリケーション( cat、など)に入力するときに使用する、非常に基本的なラインエディタです。このエディタにはカーソル位置指定機能がなく、sed編集stty eraseバックスペース ( )、Ctrl+W ( stty werase)、Ctrl+U ( )で実行できますstty kill(システムによってはそれ以上の場合もあります)。

これはカーネル内の tty デバイス ドライバー自体で行われるため、アプリケーション ( catsed...) はそれらの文字を認識しません。

このeol設定は、そのドライバーに、ラインフィード (別名、改行^J) とは異なる (追加の) 文字を行末文字として認識するように指示するだけです。その文字を入力すると、ライン ディシプリンは、それまでに入力された文字を読み取りアプリケーションに送信します。

たとえば、テキストを 1 行ずつではなく 1 単語ずつ入力するには、次のようにします。

stty eol ' '; cat

catそして、スペースキーを押すたびに、入力したテキスト(スペース文字を含む)が出力されることがわかります。

独自の行エディターを実装するコマンドのプロンプトが表示されている場合は、Endカーソルを現在のバッファーの末尾に移動することは、そのコマンドを介してではなくstty、そのコマンドの特定の構成によって実行されます (実行される場合)。

たとえば、zshシェルの場合は次のようにします。

bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line

「F」が示すように、そのキーを押すと、端末が<ESC>[Fまたは文字シーケンスを送信すると仮定します。<ESC>OFEnd

一部のアプリケーションは、自動的に _end-of_line_ アクションにバインドしますEnd。これを行うには、ローカルの termcap または terminfo 端末データベースを照会して、キーが押されたときに端末が送信する文字シーケンスを調べます。

そのために、$TERM変数を使用します。データベース内のそのキーのエントリが端末から送信されるものと一致しない場合、それは機能しません。

あなたが試すことができます:

tput kend | sed -n l

tput が terminfo を使用している場合は、データベースがEndキーを送信する内容を確認するか、termcap を使用している場合は、/etc/termcap の $TERM エントリを確認します。そこで、minicom (またはそれをホストする端末エミュレーター) の動作に最も近いエントリを見つけることができる場合があります。

新しい情報に基づいて編集する

したがって、おそらく、minicom最新の のような端末で実行しxterm、シリアル経由で通信していることになります。シリアル ラインのもう一方の端では、gettyat386 コンソール (実際には古い PC ベースの AT&T システムの内部コンソール ドライバーであると思われます) を実行していると想定されます。これは、最新の xterm とはかけ離れています。

ここで、多くの点で古い AT&T システムとほぼ同じくらい新しい Solaris システムを見ると、xtermterminfo にエントリはありますが、機能が欠けていますkend

できることは、minicom を実行しているマシン ( infocmp > file) に端末の terminfo 定義をアップロードし、それを SysV マシンに転送して、そこでコンパイルしてみることですtic($TERMそこで と同じ値に設定し、管理者でない場合はTERMINFO事前に環境変数を などに設定します~/.terminfo)。curses のバージョンが古すぎるためにこれが機能しない場合は、代わりに AT&T システムの vt100 エントリを使用し、kend=\EOF端末の を編集して名前を変更し、tic再度使用できます。

のように:

cat > my-term.info << \EOF
my-term|My VT100 compatible terminal with an end-key,
    am, mir, msgr, xenl, xon,
    cols#80, it#8, lines#24, vt#3,
    acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
    clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n,
    cuf=\E[%p1%dC, cuf1=\E[C$<2>,
    cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
    cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>,
    el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=\t,
    hts=\EH, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=\b,
    kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP,
    kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
    kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8,
    rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmkx=\E[?1l\E>,
    rmso=\E[m$<2>, rmul=\E[m$<2>,
    rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
    sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
    sgr0=\E[m^O$<2>, smacs=^N, smkx=\E[?1h\E=,
    smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, kend=\EOF
EOF
TERMINFO="$HOME/.terminfo" export TERMINFO
mkdir -p "$TERMINFO"
tic my-term.info

そして次のように付け加えます:

if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
  TERMINFO=$HOME/.terminfo
  TERM=my-term
  export TERM TERMINFO
fi

~/.profile(シリアル経由でログインしたときに出力されるものはすべてここにthe-serial-deviceあります。tty

関連情報