Tôi tìm danh sách mã khóa thiết bị đầu cuối ở đâu để sắp xếp lại các phím tắt trong bash?


42

Ví dụ:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Tôi chỉ biết các bit và các mảnh, như \elà viết tắt của esc và C-for Ctrl, nhưng những số này ( 1) và chữ cái ( Z) là gì? Là gì ;, [-những dấu hiệu gì?

Có phải chỉ có bản dùng thử và lỗi, hoặc có một danh sách đầy đủ các mã khóa bash và giải thích về cú pháp của chúng không?


2
Một mẹo bổ sung để liệt kê các ràng buộc readline thực tế của shell là bind -p.

1
Hầu hết các mã như vậy được giải thích bởi thiết bị đầu cuối của bạn; đọc về mã thoát ANSI trên Wikipedia cho một danh sách lớn.
chepner

stty -a hiển thị cài đặt dòng của thiết bị đầu cuối
lỗi

Câu trả lời:


52

Đó là các chuỗi ký tự được gửi bởi thiết bị đầu cuối của bạn khi bạn nhấn một phím nhất định. Không có gì để làm với bash hoặc readline mỗi se, nhưng bạn sẽ muốn biết chuỗi ký tự mà một tổ hợp phím hoặc khóa đã gửi sẽ gửi nếu bạn muốn định cấu hình readlineđể làm gì đó khi nhấn phím đã cho.

Khi bạn nhấn Aphím, thông thường các thiết bị đầu cuối sẽ gửi aký tự (0x61). Nếu bạn nhấn <Ctrl-I>hoặc <Tab>, sau đó thường gửi ^Iký tự còn được gọi là TABhoặc \t(0x9). Hầu hết các phím chức năng và điều hướng thường gửi một chuỗi các ký tự bắt đầu bằng ^[(control- [), còn được gọi là ESChoặc \e(0x1b, 033 bát phân), nhưng chuỗi chính xác thay đổi từ thiết bị đầu cuối sang thiết bị đầu cuối.

Cách tốt nhất để tìm hiểu những gì một tổ hợp phím hoặc khóa gửi cho thiết bị đầu cuối của bạn, được chạy sed -n lvà nhập nó theo sau Entertrên bàn phím. Sau đó, bạn sẽ thấy một cái gì đó như:

$ sed -n l
^[[1;5A
\033[1;5A$

Dòng đầu tiên được gây ra bởi thiết bị đầu cuối cục bộ echođược thực hiện bởi thiết bị đầu cuối (nó có thể không đáng tin cậy vì cài đặt thiết bị đầu cuối sẽ ảnh hưởng đến nó).

Dòng thứ hai là đầu ra của sed. Điều $này không được bao gồm, nó chỉ cho bạn biết nơi kết thúc của dòng.

Trên phương tiện rằng Ctrl-Up(mà tôi đã ép) gửi 6 ký tự ESC, [, 1, ;, 5A(0x1B 0x5b 0x31 0x3b 0x35 0x41)

terminfosở dữ liệu ghi lại một số chuỗi cho một số khóa chung cho một số thiết bị đầu cuối (dựa trên $TERMgiá trị).

Ví dụ:

TERM=rxvt tput kdch1 | sed -n l

Sẽ cho bạn biết chuỗi thoát nào được gửi bằng rxvtcách nhấn Deletephím.

Bạn có thể tra cứu khóa nào tương ứng với một chuỗi đã cho với thiết bị đầu cuối hiện tại của bạn với infocmp(ở đây giả sử ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Các kết hợp chính như Ctrl-Upkhông có các mục tương ứng trong terminfocơ sở dữ liệu, vì vậy để tìm hiểu những gì chúng gửi, hãy đọc nguồn hoặc tài liệu cho thiết bị đầu cuối tương ứng hoặc thử với sed -n lphương pháp được mô tả ở trên.


Đây là một lời giải thích tuyệt vời, cảm ơn! Bây giờ tất cả rơi vào vị trí, \e-1\C-ilà một tab lùi, bởi vì controlichèn một tab và escapetheo sau là -1nói bash để làm điều đó một lần (tôi đã đọc cái này và tìm thấy một số thứ về digit-arguments).
lỗi

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib. Đó là chữ thường L không phải chữ số 1
Stéphane Chazelas

1
@ user367890, đó là chế độ bàn phím . Bạn có thể sẽ thấy rằng sau đó tput smkx, thiết bị đầu cuối của bạn gửi \e[OD( kcub1) và sau đó tput rmkx, \e[D( cub1, cùng mã với chuỗi di chuyển con trỏ sang trái, để tiếng vang của các phím đó di chuyển con trỏ. Hãy thử stty -echoctl; tput rmkx; sleep infvà bạn sẽ thấy các phím mũi tên sẽ di chuyển con trỏ khi không ở chế độ bàn phím ).
Stéphane Chazelas

1
@ user367890, từ những gì Thomas (người duy trì ncurses và xterm) nói trong câu trả lời mà bạn liên kết, vâng, nó sẽ hoạt động. chế độ bàn phím hoặc chế độ ứng dụng đề cập đến cùng một điều, vì vậy (một lần nữa, theo Thomas) các thông số kỹ thuật chính trong cơ sở dữ liệu terminfo dành cho khi smkx được bật.
Stéphane Chazelas 16/07/2016

4

Nó được cung cấp thông qua thư viện gline readline. bạn nên xem qua man 3 readline để tìm hiểu mô tả của nó.

Có vẻ như bạn cũng cần thông tin về \[Aý nghĩa của mã escspe . Bạn có thể tìm thấy thông tin này trong bài viết về mã esacape ANSI của wikipedia .


Điều này không giải thích ví dụ của tôi.
lỗi

Hình như nó bị hiểu lầm nhỏ. Hãy nhìn vào bản cập nhật câu trả lời.
vội vàng

Không có thông tin về các ví dụ cụ thể của tôi trong bài viết. Một tìm kiếm trang cho "[A" cũng không trả về.
lỗi

1
@ bọ xin vui lòng đọc kỹ bài viết. \[Anằm trong bảng "mã CSI" trong hàng: "CSI n A"
vội vàng

Cảm ơn vội vàng, nhưng nơi nào tôi tìm thấy lời giải thích trên [Z, [1;5Choặc -1?
lỗi

3

Các mã này đến từ cùng một nguồn? Cái cuối cùng trông giống như một ràng buộc đọc GNU. Đó là những gì người dùng gửi đến bash (xem câu trả lời của rush). Tuy nhiên, hai cái đầu tiên trông giống như các chuỗi điều khiển đầu cuối (mặc dù cái đầu tiên sẽ là một chuỗi không định hình). Đó là những gì bash hoặc chương trình khác gửi lại cho trình giả lập thiết bị đầu cuối để kiểm soát chuyển động con trỏ, màu văn bản và những thứ tương tự.


Tôi thấy "\ e [1; 5C" được sử dụng cho chuyển động từ mũi tên ctrl và "\ e [Z" và "\ e-1 \ Ci" cho trình đơn hoàn thành ngược trong các hướng dẫn khác. Chúng đều được sử dụng bên trong tệp .inputrc.
lỗi

OK, nếu chúng được giải thích bằng readline thì phải có một số trình giả lập đầu cuối trong đó các chuỗi điều khiển này được liên kết với một số tổ hợp ctrl, alt và / hoặc shift với các phím chức năng hoặc mũi tên. (Tôi không biết cái nào.)
Uwe

0

Cách dễ nhất mà tôi đã tìm thấy để kiểm tra chuỗi thoát nào được tạo bởi một tổ hợp phím hoặc khóa là nhấn Ctrl+ vtrong một thiết bị đầu cuối và sau đó nhấn phím / kết hợp bạn muốn biết.

Bạn sẽ nhận được một chuỗi như ^[Oavà bạn sẽ phải dịch ^[vào \ehoặc \033hoặc \x1bhoặc bất cứ đại diện khác keybinding hy vọng hệ thống của bạn cho các ký tự thoát.

Nó bắt đầu như là một hàm Emacs có tên quoted-insertvà, vì các tổ hợp phím mặc định cho Bash và Zsh bắt chước Emacs, nên chúng cũng sao chép nó.

Bash có được nó thông qua thư viện đầu vào GNU Readline mà những thứ khác như import rlcompletercải tiến của Python cũng sử dụng.

Dưới đây là mô tả từ hướng dẫn Readline :

quoted-insert( C-qhoặc C-v)

Thêm ký tự tiếp theo được gõ vào dòng nguyên văn. Đây là cách chèn các chuỗi khóa như C-q, ví dụ.

Điều đó sẽ làm việc trong bất cứ điều gì dựa trên GNU Readline.

Đối với Zsh, sử dụng thay thế ZLE của riêng mình, nó chỉ tôn vinh C-qràng buộc Emacs ban đầu khi ở chế độ Vi, đủ trớ trêu, nhưng C-vvẫn hoạt động ở chế độ nhập giống như Emacs mặc định. (Tìm kiếm quoted-inserttrong các trang zshzlehoặc zshall` và cặp kết quả thứ hai sẽ liệt kê các tổ hợp phím mặc định.)

Đối với một người ghi nhớ, tôi khuyên bạn nên nghĩ về Ctrl+ vnhư yêu cầu nó v erbatim.

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.