Bash'de bir işlev tuşunu bir komuta nasıl bağlarım?


91

Örnek: F12Anahtarı komuta echo "foobar"her F12bastığımda "foobar" mesajı ekrana yazdırılacak şekilde bağlamak istiyorum . İdeal olarak, sadece yerleşikler değil, herhangi bir rastgele kabuk komutu olabilir. Bu nasıl yapılır?

Yanıtlar:


165

Bir tuşun çıkardığı karakter sırasını komut satırında Ctrl- tuşuna basıp v, ardından ilgilendiğiniz tuşa basarak belirleyebilirsiniz. Sistemimde F12, anladım ^[[24~. ^[Temsil eder Esc. Farklı terminal türleri veya terminal emülatörleri, aynı anahtar için farklı kodlar yayabilir.

Bash isteminde, anahtar makroyu etkinleştirmek için buna benzer bir komut girebilirsiniz, böylece deneyebilirsiniz.

bind '"\e[24~":"foobar"'

Şimdi, tuşuna bastığınızda F12, daha fazla düzenleme için komut satırında "foobar" göreceksiniz. Bir tuş vuruşunun hemen bir komut girmesini istiyorsanız, yeni bir satır ekleyebilirsiniz:

bind '"\e[24~":"pwd\n"'

Şimdi tuşuna bastığınızda F12, geçerli dizini, basmanıza gerek kalmadan görüntüleyeceksiniz Enter. Ya satıra zaten bir şey yazdıysanız ve otomatik olarak çalışan bunu kullanırsanız? Dağınık olabilir. Ancak, makronuzun bir parçası olarak satırı temizleyebilirsiniz:

bind '"\e[24~":"\C-k \C-upwd\n"'

Uzay emin olur Ctrl- uçalmasını zili tutmaya silmek için bir şey vardır.

Makroyu istediğiniz şekilde çalıştırdıktan sonra, ~/.inputrcdosyanıza ekleyerek onu kalıcı hale getirebilirsiniz . bindKomuta veya tek tırnak dış kümesine gerek yoktur :

"\e[24~":"\C-k \C-upwd\n"

Düzenle:

Ayrıca, mevcut komut satırını bozmadan bir şey yürütecek bir anahtar bağlama da oluşturabilirsiniz.

bind -x '"\eW":"who"'

Sonra, örneğin bir kullanıcı adı gerektiren bir komut yazarak ediyoruz ve siz basabilirsiniz, oturum kullanıcının isimlerini bilmemiz gerekir iken Alt- Shift- Wve çıkış whogörüntülenir ve hızlı tekrar düzenlenmesini olacak Kısmi komutunuz bozulmamış ve imleç satırda aynı konumdadır.

Ne yazık ki, bu F12iki karakterden fazla çıktı veren anahtarlar için düzgün çalışmıyor . Bazı durumlarda bu çözülebilir.

Komut ( whobu durumda) herhangi bir yürütülebilir - bir program, komut dosyası veya işlev olabilir.


2
Ya "ctrl + q" için bir bağlantı eklemek istersem?
kubudi

5
@kubudi: bind '"\C-q": menu-complete'örneğin (veya içinde senin ~/.inputrc: "\C-q": menu-complete). Ayrıca stty -ixon, ~/.bashrcakış denetimini devre dışı bırakmanız ve ^ S ve ^ Q'yu kullanılabilir hale getirmeniz gerekebilir .
sonraki duyuruya kadar duraklatıldı.

Bunun ^[temsil ettiğini söylüyorsunuz escve sonra \eörneğinizde onun yerine geçiyor görünüyorsunuz . Neden lütfen açıklar mısınız?
Temizleyici

1
@Remover: ^[Çıktı gösterimidir. Girmenin \ebir yolu (bunun ^[için çalışmıyor).
sonraki duyuruya kadar duraklatıldı.


19

Bash anahtar bağlamalarını ~/.inputrc(GNU Readline kitaplığı için yapılandırma dosyası) içinde tanımlayabilirsiniz . Sözdizimi

<anahtar kelime veya anahtar adı>: makro

Örneğin:

Control-o: "> output"

düğmesine bastığınızda "> çıktı" ekleyen bir makro oluşturur ControlO

 "\e[11~": "echo foobar"

tuşuna bastığınızda "echo foobar" ekleyen bir makro oluşturacak F1... Anahtarın ne anlama geldiğini bilmiyorum F11.

Düzenle:

.inputrc\nsatır besleme için kaçış sırasını anlar , böylece kullanabilirsiniz

 "\e[11~": "echo foobar\n"

Komut verildikten sonra etkin bir şekilde 'enter tuşuna basın'.


4
yeni satır karakteri eklemek için bir makro içinde "\ n" kullanabilirsiniz:
Barton Chittenden

Bu, bir terminal açarken anahtar eşlemeyi tanımladığı için benim için daha iyi çalışıyor.
Heldraug

İçin Altkullanımı \e, mesela "\eo": "> output".
Jānis Elmeris

Kullanmayla ilgili daha derinlemesine bir eğitici için .inputrcbkz hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Josh Habdas

1
@ArthurHenriqueDellaFraga Cevabı düzenledim; ana dizininizde olacaktır. Eğer yoksa, yaratabilirsiniz.
Barton Chittenden

7

Bu çözüm X11 ortamlarına özgüdür ve bash ile ilgisi yoktur, ancak aşağıdakileri .Xmodmap'lerinize ekler.

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

F12'ye basıldığında "foobar" dizesini terminale gönderecektir.


Bunun, bir komut çalıştıran kabukla aynı olmadığını unutmayın. Aslında bir komutu çalıştırmak istiyorsanız, enter tuşuna basmanız gerekir (veya gönderilen dizenin bunu sizin için yapmasını sağlamanız gerekir). Muhtemelen güvende olmak ve önce çizgiyi temizlemek de istersiniz.
Cascabel

2
Bu harika olurdu, ancak yine de Fedora 20'den itibaren çalışmıyor gibi görünüyor. Hatta önce F12 için uygun anahtar kodunu bulmak için (benim durumumda 96) xev kullanmayı ve 88 yerine kullanmayı denedim. İkisi de çalışmıyor.
BobDoolittle

2

Ctrl+BBir komuta bağlanmak istedim . Yukarıdaki bir cevaptan esinlenerek, kullanmaya çalıştım bindama hangi şifreli dalgalı çizgiler ( \e[24~?) Dizisinin tercüme edildiğini çözemedim Ctrl+B.

Mac'te, Terminal uygulamasının Ayarlar, Profiller -> Klavye -> +bölümüne gidin, ardından peşinde olduğunuz klavye kısayoluna basın ve çıkar. Benim için başarıyla komuta bağlandığım Ctrl+Bsonuçlandı\002

bind '"\002":"echo command"'

Ayrıca, komutun hemen çalıştırılmasını istiyorsanız (yalnızca komut istemine eklenmek değil), aşağıdaki gibi komutunuzun sonuna Enter'ı ekleyebilirsiniz:

bind '"\002":"echo command\015"'

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.