Apa saja karakter yang dicetak ketika tombol Alt + Panah ditekan?

13

Ketika saya menekan AltUp, Adicetak ke layar terminal. Hal yang sama terjadi ketika saya menekan AltDowntetapi Bdicetak sebagai gantinya.

Karakter lain yang saya sadari;

AltLeft= Ddan AltRight=C

Apa tujuan dari perintah ini?

yfklon
sumber

Jawaban:

14

Bergantung pada bagaimana terminal dikonfigurasikan, mengetik Alt+Keyseperti mengetik Escdan Keykunci secara berurutan, sehingga mengirim karakter ESC (alias \eatau ^[atau \033) diikuti oleh karakter atau urutan karakter yang dikirim setelah menekannya Key.

Saat menekan Up, kebanyakan emulator terminal mengirim tiga karakter \033[Aatau \033OAtergantung pada apakah mereka dalam mode keypad aplikasi atau tidak.

Yang pertama tidak sesuai dengan urutan keluar yang ketika output ke terminal, gerakkan kursor ke atas. Jika kamu melakukan:

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

Anda akan melihat bartulisan setelah foosatu baris ke atas. Jika kamu melakukan:

stty -echoctl; tput rmkx; read foo

Anda akan melihat bahwa tombol panah menggerakkan kursor.

Ketika sebuah aplikasi menyukai zshatau vimembaca urutan karakter dari terminal, itu menafsirkannya sebagai tindakan "Atas", karena ia tahu dari basis data terminfo ( kcuu1kemampuan) bahwa itu adalah urutan pelepasan yang dikirim setelah menekan Up.

Sekarang, untuk Alt-Up, beberapa terminal seperti rxvtdan turunannya seperti etermmengirim \033diikuti oleh urutan escape untuk Up(yaitu \033\033[Aatau \033\033OA), sementara beberapa orang lain seperti xtermatau gnome-terminalmemiliki escape sequence yang terpisah untuk jenis-jenis kunci bila digunakan dengan tombol kombinasi seperti Alt, Shift, Ctrl.

Mereka biasanya akan mengirimkan \033[1;3ApadaAlt-Up .

Ketika dikirim ke terminal, urutan itu juga akan menggerakkan kursor ke atas (parameter kedua (3) diabaikan). Tidak ada tombol keypad yang sesuai , sehingga urutan yang sama dikirim Alt-Upmasuk atau keluar dari mode keypad aplikasi .

Sekarang \033\033[Aatau tidak \033[1;3A, banyak aplikasi tidak tahu untuk apa urutannya. Database terminfo tidak akan membantu mereka, karena tidak ada kemampuan yang menentukan karakter apa yang dikirim oleh kombinasi tombol tersebut.

Mereka akan mencoba yang terbaik untuk menafsirkan urutan itu. bashmisalnya akan menafsirkan \033[1;3sebagai urutan pelarian, tidak tahu apa-apa tentang itu, jadi tidak melakukan apa-apa, diikuti oleh A. zsh, akan berhenti membaca segera setelah mengetahui tidak ada urutan karakter yang cocok diketahui. Tidak ada urutan keluar yang diketahui dimulai dengan \033[1itu sehingga ia akan melewati itu, dan membaca sisanya:;3A dan masukkan dalam editor baris.

Banyak aplikasi seperti vi, zshatau yang readlineberbasis suka gdbatau bash(meskipun waspadalah bashmenggunakan versi modifikasi readline) memungkinkan Anda untuk menambahkan binding untuk setiap urutan karakter.

Misalnya, di zsh, Anda mungkin ingin mengikat Alt-Up, Alt-Downseperti:

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

Itu adalah untuk mencari sejarah mundur dan maju untuk baris perintah yang mulai seperti yang sekarang hingga posisi kursor saat ini yang cukup berguna untuk mengingat perintah sebelumnya.

Stéphane Chazelas
sumber
3

Anda dapat menggunakan Crtl+ vuntuk mengembalikan kode input keyboard Anda. Jika Anda melakukannya untuk tombol panah, Anda akan mendapatkan [[D^, [[C^, [[A^, dan [[Bnilai-nilai. Tidak ada binding default untuk Alttombol + panah, jadi sepertinya tindakan yang dilakukan hanya mencetak kode huruf saja. Hovewer, jika Anda membuat versi lokal dari file konfigurasi pustaka readline:

$ cp /etc/inputrc ~/.inputrc

Dan tambahkan baris:

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

Di mana [1;3Ckode input Alt+ (Anda bisa mendapatkannya dengan cara yang sama seperti sebelum menggunakan Crtl+ vcara pintas) dan restart terminal Anda kemudian Crtl+ cara pintas akan mengembalikan Anda teks "di suatu tempat" dan Altcara pintas + panah lainnya akan berhenti mengembalikan karakter.

Alih-alih teks, Anda dapat meneruskan perintah bindable dari http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands like

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

memiliki efek yang sama seperti Crtl+ u(hapus baris).

Informasi lebih lanjut di sini: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Nykakin
sumber
3

The Altkey sering digunakan sebagai meta pengubah. Tombol kursor dan fungsi disebut sebagai tombol khusus karena dapat mengirim banyak karakter - dan karakter yang dikirim dapat diubah.

Beberapa pengguna, misalnya, untuk bashmengharapkan bahwa menekan Altakan mengirim kunci diawali oleh karakter pelarian. Fitur "meta" yang didokumentasikan terminfo(5)berkaitan dengan bit kedelapan:

Jika terminal memiliki "kunci meta" yang bertindak sebagai tombol shift, mengatur bit ke-8 dari setiap karakter yang ditransmisikan, fakta ini dapat ditunjukkan dengan km. Jika tidak, perangkat lunak akan menganggap bahwa bit ke-8 adalah paritas dan biasanya akan dihapus. Jika string ada untuk menghidupkan dan mematikan "mode meta" ini , mereka dapat diberikan sebagai smmdan rmm.

bashtahu tentang itu juga (lihat FAQ ncurses ), tetapi beberapa penggunanya tertarik dengan fitur ini. Meskipun demikian, mereka terbiasa menyebutnya Altsebagai "meta", meskipun mode meta dimatikan. Baik rxvt dan xterm telah memiliki fitur ini sejak (setidaknya) awal 1990-an.

Pengguna lain (sejak xtermmemperkenalkan fitur dalam tambalan # 94, 1999 ) dapat mengharapkan informasi pengubah untuk dikodekan sebagai parameter dalam urutan karakter yang akan dikirim oleh kunci khusus. Dokumentasi XTerm menyebut kunci yang dimodifikasi ini sebagai tombol fungsi "gaya PC" untuk membedakannya dari "gaya VT220" (yang tidak memiliki pengubah). Kunci kursor yang tidak dimodifikasi mungkin mengirim ESC[A, tetapi juga sah untuk memiliki parameter , misalnya ESC[5A, yang harus dipahami oleh aplikasi sebagai pengulangan sebanyak lima kali. Versi pertama dari xterm's PC-gaya kunci yang digunakan bahwa '5' untuk menunjukkancontrol, dan versi yang lebih baru mengubahnya untuk menghindari kebingungan dengan jumlah ulangan. Begitu...

ESC[5A

menunjukkan bahwa aplikasi memindahkan kursor ke atas 5 baris, sementara

ESC[1;5A

menunjukkan bahwa ia naik satu baris, memberi tahu aplikasi bahwa suatu controltombol ditekan.

Kombinasi yang berguna telah ada di basis data ncurses terminfo sejak 2004 :

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

Database terminfo menunjukkan versi xterm + pcfkeys saat ini dengan komentar yang menunjukkan bagaimana pengubah kode disandikan:

# 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 dan meta belum tentu kunci yang sama). Itu adalah blok bangunan (pada gilirannya terdiri dari blok bangunan lain) dari mana xtermdeskripsi terminal terbentuk. Ia menggunakan ekstensi yang disediakan di ncurses sejak 1999 yang memungkinkan nama yang ditentukan pengguna. Karena termcap hanya mendukung nama 2-karakter, dan deskripsi 1023-byte, tidak ada alasan untuk membuat nama-nama yang diperluas ini tersedia melalui antarmuka termcap . Mereka sudah tersedia untuk aplikasi menggunakan antarmuka terminfo .

Sekarang muncul kesulitan: ada beberapa cara bagi aplikasi untuk menentukan apa yang direpresentasikan oleh urutan kunci seperti itu:

  1. menganalisis urutan karakter sepenuhnya
  2. sebagian menganalisanya dan membuang controlpengubah jika tidak diperlukan
  3. bandingkan saja urutan karakter dengan kamus, berharap untuk menentukan artinya seperti itu.

Beberapa program akan melakukan yang pertama; beberapa editor teks akan melakukan yang kedua (sebenarnya, saya melakukan ini untuk deddi akhir 1980-an ). Pengembang untuk aplikasi seperti bashmemilih rute ketiga dengan mengasumsikan bahwa sebagian besar informasi dalam termcap . Atau, mereka dapat memilih untuk membuat tabel dengan informasi termcap / terminfo dan menggunakan antarmuka yang memberikan informasi terbaik. xtermmelakukan ini untuk fitur tcap-query , memberikan vimpenugasan tombol fungsi yang sebenarnya.

Karena tidak ada string yang bashsebanding dengan cocok dengan string yang diterimanya, itu bisa bingung, puas dengan pertandingan parsial (seperti karakter melarikan diri dengan sendirinya).

Bacaan lebih lanjut:

Thomas Dickey
sumber