Có thiết bị đầu cuối linux nào có thể xử lý tất cả các tổ hợp phím không?


11

Tôi thích sử dụng emacs trong chế độ đầu cuối ( -nw), nhưng có vẻ như hầu hết (tất cả?) Thiết bị đầu cuối không thể xử lý một số kết hợp chính - ví dụ: C-<RET>hoặc C-M-%. Tôi biết điều này là do hầu hết các thiết bị đầu cuối mô phỏng VT-100, không có các kết hợp này. Có bất kỳ thiết bị đầu cuối linux nào (tốt nhất là KDE) có thể xử lý các tổ hợp phím này hay đây là giới hạn cơ bản của tất cả các thiết bị đầu cuối?

Câu trả lời:


15

Khi bạn nhấn một phím hoặc tổ hợp phím trong một thiết bị đầu cuối, nó được truyền đến ứng dụng đang chạy trong thiết bị đầu cuối dưới dạng một chuỗi gồm một hoặc nhiều ký tự. Ví dụ, khi bạn nhấn a, ứng dụng sẽ nhận được a. Khi bạn nhấn Enter, ứng dụng sẽ nhận được ký tự CR(hay còn gọi là ^M(phát âm là control control-emmiêu), còn gọi là ký tự số 13, aka \rhay \015). Các tổ hợp phím liên quan Altthường được truyền dưới dạng ký tự ESC(a.ka. ^[aka \ehoặc \033) theo sau là chuỗi cho tổ hợp phím hoặc khóa không có Alt. Các phím chức năng và các tổ hợp phím khác được truyền dưới dạng các chuỗi thoát bắt đầu bằng \e[hoặc \eO.

Các chuỗi thoát không được chuẩn hóa hoàn toàn và các thiết bị đầu cuối thường bỏ qua các thuộc tính nhất định cho các khóa nhất định. Ví dụ: Ctrl+ Shift+ letterthường được truyền chính xác như Ctrl+ lettertheo mặc định.

Bạn có thể thấy những gì thiết bị đầu cuối của bạn gửi cho một tổ hợp phím bằng cách nhấn Ctrl+ Vtheo sau là tổ hợp phím đó trong dấu nhắc shell hoặc C-qhoặc C-h ctheo sau là tổ hợp phím trong Emacs.

Với một số trình giả lập thiết bị đầu cuối, bạn có thể định cấu hình các chuỗi thoát cho mỗi khóa. Trên xterm, điều này được thực hiện thông qua các nguồn tài nguyên X . Hầu hết các thiết lập đọc tài nguyên từ ~/.Xresourceskhi X bắt đầu và bạn có thể tải tệp theo cách thủ công xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

Một quy ước chung sử dụng các chuỗi thoát của biểu mẫu ESC [ number1 ; number2 ~cho các phím chức năng với các sửa đổi. number1chỉ ra phím chức năng ( 15để 24cho F5tới F12- vì những lý do lịch sử, F1 qua F4có trình tự thoát khác nhau) và number2chỉ ra các sửa đổi ( 2cho Shift, 5cho Ctrl, 3cho Meta, 8cho Ctrl+ Meta, và thêm 1 + Shift- không có, nó không phải là rất phù hợp).

Emacs chuyển các chuỗi thoát thành biểu diễn khóa bên trong của nó thông qua input-decode-maphoặclocal-function-key-map (hoặc function-key-maptrước Emacs 23).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

Vì vậy, nếu tôi hiểu điều này một cách chính xác, trước tiên tôi cần xác định một chuỗi thoát trong thiết bị đầu cuối của mình, tương ứng với một số tổ hợp phím. Sau đó, trong emacs, tôi cần ánh xạ chuỗi thoát trở lại tổ hợp phím. Trình tự thoát có thể là tùy ý, miễn là nó không xung đột với những gì được xác định trong infocmp $TERM?
Yossarian

2
@Yossary Có. Ngoài việc không xung đột, các chuỗi thoát cần phải rõ ràng, tức là không có chuỗi thoát nào phải là tiền tố của một chuỗi khác. Điều này có nghĩa là trong thực tế, ký tự đầu tiên phải là ESC(trừ khi bạn muốn thử một số ký tự ≥128, nhưng điều đó sẽ hạn chế các mã hóa đầu vào có thể) và ký tự thứ hai phải là thứ mà bạn không muốn ESC fooràng buộc.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi vừa mới làm tròn những gì bạn đề nghị. Có nên local-set-keythực sự define-key? Cái trước đưa ra một lỗi (số lượng đối số sai), trong khi cái sau hoạt động, ít nhất là cho <kbd> C-Enter </ kbd>. Có vẻ như konsole vẫn gặp sự cố khi gửi <kbd> CM -% </ kbd>.
Yossarian

@Yossarian Thật vậy, nó nên được define-key. Tôi không biết các phím thoát của Konsole có thể được cấu hình hay không, xterm có thể tùy biến nhiều hơn bất kỳ giải pháp thay thế nào.
Gilles 'SO- ngừng trở nên xấu xa'

1
Lưu ý rằng xterm của Thomas Dickey đang được phát triển tích cực. Với XTerm*modifyOtherKeys: 2tài nguyên, nó sẽ tạo ra các chuỗi duy nhất ngay cả đối với các C-M-kết hợp, nhưng với cài đặt đó, bạn sẽ cần cung cấp nhiều ánh xạ tùy chỉnh ( XTerm*modifyOtherKeys: 1ít khả năng hơn nhưng có nhiều chức năng hơn trong hộp). Để biết ví dụ (mặc dù không phù hợp với tôi), hãy xem xterm-extras.elthư viện và các tệp .Xresources.inputrctệp được liên kết trong phần tải xuống của Easymacs .
phils

1

Đối với một bộ khóa giới hạn nhưng có ý nghĩa, giả sử konsole của KDE, người ta có thể thực hiện các thao tác sau để có các khóa phím phức tạp trong emacs -nw:

Tôi sẽ sử dụng triển khai của S-<RET>mình để làm việc như một ví dụ:

  1. Mở một konsole mới, đi đến cài đặt -> cấu hình hiện tại -> bàn phím -> chỉnh sửa
  2. Nhấn Thêm và tạo một mục mới cho Return+Shiftvà cung cấp cho nó một chuỗi khóa hữu ích (tôi đã chọn \E[27;3đó là chuỗi khóa được gửi bởi X khi tôi chọc vào xev, nhưng điều đó có thể sai - điều quan trọng cần làm là thực hiện chắc chắn rằng nó có một lối thoát thích hợp và không xung đột với bất cứ điều gì khác).
  3. Chơi với nó trong khu vực thử nghiệm nhỏ ở phía dưới để đảm bảo nó đang hoạt động.
  4. Khởi động lại konsole.
  5. Khởi động emacs -nwvà trong bộ đệm đánh giá:

    (read-key-sequence-vector "Type your new key:")

    sau đó nhập tổ hợp phím mới của bạn.

    • Nếu bạn không quen với điều này, hãy viết dòng này ra, để con trỏ ở cuối dòng và nhấn Cx Ce để có được emacs để chạy dòng đó, nó sẽ nói với bạn bất cứ điều gì bạn đặt trong dấu ngoặc kép và chờ bạn gõ một cái gì đó.
  6. Nó sẽ nhổ ra một chuỗi chính mà bạn có thể liên kết.
    (Nó trở lại [27 91 50 55 59 51]với tôi như trái ngược với cái cũ nhàm chán [13]trước khi tôi làm hỏng việc bấm phím konsole.)

  7. Thêm vào cấu hình emacs của bạn:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Tôi đã thử nghiệm nó emacs -nwtrong một phiên màn hình bằng cách sử dụng:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

Câu trả lời ngắn gọn là nó là một giới hạn cơ bản của tất cả các thiết bị đầu cuối.

Câu trả lời dài hơn một chút là ngay cả khi ai đó tạo ra một thiết bị đầu cuối làm những gì bạn muốn, bản thân Emacs sẽ yêu cầu những thay đổi lớn để hoạt động với thiết bị đầu cuối giả định này.


Đó là một điểm tốt về emacs, điều đó thậm chí không xảy ra với tôi. Tôi đoán tôi sẽ bắt đầu sử dụng gui thay thế.
Yossarian

Đó là những gì tôi làm.
hruvulum

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.