Tại sao Emacs không thể chạy trong thiết bị đầu cuối phân biệt Ctrl +; từ ";"?


8

Câu hỏi này phát sinh từ câu hỏi trước đây của tôi về emacs beta . Nói tóm lại, tôi muốn liên kết C-;với các chức năng của Emacs trong một thiết bị đầu cuối, nhưng có vẻ như một cái gì đó đã nắm bắt được khóa này trước khi nó chạm tới Emacs: Emacs nghĩ rằng tôi đã nhấn ;.

Nghi ngờ rõ ràng là trình giả lập thiết bị đầu cuối, nhưng tôi đã kiểm tra nhiều trong số chúng (xterm, gnome-terminal, terminator, thuật ngữ) và không ai trong số chúng hoạt động. Có lẽ tôi có thể loại trừ trình quản lý cửa sổ, vì trong phiên bản GUI của Emacs, khóa C-;hoạt động tốt. Tôi cũng đã thử hai shell khác nhau: bash và zsh, nhưng một lần nữa không thành công.

Tôi có thể thử cái gì khác?


Theo câu hỏi của bạn trên Emacs , nhấn Ctrl +; gửi ;tới Emacs, vì vậy không có gì bắt được nó, những gì đang xảy ra là Ctrl +; và trần; gửi cùng thông tin Đó là cái nào: chụp (tức là Emacs không nhận được gì), hoặc mất thông tin (tức là Emacs nhận được ;)?
Gilles 'SO- ngừng trở nên xấu xa'

không có mã tiêu chuẩn cho C-;thiết bị đầu cuối. Điều gì xảy ra nếu bạn gõ C-v C-;bash trơn?
artm

@Gilles tôi thấy ;trong emacs -nwirrespectively dù tôi nhấn ;hoặc C-;.
WeSenseASoulInSearchOfAnswers

@artm bashcũng giống như emacs in trần ;.
WeSenseASoulInSearchOfAnswers

Câu trả lời:


11

Có lẽ sự nhầm lẫn của bạn phát sinh từ việc không sử dụng một thiết bị đầu cuối thực tế. Quay lại khi các máy tính nghiêm trọng có kích thước của một số tủ lạnh thẳng đứng, một thiết bị đầu cuối giao tiếp với một máy tính trung tâm qua cáp nối tiếp chỉ sử dụng các ký tự và ký tự. Các ký tự là một phần của một số bộ ký tự được tiêu chuẩn hóa, ví dụ ASCII hoặc EBCDIC, nhưng điển hình là ASCII. ASCII có 33 ký tự điều khiển và toán tử đầu cuối đã gửi chúng bằng cách nhấn một phím đặc biệt (chẳng hạn như DEL) hoặc bằng cách giữ phím CTRL và nhấn một phím khác. Máy tính trung tâm chỉ nhìn thấy ký tự điều khiển kết quả; nó không biết phím nào được nhấn để tạo ra nhân vật.

Một chương trình mô phỏng đầu cuối như xterm bắt chước hành vi đó. Trình giả lập thiết bị đầu cuối cung cấp một cách để gửi tất cả 33 ký tự điều khiển ASCII và Emacs sẽ nhận các ký tự đó nếu chúng được gửi. Nhưng Emacs giống như máy tính trung tâm trong phần mô tả ở trên --- nó không có cách nào biết được phím nào thực sự được nhấn khi bạn chạy nó dưới trình giả lập thiết bị đầu cuối. Vì vậy, nếu bạn nhấn CTRL và dấu chấm phẩy, trừ khi chương trình mô phỏng đầu cuối đã ánh xạ các phím nhấn đó sang một số ký tự ASCII, Emacs sẽ không biết rằng bất cứ thứ gì đã được gõ.

Trình giả lập thiết bị đầu cuối thường sử dụng các ánh xạ sau để tạo các ký tự điều khiển :

nhấn phím ASCII
--------------------
ESCAPE 27
XÓA 127
QUAY LẠI 8
CTRL + KHÔNG GIAN 0
CTRL + @ 0
CTRL + A 1
CTRL + B 2
CTRL + C 3
Vân vân...
CTRL + X 24
CTRL + Y 25
CTRL + Z 26
CTRL + [27
CTRL + \ 28
CTRL +] 29
CTRL + ^ 30
CTRL + _ 31

Lưu ý rằng CTRL +; không xuất hiện trong danh sách đó. Thiết bị đầu cuối sẽ thường chỉ gửi các ký tự in được giao chìa khóa nếu CTRL + chìa khóa không được ánh xạ tới một nhân vật tầm kiểm soát. Vì vậy, những gì trình giả lập thiết bị đầu cuối của bạn đang nói với bạn bằng cách gửi; một mình là nó không biết phải làm gì khi bạn nhấn CTRL +;.

Tất cả điều này chỉ áp dụng nếu bạn đang sử dụng thiết bị đầu cuối hoặc chương trình mô phỏng thiết bị đầu cuối. Nếu bạn đang chạy Emacs như một ứng dụng gốc trong một số hệ thống cửa sổ, thì Emacs có toàn quyền truy cập vào các sự kiện tổ hợp phím và không chỉ các ký tự. Vì vậy, Emacs có thể thấy rằng bạn đã nhấn CTRL và dấu chấm phẩy cùng nhau và cho phép bạn gán một hành động cho cặp tổ hợp phím đó.

Terminals thường có các phím chức năng và phím mũi tên đó cũng tạo ra các chuỗi ký tự bao gồm ký tự điều khiển. Các chuỗi này thường bắt đầu bằng mã ASCII 27 (ESCAPE).


3

Thiết bị đầu cuối truyền ký tự (chính xác hơn: byte), không phải khóa. Khi bạn nhấn một phím hoặc một phím như Ctrl+ ;, thông tin này phải được mã hóa thành một chuỗi byte. Keychords đại diện cho một nhân vật, như Ahoặc Shift+ Ahay À, được gửi dưới dạng nhân vật mà: a, A, à(người cuối cùng là một hoặc hai byte tùy thuộc vào mã hóa ký tự của thiết bị đầu cuối).

Các khóa liên quan đến các phím chức năng không có ký tự tương ứng, vì vậy chúng được gửi dưới dạng các chuỗi thoát: một chuỗi byte bắt đầu bằng ký tự thoát ( \etrong chuỗi Emacs, xuất hiện dưới dạng lục lam ^[nếu được nhập theo nghĩa đen trong bộ đệm). Một vài phím chức năng có byte tương ứng là các ký tự điều khiển .

Keychord Ctrl+ ;không có chuỗi thoát tiêu chuẩn, vì vậy hầu hết các trình giả lập thiết bị đầu cuối tạo ra ký tự ;. Điều này làm mất thông tin mà công cụ Ctrlsửa đổi đã được nhấn.

Để xác định ràng buộc cho Ctrl+ ;, bạn sẽ cần định cấu hình trình giả lập thiết bị đầu cuối của mình để gửi một chuỗi thoát khác. Tôi không nghĩ bạn có thể làm điều này với thiết bị đầu cuối Gnome (Gnome hiếm khi có thể cấu hình được). Bạn có thể làm điều đó với Xterm. Xem 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? để được hướng dẫn.

Shell mà bạn có thể chạy trong thiết bị đầu cuối không liên quan. GUI Emacs không có vấn đề gì vì GUI (X11) truyền các sự kiện đầu vào dưới dạng mã hóa khóa và sửa đổi, không phải là một chuỗi ký tự đơn thuần.

Xem Làm thế nào để đầu vào bàn phím và đầu ra văn bản hoạt động? để có thông tin chi tiết hơn về cách nhập liệu từ bàn phím đến ứng dụng của bạn.

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.