Ketika saya menekan AltUp, A
dicetak ke layar terminal. Hal yang sama terjadi ketika saya menekan AltDowntetapi B
dicetak sebagai gantinya.
Karakter lain yang saya sadari;
AltLeft= D
dan AltRight=C
Apa tujuan dari perintah ini?
sumber
Ketika saya menekan AltUp, A
dicetak ke layar terminal. Hal yang sama terjadi ketika saya menekan AltDowntetapi B
dicetak sebagai gantinya.
Karakter lain yang saya sadari;
AltLeft= D
dan AltRight=C
Apa tujuan dari perintah ini?
Bergantung pada bagaimana terminal dikonfigurasikan, mengetik Alt+Keyseperti mengetik Escdan Keykunci secara berurutan, sehingga mengirim karakter ESC (alias \e
atau ^[
atau \033
) diikuti oleh karakter atau urutan karakter yang dikirim setelah menekannya Key.
Saat menekan Up, kebanyakan emulator terminal mengirim tiga karakter \033[A
atau \033OA
tergantung 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 bar
tulisan setelah foo
satu baris ke atas. Jika kamu melakukan:
stty -echoctl; tput rmkx; read foo
Anda akan melihat bahwa tombol panah menggerakkan kursor.
Ketika sebuah aplikasi menyukai zsh
atau vi
membaca urutan karakter dari terminal, itu menafsirkannya sebagai tindakan "Atas", karena ia tahu dari basis data terminfo ( kcuu1
kemampuan) bahwa itu adalah urutan pelepasan yang dikirim setelah menekan Up.
Sekarang, untuk Alt-Up, beberapa terminal seperti rxvt
dan turunannya seperti eterm
mengirim \033
diikuti oleh urutan escape untuk Up(yaitu \033\033[A
atau \033\033OA
), sementara beberapa orang lain seperti xterm
atau gnome-terminal
memiliki escape sequence yang terpisah untuk jenis-jenis kunci bila digunakan dengan tombol kombinasi seperti Alt, Shift, Ctrl.
Mereka biasanya akan mengirimkan \033[1;3A
padaAlt-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[A
atau 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. bash
misalnya akan menafsirkan \033[1;3
sebagai 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[1
itu sehingga ia akan melewati itu, dan membaca sisanya:;3A
dan masukkan dalam editor baris.
Banyak aplikasi seperti vi
, zsh
atau yang readline
berbasis suka gdb
atau bash
(meskipun waspadalah bash
menggunakan 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.
Anda dapat menggunakan Crtl+ vuntuk mengembalikan kode input keyboard Anda. Jika Anda melakukannya untuk tombol panah, Anda akan mendapatkan [[D^
, [[C^
, [[A^
, dan [[B
nilai-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;3C
kode 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
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 bash
mengharapkan 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 sebagaismm
danrmm
.
bash
tahu 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 xterm
memperkenalkan 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 xterm
deskripsi 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:
Beberapa program akan melakukan yang pertama; beberapa editor teks akan melakukan yang kedua (sebenarnya, saya melakukan ini untuk ded
di akhir 1980-an ). Pengembang untuk aplikasi seperti bash
memilih 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. xterm
melakukan ini untuk fitur tcap-query , memberikan vim
penugasan tombol fungsi yang sebenarnya.
Karena tidak ada string yang bash
sebanding dengan cocok dengan string yang diterimanya, itu bisa bingung, puas dengan pertandingan parsial (seperti karakter melarikan diri dengan sendirinya).
Bacaan lebih lanjut: