如何在 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
)中的不同(附加)字元識別為行結束字元。輸入該字元後,線路規則會將目前輸入的字元傳送到閱讀應用程式。
例如,要一次輸入一個單字而不是一次一行輸入文本,您可以這樣做:
stty eol ' '; cat
您會看到每次按空格時,cat
都會輸出您輸入的文字(包括空格字元)。
如果您處於實現其自己的行編輯器的命令的提示符處,則將End遊標移至當前緩衝區的末尾將不會通過stty
而是通過該命令的特定配置(如果有的話)來完成。
例如,對於zsh
shell,可以透過以下方式完成:
bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line
假設當您按照“F”的建議按下該鍵時,您的終端發送<ESC>[F
或字元序列。<ESC>OF
End
某些應用程式會自動綁定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 系統一樣現代,xterm
terminfo 中有一個條目,但它缺乏該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