xtermはemacsの "home"キーの動作を変更するようです。

xtermはemacsの

xtermでは、キーボードのHOMEキーを押すと正常に送信されますが、^[[H開くと次のようにemacs -nw変更されます。私は自分の端末を作成しようとすると、emacsで動作しないことがわかりました。ただし、xterm(またはemacs)が動作を変更する原因が何であるかはわかりません。^[OHhomekhome^[[H

また

  • home「必要な」キーは、and khome(通常使用するホームキー、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キーの送信内容を確認するには、以下を使用してください。

[^OH xtermのemacsから

一方、他の端末(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 -vemacs設定がいくつかのキーを変更するため、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

TERMtmuxがいつに設定されたのか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常に送信しますが、他の端末は残りの時間khomeEmacs 内部に送信します。home
  • khomeどちらもhomebash readline で動作しますが、khomeemacs でのみ動作します。または、emacsで利用可能な固定ホームキーのリストがあります(基本設定について話しています)。 emacsが得られないので、固定リストに向かって傾いています。行動を変えるTERM
大きな問題

xterm(およびMATE端末)は、emacsが開かれたときに送信されるコードをどのように変更しますか?

私が考えることができるいくつかの推測は次のとおりです。

a) xterm には emacs 用の特別な規則があります b) emacs には emacs 用の特別な規則がありますxterm c) emacs はこの問題を引き起こすように端末設定を変更しますが、設定が何であれ、catcat がその設定を使用するようにします.すると変わり続ける

言及できる小さな問題
  • 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,

(非画面アプリケーションは通常端末を初期化しませんが、フルスクリーンアプリケーションは通常初期化します。各場合、ハードコードされた項目は無視されます。)

おすすめ記事