Tại sao khóa END không có mục terminfo?


8

Trên hệ thống Debian, nhấn ENDphím tạo ^[[F:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[F     27 0033 0x1b
         91 0133 0x5b
         70 0106 0x46

Nhưng tại sao keychord này không có trong terminfo ?

$ infocmp -1 | grep end
kend=\EOF,

Tuy nhiên, ncurses quản lý để nhận ra nó là chính xác KEY_END. Làm sao?

TERMxterm-256color

BTW, động lực đằng sau có kendendthay vì chỉ là endgì? (giống nhau cho khomehome)

BIÊN TẬP

Như đã nói trong nhận xét của Johan Myréen, khomechuỗi là chuỗi nhấn phím Home tạo ra. Nhưng trên Debian, nhấn phím Home sẽ tạo ra home. Tại sao?

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[H     27 0033 0x1b
         91 0133 0x5b
         72 0110 0x48
$ infocmp -1 | grep home
    home=\E[H,
    khome=\EOH,

1
Sự khác biệt giữa homekhomekhomechuỗi là chuỗi nhấn phím Home tạo ra, trong khi homechuỗi là chuỗi nên được gửi đến thiết bị đầu cuối để di chuyển con trỏ đến vị trí nhà. Theo hiểu biết của tôi, terminfo không xác định một endkhả năng, chỉ kend.
Johan Myréen

@ JohanMyréen Bạn có thể giải thích "vị trí nhà" của một con trỏ với một ví dụ là gì không? Và tại sao kendđược định nghĩa như \EOFtrong terminfo , trong khi thiết bị đầu cuối tạo ra \E[F? Đây có phải là một lỗi trong terminfo của Debian không? Và làm thế nào ncurses quản lý để phát hiện nó như KEY_ENDthế nào?
Igor Liferenko

Vị trí nhà là góc trên bên trái của màn hình.
Johan Myréen

Câu trả lời:


10

Câu trả lời của Johan Myréen rất gần, nhưng không chính xác vấn đề: hầu hết các trình giả lập thiết bị đầu cuối mà bạn sẽ sử dụng đều có chế độ bình thườngứng dụng cho các phím đặc biệt. Mô tả thiết bị đầu cuối được viết cho một chế độ, tương ứng với những gì ứng dụng toàn màn hình sử dụng. Các ứng dụng khác (như vỏ tương tác ) thường không khởi tạo màn hình để sử dụng chế độ ứng dụng . Bash là một ví dụ về điều đó.

Ở chế độ bình thường , xterm và các thiết bị đầu cuối tương tự gửi escape[(CSI) trong khi ở chế độ ứng dụng , bàn phím của chúng sẽ gửi escapeO(SS3). Trong cú pháp terminfo, lối thoát đó là \E. Vì vậy, infocmpcho bạn thấy rằng mô tả sử dụng chế độ ứng dụng. Các homekhả năng sẽ được gửi đến thiết bị đầu cuối, nói với nó như thế nào để di chuyển con trỏ đến nhà vị trí (trên trái), và không giống như khome(gửi từ thiết bị đầu cuối sử dụng bàn phím).

Các ứng dụng toàn màn hình (chẳng hạn như các ứng dụng sử dụng mật mã) có thể gửi các chuỗi khả năng của thiết bị đầu cuối để khởi tạo bàn phím. Một số mô tả thiết bị đầu cuối đưa thiết bị đầu cuối vào chế độ ứng dụng, một số thì không.

Việc sử dụng kendso với endlà một quy ước đặt tên: trong terminfo theo quy ước, bất kỳ tên nào bắt đầu bằng k đều đề cập đến một phím đặc biệt (phím chức năng, phím con trỏ, phím bàn phím) để làm rõ rằng đây là các chuỗi được đọc bởi một ứng dụng. Ví dụ: kcub1( phím lùi con trỏ ) khác với cub1(di chuyển con trỏ trở lại một cột).

ncurses nhận ra khóa KEY_ENDvì ứng dụng bạn đang sử dụng sẽ gọi keypadhàm để khởi tạo thiết bị đầu cuối bằng cách sử dụng smkx(mnemonic có nghĩa là "bắt đầu chế độ truyền bàn phím"). Điều đó có thể / có thể không thực sự bật chế độ ứng dụng. Mô tả thiết bị đầu cuối của giao diện điều khiển Linux thì không, xterm thì không.

Về nguyên tắc, bạn có thể sử dụng tputđể chuyển đổi chế độ (và nhận các kết quả khác nhau từ showkey):

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[H     27 0033 0x1b
         91 0133 0x5b
         72 0110 0x48
^C        3 0003 0x03
^D        4 0004 0x04
$ tput smkx
$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[OH     27 0033 0x1b
         79 0117 0x4f
         72 0110 0x48

Như một sự phức tạp, những lời nguyền sẽ chỉ nhận ra một tên cho một chuỗi. Một số thiết bị đầu cuối (như xterm) mô phỏng các thiết bị đầu cuối phần cứng cũ hơn bằng cách sử dụng các tên khác nhau cho các phím trên bàn phím chỉnh sửa. Trong Câu hỏi thường gặp về xterm được liệt kê bên dưới, có khả năng đặt tên phím "Trang chủ" đó là "Chèn" ...

Đọc thêm:


Có, tôi đang sử dụng keypadchức năng. Nhưng với câu hỏi "làm thế nào ncurses quản lý để phát hiện nó là KEY_END" Tôi có nghĩa là "làm thế nào keypadgiải mã ^[[Fthành kend" (xem xét việc keypadsử dụng cơ sở dữ liệu terminfo để giải thích các keychords). Nếu tôi hiểu chính xác, điều này xảy ra bởi vì showkey -aở chế độ con trỏ, trong khi ứng dụng ncurses ở chế độ ứng dụng.
Igor Liferenko

showkeykhông chuyển đổi giữa các chế độ bình thường / ứng dụng. Đây là một chương trình dành riêng cho Linux, đưa ra các giả định về bảng điều khiển Linux, thay vì sử dụng cơ sở dữ liệu đầu cuối
Thomas Dickey

Nếu showkeykhông chuyển đổi giữa các chế độ, thì nó sử dụng một số trạng thái mặc định, bất cứ điều gì nó có thể được gọi. Vấn đề là showkeybản in ^[[F, không ^[OF, dẫn đến sự nhầm lẫn của tôi. (Tôi chỉ sử dụng showkeyđể đại diện trực quan cho keychord thực tế đang được gửi bởi thiết bị đầu cuối bằng cách nhấn vào nút bàn phím, mà không nghi ngờ rằng có thể có một số sự tinh tế liên quan.)
Igor Liferenko

Có, đó là chế độ "bình thường" (cách thông thường để đề cập đến điều này). Tất nhiên bạn có thể khởi tạo thiết bị đầu cuối của mình bằng cách sử dụng tput smkxvà nhận được các kết quả khác nhau.
Thomas Dickey

Tôi nghĩ rằng có một lỗi trong lesstiện ích: nó tự đặt mình vào chế độ ứng dụng, nhưng sau đó không thể giải thích phím enter. Tôi có nên gửi báo cáo lỗi không? (Bạn có thể kiểm tra điều này bằng cách bắt đầu lessvà nhấn phím phím Enter sau khi gõ /- nó sẽ ra ESCOM, thay vì làm những gì nhập từ khóa cần phải làm.)
Igor Liferenko

5

Vấn đề với phím Home là các thiết bị đầu cuối vật lý và sau đó là trình giả lập thiết bị đầu cuối mô phỏng chúng có hai chế độ: Chế độ bình thường và Chế độ ứng dụng và các chuỗi thoát khác nhau tùy thuộc vào chế độ của thiết bị đầu cuối. Terminfo không đối phó tốt với điều này. Ở chế độ bình thường (còn gọi là "Chế độ con trỏ"), chuỗi thoát phím Kết thúc là ESC [ F, ở chế độ Ứng dụng ESC O F. Googling cho vấn đề này cho thấy toàn bộ sự lộn xộn.

Chỉnh sửa từ nguồn terminfo:

sau đó các phím con trỏ được coi là ở "Chế độ con trỏ" và các định nghĩa của các phím con trỏ phải khớp với giả định đó, nếu không thì ứng dụng có thể thất bại. Người ta cũng hy vọng rằng các ứng dụng sẽ luôn truyền chuỗi đến thiết bị đầu cuối trước khi chúng thoát. "


Quy trình chuyển sang "chế độ ứng dụng" là gì? Nó được thực hiện bởi ncurses ?
Igor Liferenko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.