Khóa meta của bash là gì?


16

Tôi đã cố sử dụng xmodmapđể ánh xạ META_Ltới MENUkhóa nhưng dường như nó không được chấp nhận bashlàm khóa meta. Vì vậy, tôi tự hỏi làm thế nào các thành phần này (bàn phím, X, xterm, bash) liên quan đến nhau liên quan đến Meta-và Super-Keys. Bất kỳ lời giải thích sẽ được đánh giá cao.

Hãy để tôi đặt cách này một cách khác. Ví dụ, trang bash man nói rằng hàm yank-nth-arg bị ràng buộc M-C-yvà nó hoạt động khi tôi nhấn Esc-Control-y. Nhưng tôi thấy điều này hơi cồng kềnh. Vậy làm thế nào tôi có thể làm cho bash chấp nhận một khóa khác như Meta(như Menu) cho tất cả các ràng buộc mặc định của nó?


MENUchìa khóa của bạn thậm chí được chú ý bởi X? Bạn đang sử dụng trình quản lý cửa sổ nào - một số trong số chúng có thể giúp bạn xác định lại các khóa của mình.
choroba

Câu trả lời:


11

Ánh xạ từ các phím bàn phím đến các sửa đổi như MetaControlđược xử lý bởi máy chủ X (tức là phần cấp thấp của GUI). Ánh xạ này có thể được xử lý thông qua xmodmaplệnh kiểu cũ hoặc giao diện XKB kiểu mới hoặc thông qua một công cụ cấu hình GUI sử dụng một trong các công cụ này dưới mui xe.

Theo mặc định, trên hầu hết các thiết lập, Metakhóa là khóa được dán nhãn Alt. Điều này là do trong lịch sử, nhiều máy trạm unix có một khóa được dán nhãn Metatrong đó PC có khóa được dán nhãn Alt. Vì vậy, nếu bạn có một ràng buộc cho M-C-y, nhấn Ctrl+ Alt+ Y.

Để kiểm tra các ràng buộc hiện tại của bạn là gì, hãy khởi động xevchương trình trong một thiết bị đầu cuối. Với cửa sổ xev tập trung, nhấn phím; bạn sẽ thấy một bản ghi các sự kiện được tạo trong thiết bị đầu cuối.

Giao tiếp giữa các trình giả lập thiết bị đầu cuối (hoặc thiết bị đầu cuối tương ứng với thiết bị đầu cuối vật lý) và các ứng dụng sử dụng các ký tự. Khi bạn nhấn A, thiết bị đầu cuối sẽ nhận được khóa thông tin A, không có sửa đổi, nhưng những gì nó gửi cho ứng dụng đang chạy trong thiết bị đầu cuối là ký tự a. Khi bạn nhấn một phím chức năng như Uphoặc F1, không có ký tự tương ứng; thiết bị đầu cuối gửi một chuỗi ký tự bắt đầu bằng ký tự thoát (byte 27, đôi khi được viết \ehoặc ^[). Khi một trình giả lập thiết bị đầu cuối như xterm nhận được một sự kiện nhấn phím bằng công cụ Metasửa đổi, nó sẽ dịch khóa đó thành một ký tự thoát theo sau là chức năng cơ bản của khóa, ví dụ \ea(thoát, viết thường a) khi bạn nhấn Meta+ A.

Sự khác biệt chính xác giữa 'thiết bị đầu cuối', 'vỏ', 'tty' và 'bàn điều khiển' là gì? có thể là nền tảng hữu ích.


5

Sự kiện quan trọng được tạo bởi máy chủ X (như được định cấu hình bởi xmodmap) và được gửi đến ứng dụng X của bạn. Trình quản lý cửa sổ của bạn có thể chặn điều này trước khi nó được gửi tới xterm. Ngược lại, XTerm dịch sự kiện sang một số byte và gửi các byte đến giả được phân bổ bởi shell của bạn, bash.

Xin lưu ý rằng không phải tất cả các sự kiện đều được dịch trực tiếp sang byte bởi XTerm. Chẳng hạn, chính các phím Ctrlshifttạo ra các sự kiện bàn phím X, nhưng XTerm không gửi cho trình bao (hoặc ứng dụng khác) đang chạy bên trong nó. Điều này cũng bao gồm Metachính nó, nhưng không bao gồm Menuchìa khóa. Tuy nhiên, sự kiện được tạo bằng cách nhấn Meta- esẽ làm cho XTerm gửi byte 0xE5 hoặc chuỗi hai byte 0x1B 0x65, tùy thuộc vào cài đặt tài nguyên của XTerm.VT100.metaSendsEscape.


2

Khóa meta của Bash ban đầu được định nghĩa như thế này ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

Điều đó xảy ra là cách nó được giải thích với ncursesxterm . Một vài thiết bị đầu cuối được cung cấp để làm tính năng tùy chọn này (khía cạnh đó không phải là phổ biến Hầu hết các thiết bị đầu cuối, bạn sẽ gặp phải sử dụng hành vi hardcoded (và không phải là rất thú vị) Các.. Terminfo văn trang hướng dẫn những khả năng thiết bị đầu cuối:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

và giải thích tính năng:

Nếu thiết bị đầu cuối có "khóa meta" hoạt động như một phím shift, thiết lập bit thứ 8 của bất kỳ ký tự nào được truyền, thì thực tế này có thể được chỉ ra bằng km. Mặt khác, phần mềm sẽ cho rằng bit thứ 8 là tương đương và nó thường sẽ bị xóa. Nếu các chuỗi tồn tại để bật và tắt "chế độ meta" này, chúng có thể được cung cấp dưới dạng smmrmm.

Một tính năng khác, tiền tố một ký tự thoát để đáp ứng với Altkhóa đã được tích hợp vào một số trình giả lập thiết bị đầu cuối. Bash (thực ra là readlinethư viện) tài liệu sử dụng trong thay đổi của nó từ năm 2004:

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

Meta là một trường hợp đặc biệt của khóa bổ trợ . Giống như controlshift, bạn nhấn nó cùng lúc với một phím khác và mong muốn thấy một cái gì đó khác với việc tự bấm phím. X cung cấp cho các khóa bổ trợ bằng cách gán một bit trong giá trị sửa đổi được truyền trong sự kiện X cho khóa. Các phím bấm có thể là nhiều sự kiện X; X cung cấp các hàm để kết hợp các sự kiện này trong khi vẫn giữ các bộ sửa đổi.

X cũng xác định các ký hiệu cho từng phím có thể xuất hiện trên bàn phím của bạn. Nó cung cấp cho các giá trị khác (như Unicode) bằng cách xử lý đặc biệt trong các hàm kết hợp các sự kiện.

Nhưng "meta" là một trường hợp đặc biệt.

Các ứng dụng X không có metakhóa, ngoại trừ theo quy ước. X không có định nghĩa cho khóa meta hoặc công cụ sửa đổi meta. Thông thường, các thiết bị đầu cuối tìm kiếm Alt-key và / hoặc một trong những công cụ sửa đổi được biết đến xmodmap, ví dụ , mod2. Tính năng xkb sau này làm phức tạp mọi thứ (nhưng không cải thiện liên quan đến cuộc thảo luận này) bằng cách cung cấp một lớp thông tin khác để tìm Altkhóa.

Công ước tất nhiên có thể đưa bạn đến nay, với điều kiện là cả hai đều xmodmapkhông xkbbiết gì về meta . xterm, chẳng hạn, có thể định cấu hình và không phải tất cả người dùng đều muốn định cấu hình meta theo cùng một cách. Ví dụ, Altcó thể không phải là khóa meta dự định, ví dụ: nếu nó được sử dụng trong translationtài nguyên. Một khóa khác có thể là khóa meta, nhưng người dùng (đặc biệt là những người sử dụng chuỗi thoát trong bash) có thể muốn một ký tự thoát được gửi khi họ nhấn Alt. Nhưng hãy nhớ rằng trừ khi nó được cấu hình như một công cụ sửa đổi, điều đó không xảy ra: xterm không tự kết hợp các sự kiện.

xterm có một số cài đặt tài nguyên (được ghi lại trong trang thủ công ):

  • altIsNotMetaaltSendsEscape(được thêm vào năm 2007 ).
  • eightBitInputtừ năm 2006 tương ứng với ý nghĩa ban đầu của chế độ meta và có một chuỗi thoát được xác định cho điều này cung cấp các khả năng smmrmm(thiết lập / loại bỏ chế độ meta).
  • eightBitInputđã được sửa đổi vào năm 2003 để đưa UTF-8 vào tài khoản bằng cách thay đổi các giá trị Unicode được giải mã bằng 128 thay vì các byte đầu vào thô.
  • metaSendsEscapengày từ năm 1999
  • eightBitInputgià hơn nhiều metaSendsEscape. Điều đó đã thực hiện lựa chọn giữa chế độ meta (thêm bit thứ tám) hoặc tiền tố một khóa có escapetừ X11R4 (1989). Nhưng tính năng đã được xác định khi khởi động: nó đã được kiểm tra trong quá trình khởi tạo để xác định xem đầu vào được đặt thành cho phép 8 bit hay chỉ 7. Sau đó, nó không thay đổi.

Một số người đánh đồng hai ( tiền tố 8 bit và tiền tố thoát), coi cái sau là chế độ meta . Tùy thuộc vào quan điểm của bạn về vấn đề này, eightBitInputcài đặt tài nguyên của xterm là một phần của giải pháp để có được một siêu khóa khả thi.

Đọc thêm:

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.