前のAT&T Unixのstty:「行末」に終了キーを追加するには?

前のAT&T Unixのstty:「行末」に終了キーを追加するには?

Emacsモードでctrl+キーボードの組み合わせを使用して行の末尾に移動し、同時に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デバイスドライバ自体で行われ、これらの文字はアプリケーション(cat、...)sedには表示されません。

このeol設定では、ドライバは^J改行文字(または改行文字とも呼ばれる)内の他の(追加)文字を行末文字として認識するように指示します。文字が入力されると、Line Rulesはこれまで入力した文字を読み取りアプリケーションに送信します。

たとえば、一度に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一部のアプリケーションは行末操作に自動的にバインドされます。これを行うには、ローカルのtermcapまたはterminfo端末データベースを照会して、キーが押されたときに端末から送信された文字シーケンスを見つけます。

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

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

tput kend | sed -n l

キーが送信されたデータベースの内容を表示するにはEnd(tputがterminfoを使用している場合)、または/ etc / termcapで$ TERMエントリを確認してください(termcapを使用している場合)。ミニコム(またはそれをホストするターミナルエミュレータ)の動作とよりよく一致するものを見つけることができます。

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

したがって、おそらくminicom最新の端末と同じデバイスで実行され、xtermシリアルを介して通信しています。シリアルラインのもう一方の端でgettyat386コンソール(実際には古いPCベースのAT&Tシステム用の内部コンソールドライバだと思います)を実行しているとしましょう。これは現代のxtermとは遠い。

多くの点で、従来のAT&Tシステムと同じくらい現代的なSolarisシステムを見ると、xtermterminfoには項目がありますが、そのkend機能が欠けています。

あなたができることは、端末のterminfo定義をminicom(infocmp > file)を実行しているマシンにアップロードし、それをSysVマシンに転送してそこでコンパイルすることです(そしてそこと同じ値にtic設定し、環境変数を事前にのように設定します。 Curssバージョンが古すぎて機能しない場合は、AT&Tシステム用のvt100エントリを代わりに使用できます。端末で編集して名前を変更してから、もう一度使用してください。$TERMTERMINFO~/.terminfokend=\EOFtic

良い:

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

おすすめ記事