Bash kısayollarını yeniden eşlemek için terminal anahtar kodlarının listesini nereden bulabilirim?


42

Örneğin:

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

Sadece gibi ufak tefek, biliyorum \ekaçmak için ve standları C-için Ctrl, ancak bu sayılar (ne 1) ve harfler ( Z)? Ne ;, [ve -için işaretler?

Sadece deneme yanılma mı var, yoksa bash anahtar kodlarının tam bir listesi ve sözdizimlerinin bir açıklaması var mı?


2
Kabuğun gerçek okuma çizgisi bağlarını listelemek için ek bir ipucudur bind -p.

1
Bu tür kodların çoğu terminaliniz tarafından yorumlanır; büyük bir liste için Wikipedia'daki ANSI çıkış kodlarını okuyun .
chepner

stty -a terminalin hat ayarlarını gösterir
hata

Yanıtlar:


52

Bunlar, belirli bir tuşa bastığınızda terminaliniz tarafından gönderilen karakter dizileridir. Tek başına bash veya readline ile ilgisi yoktur, ancak readlinebelirli bir tuşa basıldığında bir şeyler yapmak üzere yapılandırmak istiyorsanız, belirli bir tuşun veya tuş kombinasyonunun hangi karakter dizisini gönderdiğini bilmek isteyeceksiniz .

Tuşuna bastığınızda Atuşu, genellikle terminalleri göndermek a(0x61) karakteri. <Ctrl-I>Veya tuşuna basarsanız <Tab>, genellikle veya (0x9) ^Iolarak da bilinen karakteri gönderin . İşlev ve gezinme tuşlarının çoğu genellikle (control- [) ile başlayan veya (0x1b, 033 octal) olarak da bilinen karakter dizisini gönderir , ancak tam dizilim terminalden terminale değişir.TAB\t^[ESC\e

Bir tuş veya tuş kombinasyonunun terminalinize ne gönderdiğini bulmanın en iyi yolu, koşmak sed -n lve onu Enterklavyede yazmaktır. O zaman şöyle bir şey göreceksiniz:

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

İlk satır, echoterminal cihazı tarafından yapılan yerel terminalden kaynaklanır (terminal cihazı ayarları onu etkileyeceği için güvenilir olmayabilir).

İkinci satır tarafından verilir sed. $O çizginin sonu nereye göstermek için sadece var, dahil edilecek değildir.

Bu yollarla Üstü o Ctrl-Up(ben basıldığında ettik ki) 6 karakter göndermek ESC, [, 1, ;, 5ve A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

Veri terminfotabanı, birkaç uçbirim için bir dizi ortak anahtar için bir dizi dizi kaydeder ( $TERMdeğere bağlı olarak ).

Örneğin:

TERM=rxvt tput kdch1 | sed -n l

Hangi kaçış sırasının tuşa rxvtbasılarak gönderileceğini söyleyecektir Delete.

Şu anki terminalinizle hangi tuşun belirli bir sıraya karşılık geldiğine bakabilirsiniz infocmp(burada ncursesinfocmp varsayalım):

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

Anahtar kombinasyonları veritabanında Ctrl-Upkarşılık gelen girişlere sahip değildir terminfo, bu nedenle ne gönderdiklerini bulmak için ilgili terminalin kaynağını veya belgelerini okuyun veya sed -n lyukarıda açıklanan yöntemle deneyin .


Bu harika bir açıklama, teşekkürler! Şimdi hepsi, yere düştüğü \e-1\C-ibir geriye sekmesi, çünkü controlve ibir sekmeyi ekler ve escapeardından -1geriye kere yapmak bash diyor (bu fal ve hakkında bazı şeyler buldum digit-arguments).
böcek

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

3
@vib. Bu küçük harf L rakam 1 değil
Stéphane Chazelas

1
@ user367890, bu tuş takımı moduna bağlı . Muhtemelen bundan sonra bulacaksınız tput smkx, uçbiriminiz gönderir \e[OD( kcub1) ve sonra tput rmkx, \e[D( cub1, hamle sola imleç, böylece dizisi ile aynı kod olduğunu yankı bu tuşların. İmleci deneyin etmez stty -echoctl; tput rmkx; sleep infve göreceksiniz ok tuşları, tuş takımı modunda değilken imleci hareket ettirir ).
Stéphane Chazelas

1
@ user367890, Thomas (ncurses ve xterm bakıcısı) bağlantınızın cevabında söylediklerinden, evet, çalışması gerekir. tuş takımı modu veya uygulama modu aynı şeyi gösterir, bu nedenle (yine Thomas'a göre) terminfo veritabanındaki anahtar özellikler smkx etkin olduğunda içindir.
Stéphane Chazelas

4

Gnu okuma satırı kütüphanesi ile sağlanır. onun açıklamasını öğrenmek için man 3 readline içine bakmalısınız .

Escspe kodlarının ne anlama geldiği hakkında da bilgiye ihtiyacınız var gibi görünüyor \[A. Bu bilgiyi wikipedia ANSI esacape code makalesinde bulabilirsiniz.


Bu benim örnekleri açıklamıyor.
böcek

Küçük bir yanlış anlaşılma olmuş gibi görünüyor. Lütfen cevap güncellemesine bakınız.
acele

Makaledeki özel örneklerim hakkında hiçbir bilgi yok. "[A" için yapılan bir sayfa araması da hiçbir şey döndürmedi.
böcek

1
@bug lütfen makaleyi dikkatlice okuyunuz. \[ATablo "CSI kodları" sıra içindeki şöyledir: "CSI nA"
acele

Teşekkür acele, ama nerede üzerine açıklamalar bulurum [Z, [1;5Cya -1?
böcek

3

Bu kodlar aynı kaynaktan mı geliyor? Sonuncusu, bir GNU readline bağlamasına benziyor. Kullanıcının bir bash'a gönderdiği şey budur (acelenin cevabına bakınız). Bununla birlikte, ilk ikisi daha çok terminal kontrol sekanslarına benziyor (birincisi kötü formlu olsa bile). Bash veya başka bir program imleç hareketlerini, metin renklerini ve benzerlerini kontrol etmek için terminal emülatörüne geri gönderen şeydir.


Ctrl-ok ileriye doğru sözcük hareketi için kullanılacak "\ e [1; 5C" ve diğer derslerde menü tamamlama işlemi için "\ e [Z" ve "\ e-1 \ Ci" öğelerini buldum. Hepsi .inputrc dosyasının içinde kullanılmıştır.
böcek

Tamam, eğer readline tarafından yorumlanırlarsa, bu kontrol dizilerinin ctrl, alt ve / veya shift veya fonksiyon tuşlarının bazı fonksiyonlarına bağlı olduğu bazı terminal emülatörleri bulunmalıdır. (Hangisini bilmiyorum.)
Uwe

0

Bir anahtar veya tuş combo tarafından hangi kaçış sırasının oluşturulduğunu kontrol etmenin en kolay yolu bir terminaldeki Ctrl+ tuşlarına basmak vve sonra da bilmek istediğiniz tuş / combo tuşuna basmaktır.

Sen gibi bir diziyi alırsınız ^[Oave çevirmek gerekecek ^[içine \eya \033ya \x1bkaçış karakteri için ya da her türlü diğer temsili sizin keybinding sistem bekler.

quoted-insertAdında bir Emacs işlevi olarak başladı ve Bash ve Zsh'in varsayılan klavye bağları Emacs'ı taklit ettiğinden kopyaladılar.

Bash, GNU Readline giriş kütüphanesi aracılığıyla Python'un import rlcompletergeliştirmesi gibi başka şeylerin de kullandığını alır.

İşte gelen açıklamasını Readline kılavuzuna :

quoted-insert( C-qveya C-v)

Satır yazılan bir sonraki karakteri ekleyin. Bu, C-qörneğin anahtar dizilerin nasıl ekleneceğidir .

GNU Readline'a dayanan herhangi bir şeyde çalışması gerekir .

ZLE adlı kendi alternatifini kullanan Zsh'a gelince, yalnızca C-qVi modunda iken, ironik olarak yeterli olduğunda orijinal Emacs bağlamasını onurlandırır , ancak C-vyine de varsayılan Emacs benzeri giriş modunda çalışır. (Ara quoted-insertbölgesi zshzleveya zshall` man sayfalarını ve varsayılan keybinds listelemelisiniz sonuçların thesecond çifti.)

Bir anımsatıcı için, ben düşünmeden tavsiye Ctrl+ vbunun için soran olarak v erbatim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.