Alt + Ok tuşlarına basıldığında yazdırılan karakterler nelerdir?


13

Ben basın AltUp, Auç ekrana basılmış. Aynı şey bastığımda da oldu AltDownama Bonun yerine basıldı.

Fark ettiğim diğer karakterler;

AltLeft= Dve AltRight=C

Bu komutların amacı nedir?

Yanıtlar:


14

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ı \eveya ^[veya \033karakter 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[Aya da \033OAuygulama 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 barsonra 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 zshveya viokursa, terminfo veritabanından ( kcuu1yetenek), 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 rxvtve benzerleri gibi türevleri etermgöndermek \033için çıkış sırası takip Up(olup \033\033[Aya da \033\033OA), gibi bazıları ise xtermya da gnome-terminalkombinasyonu 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[Aya da \033[1;3Abirç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. bashmesela \033[1;3bir 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[1yüzden bunu atlar ve geri kalanını okur: ;3Ave bunu satır düzenleyicisine ekler.

Gibi Birçok uygulama vi, zshya readlinebenzeri bazlı olanlar gdbveya bash(gerçi dikkat bashkullanı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.


3

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 [[Bdeğ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;3CGiriş 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.AltCrtlvCrtlAlt

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


3

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 bashbasmanı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 verilebilir smmve rmm.

bashbunu 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ü xtermbireyin 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 xtermoluş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:

  1. karakter dizisini tamamen analiz eder
  2. kısmen analiz edin ve controlgerekirse değiştiriciyi atın
  3. karakter dizisini bir sözlükle karşılaştırın ve anlamını bu şekilde belirlemeyi umun.

Birincisi az program yapardı; Bazı metin düzenleyicileri ikinci (aslında, ben yaptım yapacağını bu için dedde 1980'lerin sonlarında ). Gibi uygulamalar için geliştiriciler bashbilginin ç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. xtermbunu 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 basheşleşmediğinden, kısmi eşleşmelere (kendi başına kaçış karakteri gibi) yerleşerek kafanız karışabilir.

Daha fazla okuma:

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.