Các ký tự được in khi nhấn phím Alt + Mũi tên là gì?


13

Khi tôi nhấn AltUp, Ain ra màn hình thiết bị đầu cuối. Điều tương tự đã xảy ra khi tôi nhấn AltDownnhưng Bđược in thay thế.

Những nhân vật khác mà tôi nhận ra;

AltLeft= DAltRight=C

Mục đích của các lệnh này là gì?

Câu trả lời:


14

Tùy thuộc vào cách nhà ga được cấu hình, gõ Alt+Keygiống như cách gõ EscKeyphím theo thứ tự, vì vậy nó sẽ gửi các nhân vật ESC (aka \ehay ^[hay \033) tiếp theo là nhân vật hoặc chuỗi các ký tự được gửi khi cấp bách đặt ra Key.

Khi nhấn Up, hầu hết các trình giả lập thiết bị đầu cuối sẽ gửi ba ký tự \033[Ahoặc \033OAtùy thuộc vào việc chúng có ở chế độ bàn phím ứng dụng hay không.

Cái đầu tiên không tương ứng với chuỗi thoát mà khi xuất ra terminal, di chuyển con trỏ lên. Nếu bạn làm:

printf '\nfoo\033[Abar\n\n'

Bạn sẽ thấy barvăn bản sau foomột hàng lên. Nếu bạn làm:

stty -echoctl; tput rmkx; read foo

Bạn sẽ thấy các phím mũi tên di chuyển con trỏ xung quanh.

Khi một ứng dụng thích zshhoặc viđọc chuỗi ký tự đó từ thiết bị đầu cuối, nó sẽ hiểu đó là hành động "Lên", bởi vì nó biết từ cơ sở dữ liệu terminfo ( kcuu1khả năng) rằng đó là chuỗi thoát được gửi khi nhấn Up.

Bây giờ, đối với Alt-Upmột số thiết bị đầu cuối như rxvtvà các dẫn xuất của nó như etermgửi \033tiếp theo là dãy thoát cho Up(có nghĩa là \033\033[Ahay \033\033OA), trong khi một số người khác như xtermhoặc gnome-terminalcó trình tự thoát riêng cho những loại phím khi sử dụng với các phím kết hợp như Alt, Shift, Ctrl.

Những người thường sẽ gửi \033[1;3Akhi Alt-Up.

Khi được gửi đến thiết bị đầu cuối, chuỗi đó cũng sẽ di chuyển con trỏ lên (tham số thứ hai (3) bị bỏ qua). Không có phím bàn phím tương ứng , do đó, đó là cùng một chuỗi được gửi vào Alt-Uphoặc ra khỏi chế độ bàn phím ứng dụng .

Bây giờ cho dù đó là \033\033[Ahay \033[1;3A, nhiều ứng dụng không biết những chuỗi đó dùng để làm gì. Cơ sở dữ liệu terminfo sẽ không giúp được họ, bởi vì không có khả năng nào xác định những ký tự mà các tổ hợp phím đó gửi.

Họ sẽ cố gắng hết sức để giải thích trình tự đó. bashví dụ sẽ diễn giải \033[1;3như một chuỗi thoát, không biết gì về nó, do đó, không có gì, theo sau A. zsh, sẽ ngừng đọc ngay khi phát hiện ra không có chuỗi ký tự phù hợp đã biết. Không có trình tự thoát nào mà nó biết bắt đầu bằng \033[1nên nó sẽ bỏ qua phần đó và đọc phần còn lại: ;3Avà chèn phần đó vào trình chỉnh sửa dòng.

Nhiều ứng dụng như vi, zshhoặc readlinedựa trên những ứng dụng như gdbhoặc bash(mặc dù hãy cẩn thận bashsử dụng phiên bản sửa đổi readline) cho phép bạn thêm các ràng buộc cho bất kỳ chuỗi ký tự nào.

Chẳng hạn, trong zsh, bạn có thể muốn liên kết Alt-Up, Alt-Downnhư:

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

Đó là tìm kiếm lịch sử lùi và tiến cho các dòng lệnh bắt đầu như dòng hiện tại cho đến vị trí hiện tại của con trỏ, khá tiện để gọi lại các lệnh trước đó.


3

Bạn có thể sử dụng Crtl+ vđể trả về mã đầu vào của bàn phím. Nếu bạn làm điều đó cho các phím mũi tên, bạn sẽ nhận được [[D^, [[C^, [[A^, và [[Bcác giá trị. Không có bất kỳ ràng buộc mặc định nào cho Altcác phím mũi tên +, vì vậy có vẻ như hành động được thực hiện chỉ in mã chữ cái. Hovewer, nếu bạn tạo phiên bản cục bộ của tệp cấu hình thư viện readline:

$ cp /etc/inputrc ~/.inputrc

Và thêm một dòng:

"\e[1;3C": "sometexthere"

Trong trường hợp [1;3Clà mã đầu vào của Alt+ (bạn có thể lấy nó cùng một cách như trước khi sử dụng Crtl+ vshortcut) và khởi động lại thiết bị đầu cuối sau đó bạn Crtl+ phím tắt sẽ trả lại bạn văn bản "sometexthere" và khác Altcác phím tắt + mũi tên sẽ ngừng ký tự trở về.

Thay vào đó, bạn có thể chuyển một lệnh có thể liên kết từ http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands như

"\e[1;3C": unix-line-discard

để có hiệu ứng tương tự như Crtl+ u(xóa dòng).

Thêm thông tin tại đây: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html


3

Các Altchính thường được sử dụng như một meta modifier. Các khóa con trỏ và chức năng được gọi là các khóa đặc biệt vì chúng có thể gửi nhiều ký tự - và các ký tự được gửi có thể được thay đổi.

Một số người dùng, ví dụ, vì bashmong đợi rằng việc nhấn Altsẽ gửi một khóa có tiền tố bởi ký tự thoát. Tính năng "meta" được ghi lại (xem terminfo(5)) liên quan đến bit thứ tám:

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.

bashcũng biết về điều đó (xem FAQ của ncurses ), nhưng rất ít người dùng của nó quan tâm đến tính năng này. Tuy nhiên, họ đã quen với việc gọi Altlà "meta", ngay cả khi chế độ meta bị tắt. Cả rxvt và xterm đều có tính năng này kể từ (ít nhất) vào đầu những năm 1990.

Những người dùng khác (kể từ khi xtermgiới thiệu tính năng trong bản vá # 94, 1999 ) có thể mong đợi thông tin của công cụ sửa đổi được mã hóa dưới dạng tham số trong chuỗi ký tự mà một khóa đặc biệt sẽ gửi. Tài liệu của XTerm gọi các phím được sửa đổi này là các phím chức năng "kiểu PC" để phân biệt chúng với "kiểu VT220" (không có bộ sửa đổi). Một khóa con trỏ không được sửa đổi có thể gửi ESC[A, nhưng cũng hợp pháp khi có một tham số , ví dụ, ESC[5Amột ứng dụng nên hiểu là lặp lại năm lần đó. Phiên bản đầu tiên của xterm's PC kiểu phím sử dụng rằng '5' để biểu thịcontrolvà một phiên bản mới hơn đã thay đổi nó để tránh nhầm lẫn với số lần lặp lại. Vì thế...

ESC[5A

gợi ý rằng ứng dụng di chuyển con trỏ lên 5 hàng, trong khi

ESC[1;5A

gợi ý rằng nó di chuyển lên một hàng, nói với ứng dụng rằng controlphím được nhấn.

Các kết hợp hữu ích đã có trong cơ sở dữ liệu terminfo của ncurses từ năm 2004 :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

Cơ sở dữ liệu terminfo hiển thị phiên bản hiện tại của xterm + pcfkeys với một nhận xét cho thấy cách sửa đổi được mã hóa:

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(Alt và meta không nhất thiết phải là cùng một khóa). Đó là một khối xây dựng (lần lượt bao gồm các khối xây dựng khác) từ đó xtermmô tả thiết bị đầu cuối được hình thành. Nó sử dụng một phần mở rộng được cung cấp trong ncurses từ năm 1999 , cho phép các tên do người dùng định nghĩa. Vì termcap chỉ hỗ trợ tên 2 ký tự và mô tả 1023 byte, không có lý do gì để cung cấp các tên mở rộng này thông qua giao diện termcap . Chúng có sẵn cho các ứng dụng sử dụng giao diện terminfo .

Bây giờ có một khó khăn: có một vài cách để một ứng dụng xác định chuỗi khóa như thế nào thể hiện:

  1. phân tích hoàn toàn chuỗi ký tự
  2. phân tích một phần và vứt bỏ công cụ controlsửa đổi nếu không cần thiết
  3. chỉ cần so sánh chuỗi ký tự với từ điển, hy vọng xác định nghĩa theo cách đó.

Vài chương trình sẽ làm đầu tiên; một số soạn thảo văn bản sẽ làm thứ hai (trên thực tế, tôi đã làm này cho dedtrong cuối những năm 1980 ). Các nhà phát triển cho các ứng dụng như bashchọn tuyến đường thứ ba bằng cách giả sử rằng hầu hết các thông tin đều ở dạng termcap . Ngoài ra, họ có thể đã chọn tạo một bảng có thông tin termcap / terminfo và sử dụng giao diện cung cấp thông tin tốt nhất. xtermthực hiện điều này cho tính năng truy vấn tcap , cung cấp vimcác bài tập phím chức năng thực tế.

Vì không có chuỗi nào bashso sánh với các chuỗi mà nó nhận được, nên nó có thể bị lẫn lộn, giải quyết các khớp một phần (chẳng hạn như ký tự thoát).

Đọ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.