舊 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 裝置驅動程式本身中完成的,應用程式(catsed...)看不到這些字元。

eol設定只是告訴驅動程式將換行符(又稱換行符,又稱換行符^J)中的不同(附加)字元識別為行結束字元。輸入該字元後,線路規則會將目前輸入的字元傳送到閱讀應用程式。

例如,要一次輸入一個單字而不是一次一行輸入文本,您可以這樣做:

stty eol ' '; cat

您會看到每次按空格時,cat都會輸出您輸入的文字(包括空格字元)。

如果您處於實現其自己的行編輯器的命令的提示符處,則將End遊標移至當前緩衝區的末尾將不會通過stty而是通過該命令的特定配置(如果有的話)來完成。

例如,對於zshshell,可以透過以下方式完成:

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

假設當您按照“F”的建議按下該鍵時,您的終端發送<ESC>[F或字元序列。<ESC>OFEnd

某些應用程式會自動綁定End到它們的_end-of_line_操作。為此,他們將查詢本地 termcap 或 terminfo 終端資料庫,以找出您的終端在按下該鍵時發送的字元序列。

為此,他們使用$TERM變數。如果該資料庫中該金鑰的條目與您的終端發送的內容不匹配,則該操作將無法運作。

你可以試試:

tput kend | sed -n l

若要查看密鑰發送的資料庫內容End(如果您的 tput 使用 terminfo)或檢查 /etc/termcap 中的 $TERM 條目(如果使用 termcap)。您也許可以在那裡找到與您的 minicom(或託管它的終端仿真器)行為更匹配的條目。

根據新資訊進行編輯

因此,最有可能的是,您正在類似minicom現代的終端中運行xterm並透過串行進行通訊。在串行線的另一端,getty假設您正在運行 at386 控制台(我相信它實際上是舊的基於 PC 的 AT&T 系統的內部控制台驅動程式)。這與現代的 xterm 相差甚遠。

看看這裡的 Solaris 系統,它在許多方面與舊的 AT&T 系統一樣現代,xtermterminfo 中有一個條目,但它缺乏該kend功能。

您可以做的是將終端機的 terminfo 定義上傳到運行 minicom 的計算機上 ( infocmp > file),將其傳輸到 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

相關內容