[英]xterm reports wrong escape sequences on raw input
我目前正在嘗試在 Linux 中進行原始輸入(例如,我通常使用 ncurses 或類似的東西)。
我已經做到了,每一個按鍵都直接報告給我的應用程序,並作為一系列十六進制代碼轉儲。
如果我按鍵盤上的“a”鍵,我會得到這個 output:
# hex string
00 0x61 'a'
這很簡單。 0x61 是 ASCII 'a' 的十六進制代碼,我可以反過來使用(char) 0x61
將其打印回控制台。
現在我正在嘗試進行基本的行編輯。 如果我按下左箭頭鍵,例如使用xterm
,我會得到這個 output:
# hex string
00 0x1B '\x1b'
01 0x5B '['
02 0x44 'D'
根據這個網站,在“鍵盤處理”部分,
左箭頭 [...] 發送的代碼可以作為
kcub1
給出。
根據 termcap 文件,序列應該是x1b OD
:
~ infocmp xterm | grep kcub1
kcub1=\EOD
雖然這發生在xterm和termite中,但它不會在默認的 tty 或urxvt中。
轉義序列 [...] 被選為“PC 風格”代碼(如 SCO“ansi”),即
ESC [ H ESC [ F
對於正常模式,和
ESC OH ESC OF
適用於 cursor 應用模式
我想我必須將 xterm 設置為“正常模式”或將 termcap 文件中的所有 O 替換為“[”?
閱讀箭頭鍵以支持 xterm 和非 xterm 終端的最佳方式是什么?
然后,還有cub
能力:
cub=\E[%p1%dD
在同一頁上,還有一個關於“參數化字符串”的部分。 我想這就是 cub 能力中的%p1%d
所指的嗎?
%p1
指的是“push first parm”, %d
指的是“print pop() as in printf”。
這是什么意思呢? 什么被推到哪里? 我在任何時候都不會調用 pop() ,第二個選項是什么意思?
感謝您提前提供任何幫助。
編輯:這是一個小的 C 程序,它演示了我在說什么。 如果我使用gcc kilo.c
編譯並運行它,按左箭頭鍵會發出27 91 ('[') 68 ('D')
。 注意左括號而不是預期的O
。
終端描述的特殊鍵列表是假設應用程序已將終端初始化為全屏模式,使用特殊鍵的應用程序模式而不是初始正常模式。 命令行應用程序通常不這樣做(它們當然可以:查找smkx
和rmkx
)。
進一步閱讀:
為什么我不能在(無論如何)shell 中使用 cursor 鍵? 在 xterm 常見問題解答中
xterm 手冊中的特殊鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.