xtermでは、キーボードのHOMEキーを押すと正常に送信されますが、^[[H
開くと次のようにemacs -nw
変更されます。私は自分の端末を作成しようとすると、emacsで動作しないことがわかりました。ただし、xterm(またはemacs)が動作を変更する原因が何であるかはわかりません。^[OH
home
khome
^[[H
また
home
「必要な」キーは、andkhome
(通常使用するホームキー、Num Lockがオフになっているキーボードの1)に対応します。 xevで異なるとマークしても、試みたすべての端末で常に同じことを行います。したがって、この質問の残りの部分ではこれらを同じものとして扱います。- ptyの設定に関係がないようです。 Emacsを開いた状態で設定をコピーし、それを実行して適用し
stty -g
ましcat -v
たが、まだEmacsではない動作が発生します。 (下記のデモ) - bashのreadlineは、emacsおよび/またはTERM変数を読むよりも受け入れやすいようです。なぜなら、どの端末を試しても、HOMEは常にbashで動作するからです。
私の実験は次のとおりです。
xterm
端末情報の取得:
$ tty
/dev/pts/1
$ echo $TERM
xterm
$ infocmp $TERM | grep home
el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
HOMEキーを押してからReturnキーを押してcat -v
終了します。
$ cat -v
^[[H
^[[H
^C
Emacsを開く
$ emacs -nw
ホームキーの動作を試してみてください(動作します。動画は公開しません)
C-q
キーの送信内容を確認するには、以下を使用してください。
[
一方、他の端末(xtermである必要はありません)からemacs pty設定をコピーします。
$ emacs_settings=$(stty -F /dev/pts/1 -g)
$ echo $emacs_settings
4001:1:bf:a31:7:7:7f:15:4:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:
その後、emacsを終了してcat -v
再起動します。
$ cat -v
その後、2番目の端末に戻ります。 xterm ptyをemacsで使用される設定にリセットします。
$ stty -F /dev/pts/1 $emacs_settings
次に、xtermで再度homeを押します。 (その後、returnを押して終了します)
$ cat -v
^[[H^M
これはemacs以外のコードと同じです。誰かがemacsに挿入したコードhome
ではなくコードです。khome
これで自宅でこれを試して終了するには、cat -v
emacs設定がいくつかのキーを変更するため、ctrl + Cの代わりにctrl + Gを使用する必要があります。これは設定が機能することを証明します。終了行の末尾に^ Gはありませんが、キャリッジリターンがあることを見ることもできます。エコ設定が変更され、生モードになっているようです。
質問がある場合は、人間が読めるemacs ptyの設定をご覧ください。
$ stty -F /dev/pts/1 -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^G; quit = ^G; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>;
rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
その他端末
linux
$ infocmp linux | grep home
home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
これはスクリーンショットを撮るのは簡単ではありません(写真を撮ることはできますが撮れません)
要約すると、HOMEキーはemacsにあるかどうかにかかわらず、端末設定から送信され、khome
常にemacsで動作します。
MATE端末( xterm-256color
)
$ echo $TERM
xterm-256color
$ infocmp $TERM | grep home
el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
$ cat -v
^[[H
^[[H
^C
しかし、再びemacsの内部に送信されます^[OH
!だから彼らは再び異なります。以前はこれをどう見逃したのか分からない。 MATE端末はxcodeの機能を完全に実装したり、同じコンポーネントの一部を使用しているようです。
一方:
追い越し( xterm-256color
)
この場合はkhome
転送を続け、HOMEキーはまだ期待どおりに機能しているようです。
$ echo $TERM
xterm-256color
$ cat -v
^[OH
^[OH
^C
$ emacs -nw
$ # ... ^[OH again
tmux(MATE端末から)screen
TERM
tmuxがいつに設定されたのかscreen
、いつに設定されたのかはわかりませんが、tmux
今日このコンピュータ、このホスト端末ではscreen
。
$ echo $TERM
screen
$ infocmp $TERM | grep home
enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG,
khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
$ cat -v
^[[1~
^[[1~
^C
$ emacs -nw
$ # also ^[[1~ with C-q inside emacs
集める
- 一部の端末は
khome
常に送信しますが、他の端末は残りの時間khome
Emacs 内部に送信します。home
khome
どちらもhome
bash readline で動作しますが、khome
emacs でのみ動作します。または、emacsで利用可能な固定ホームキーのリストがあります(基本設定について話しています)。 emacsが得られないので、固定リストに向かって傾いています。行動を変えるTERM
大きな問題
xterm(およびMATE端末)は、emacsが開かれたときに送信されるコードをどのように変更しますか?
私が考えることができるいくつかの推測は次のとおりです。
a) xterm には emacs 用の特別な規則があります b) emacs には emacs 用の特別な規則がありますxterm
c) emacs はこの問題を引き起こすように端末設定を変更しますが、設定が何であれ、cat
cat がその設定を使用するようにします.すると変わり続ける
言及できる小さな問題
home
キーが一致し、khome
その値が送信されるように見えないのはなぜですか?- emacs(デフォルト)はそれに応じて動作を変更しますか
TERM
?
答え1
どういう意味ですか?キーボード適用モード、記録済みXTerm制御シーケンス:
The home- and end-keys (unlike PageUp and other keys also on the 6-key
editing keypad) are considered "cursor keys" by xterm. Their mode is
also controlled by the DECCKM escape sequence:
Key Normal Application
---------+----------+-------------
Home | CSI H | SS3 H
End | CSI F | SS3 F
---------+----------+-------------
有効/無効DECCKM
:
CSI ? Pm h
DEC Private Mode Set (DECSET).
Ps = 1 ⇒ Application Cursor Keys (DECCKM), VT100.
渡すsmkx/rmkx
能力は端末の説明(infocmpを使用してこれを見ることができます):
rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>,
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=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
sgr0=\E(B\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=,
vpa=\E[%i%p1%dd, E3=\E[3J, use=ansi+csr, use=ansi+enq,
use=ansi+idl, use=ansi+inittabs, use=ansi+local,
use=ansi+pp, use=ansi+sgrbold, use=xterm+kbs,
use=xterm+alt+title, use=att610+cvis, use=xterm+acs,
use=xterm+meta,
(非画面アプリケーションは通常端末を初期化しませんが、フルスクリーンアプリケーションは通常初期化します。各場合、ハードコードされた項目は無視されます。)