Yanıtlar:
Terminal nasıl yapılandırıldığına bağlı olarak, yazarak Alt+Keyyazarak gibidir Escve Keyo ESC karakteri (aka gönderir, böylece sırayla tuşları \e
veya ^[
veya \033
karakter veya o basarak üzerine gönderilen karakterlerin dizisi takiben) Key.
Tuşuna basıldığında Up, çoğu terminal öykünücüsü üç karakteri \033[A
ya da \033OA
uygulama tuş takımı modunda olup olmadıklarına bağlı olarak gönderir .
Birincisi, terminale gönderildiğinde imleci yukarı doğru hareket ettiren kaçış dizisine karşılık gelir. Yaparsan:
printf '\nfoo\033[Abar\n\n'
Bir satır bar
sonra yazıldığını göreceksiniz foo
. Yaparsan:
stty -echoctl; tput rmkx; read foo
Ok tuşlarının imleci hareket ettirdiğini göreceksiniz.
Bir uygulama terminaldeki bu karakter dizisini beğenir zsh
veya vi
okursa, terminfo veritabanından ( kcuu1
yetenek), basıldığında gönderilen kaçış dizisi olduğunu bildiğinden, bunu "Yukarı" eylemi olarak yorumlar Up.
Şimdi, için Alt-Up, bazı gibi terminaller rxvt
ve benzerleri gibi türevleri eterm
göndermek \033
için çıkış sırası takip Up(olup \033\033[A
ya da \033\033OA
), gibi bazıları ise xterm
ya da gnome-terminal
kombinasyonu gibi tuşları ile kullanıldığında anahtarların bu tip için ayrı çıkış dizilerine sahip Alt, Shift, Ctrl.
Bunlar tipik olarak gönderecek \033[1;3A
üzerine Alt-Up.
Terminale gönderildiğinde, bu sıra ayrıca imleci yukarı hareket ettirir (ikinci parametre (3) yok sayılır). Karşılık gelen tuş takımı tuşu yoktur , bu nedenle uygulama tuş takımı moduna girilenAlt-Up veya çıkan aynı sıraya sahiptir .
Şimdi \033\033[A
ya da \033[1;3A
birçok uygulama bu dizilerin ne için olduğunu bilmiyor. Terminfo veritabanı onlara yardımcı olmaz, çünkü bu tuş kombinasyonlarının hangi karakterleri göndereceğini tanımlayan böyle bir yetenek yoktur.
Bu diziyi yorumlamak için ellerinden geleni yapacaklar. bash
mesela \033[1;3
bir kaçış dizisi olarak yorumlayacak , onun hakkında hiçbir şey bilmiyor, hiçbir şey bilmiyor A
. zsh
, bilinen bir eşleşen karakter sırası bulunmadığını öğrenir okumaz. İle başladığını bildiği bir kaçış dizisi yoktur, bu \033[1
yüzden bunu atlar ve geri kalanını okur: ;3A
ve bunu satır düzenleyicisine ekler.
Gibi Birçok uygulama vi
, zsh
ya readline
benzeri bazlı olanlar gdb
veya bash
(gerçi dikkat bash
kullanımların değiştirilmiş bir sürümü readline
) Eğer herhangi bir karakter dizisi bağlantılarında eklemek için izin verir.
Örneğin, içinde zsh
, sen bağlama isteyebilirsiniz Alt-Up, Alt-Downgibi:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Bunlar, önceki komutları hatırlamak için oldukça kullanışlı olan imlecin geçerli konumuna kadar geçerli olan gibi başlayan komut satırları için geçmişi ileri ve geri aramaktır.
Crtl+ vTuşlarını klavyenizin giriş kodlarını döndürmek için kullanabilirsiniz . Eğer ok tuşları için bunu yaparsan, sen alacak [[D^
, [[C^
, [[A^
, ve [[B
değerleri. Alt+ Ok tuşları için varsayılan bağlantı yoktur , bu nedenle gerçekleştirilen eylemin yalnızca harf kodunu yazdırdığı görülmektedir. Hovewer, readline kitaplığı yapılandırma dosyasının yerel sürümünü oluşturursanız:
$ cp /etc/inputrc ~/.inputrc
Ve bir satır ekleyin:
"\e[1;3C": "sometexthere"
+ [1;3C
Giriş kodu nerede ( + kısayolu kullanmadan önce aynı şekilde alabilirsiniz ) ve terminalinizi yeniden başlatın, sonra + kısayol size "sometexthere" metnini döndürür ve diğer + ok kısayolları karakterleri döndürmeyi durdurur.Alt→CrtlvCrtl→Alt
Bunun yerine metin http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands gibi ikili bir komut iletebilirsiniz.
"\e[1;3C": unix-line-discard
Crtl+ u(satırı sil) ile aynı etkiye sahip olmak .
Daha fazla bilgi burada: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
AltAnahtar genellikle bir şekilde kullanılan meta modifiye. İmleç ve işlev tuşlarına, birden çok karakter gönderebildikleri ve gönderilen karakterler değiştirilebildiği için özel tuşlar denir .
Bazı kullanıcılar, örneğin, tuşa bash
basmanın Altkaçış karakterinin ön ekine sahip bir anahtar göndermesini beklerler . Belgelenmiş "meta" özelliği (bkz. terminfo(5)
) Sekizinci bit ile ilgilidir:
Terminalde, iletilen herhangi bir karakterin 8. bitini ayarlayan bir üst karakter tuşu görevi gören bir "meta anahtar" varsa, bu durum ile belirtilebilir
km
. Aksi takdirde, yazılım 8. bitin eşlik olduğunu varsayar ve genellikle silinir. Dizeleri bu çevirmek varsa "meta mod" ve off, bunlar da verilebilirsmm
vermm
.
bash
bunu da biliyor (bkz. ncurses SSS ), ancak kullanıcılarının birkaçı bu özellikle ilgileniyor. Bununla birlikte, Altmeta mod kapalı olsa bile "meta" olarak adlandırmaya alışkındırlar . Hem rxvt hem de xterm bu özelliğe (en azından) 1990'ların başından beri sahipti.
Diğer kullanıcılar (bu xterm
özellik # 94, 1999 yamasıyla tanıtıldığından beri ), değiştirici bilgilerinin özel bir anahtarın göndereceği karakter sırasıyla bir parametre olarak kodlanmasını bekleyebilir. XTerm'in belgeleri bu değiştirilmiş anahtarlara " değiştirici içermeyen " VT220 stilinden ( " değiştirici içermeyen ") ayırmak için "PC tarzı" işlev tuşları olarak anılmıştır . Modifiye edilmemiş imleç tuşu gönderebilir ESC[A, ama bir olması da yasal olduğu parametre , örneğin ESC[5A, bir uygulama hangi gerektiğini o beş kez tekrarlayarak olarak anlıyoruz. İlk sürümü xterm
bireyin PC tarzı tuşları o '5' belirtmek için kullanılırcontrolve daha sonraki bir sürüm, tekrar sayısı ile karışıklığı önlemek için değiştirdi. Yani...
ESC[5A
uygulamanın imleci 5 satır yukarı taşımasını önerir.
ESC[1;5A
uygulamaya bir controltuşa basıldığını söyleyerek bir satır yukarı gitmesini önerir .
Yararlı kombinasyonlar 2004'ten beri ncurses terminfo veri tabanında bulunmaktadır :
# 2004-07-17
# * add xterm-pc-fkeys -TD
Terminfo veritabanı, değiştiricilerin nasıl kodlandığını gösteren bir yorumla xterm + pcfkeys'in geçerli sürümünü gösterir :
# 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 ve meta mutlaka aynı anahtar değildir). Bu, terminal açıklamasının oluşturulduğu bir yapı taşıdır (sırayla diğer yapı taşlarından xterm
oluşur). 1999'dan beri kullanıcı tanımlı adlara izin veren ncurses'da sağlanan bir uzantı kullanır . Termcap yalnızca 2 karakterlik adları ve 1023 baytlık açıklamaları desteklediğinden, bu genişletilmiş adları termcap arabirimi aracılığıyla kullanılabilir yapmak için bir neden yoktu . Terminfo arabirimini kullanan uygulamalar tarafından kolayca kullanılabilir .
Şimdi bir zorluk geliyor: Bir uygulamanın böyle bir tuş dizisinin neyi temsil ettiğini belirlemesinin birkaç yolu vardır:
Birincisi az program yapardı; Bazı metin düzenleyicileri ikinci (aslında, ben yaptım yapacağını bu için ded
de 1980'lerin sonlarında ). Gibi uygulamalar için geliştiriciler bash
bilginin çoğunun termcap olduğunu varsayarak üçüncü yolu seçti . Alternatif olarak, termcap / terminfo bilgileri içeren bir tablo oluşturmayı ve en iyi bilgileri veren arayüzü kullanmayı seçmiş olabilirler. xterm
bunu gerçek işlev tuşu atamaları sağlayarak tcap-query özelliği için yapar vim
.
Karşılaştırma yapan dizelerin hiçbiri aldığı dizelerle bash
eşleşmediğinden, kısmi eşleşmelere (kendi başına kaçış karakteri gibi) yerleşerek kafanız karışabilir.
Daha fazla okuma: