Câu trả lời:
Tùy thuộc vào cách nhà ga được cấu hình, gõ Alt+Keygiống như cách gõ Escvà Keyphím theo thứ tự, vì vậy nó sẽ gửi các nhân vật ESC (aka \e
hay ^[
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[A
hoặc \033OA
tù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 bar
văn bản sau foo
mộ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 zsh
hoặ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 ( kcuu1
khả 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ư rxvt
và các dẫn xuất của nó như eterm
gửi \033
tiếp theo là dãy thoát cho Up(có nghĩa là \033\033[A
hay \033\033OA
), trong khi một số người khác như xterm
hoặc gnome-terminal
có 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;3A
khi 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[A
hay \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ự đó. bash
ví dụ sẽ diễn giải \033[1;3
như 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[1
nên nó sẽ bỏ qua phần đó và đọc phần còn lại: ;3A
và chèn phần đó vào trình chỉnh sửa dòng.
Nhiều ứng dụng như vi
, zsh
hoặc readline
dựa trên những ứng dụng như gdb
hoặc bash
(mặc dù hãy cẩn thận bash
sử 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 đó.
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à [[B
cá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;3C
là 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
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ì bash
mong đợ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ạngsmm
vàrmm
.
bash
cũ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 xterm
giớ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ừ đó xterm
mô 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:
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 ded
trong cuối những năm 1980 ). Các nhà phát triển cho các ứng dụng như bash
chọ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. xterm
thực hiện điều này cho tính năng truy vấn tcap , cung cấp vim
các bài tập phím chức năng thực tế.
Vì không có chuỗi nào bash
so 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: