Terminal komutu için klavye kısayolu nasıl oluşturulur


16

Komutlar için klavye kısayolları ayarlama yeteneği için genellikle git ve sevilen iTerm2 ile çalışırım. Örneğin, CTRL+ ENTERolarak ayarladım git status.

GNOME terminali ile bu mümkün mü yoksa bunu başarmak için başka bir seçenek önerebilir misiniz?

Yanıtlar:


17

bind -xBir komutu Bash'teki bir kısayola bağlamak için kullanabilirsiniz . Örneğin, git statuskomutu Crtl+ pkısayoluna bağlamak için şunları kullanabilirsiniz:

 bind -x '"\C-p":git status'

~/.bashrcHatırlamak için dosyaya koyun . Man sayfasından:

-x keyseq: kabuk komutu

Keyseq her girildiğinde yürütülecek shell-komutuna neden olur. Kabuk komutu yürütüldüğünde, kabuk READLINE_LINE değişkenini Readline satır arabelleğinin içeriğine ve READLINE_POINT değişkenini ekleme noktasının geçerli konumuna ayarlar. Yürütülen komut READLINE_LINE veya READLINE_POINT değerini değiştirirse, bu yeni değerler düzenleme durumuna yansıtılır.


Muhteşem. Zsh kullanıyorum ama bindkey denen bir eşdeğeri var . Yani istediğimi elde etmek için bunu yaptım: bindkey -s '^[^M' 'git status\n'hangi ALT + ENTER bağlanır.
Mniess

1
bind -x '"\C-k":firefox'Bunu kullanıyorum ama çalışmıyor
alhelal

1
Bu kabukta çalışıyor, ama her zaman istiyorum.
alhelal

1
~/.bashrcDosyanın sonuna koy . Hala işe yaramazsa, kontrol bu
Nykakin

Kullanmayla ilgili daha fazla bilgiyi bindburada bulabilirsiniz: stackoverflow.com/a/4201274/712334
Josh Habdas

2

1. Otomatik olarak komutunuzun çıktısını gösteren yeni bir terminal penceresi açın

Komut çalıştırıldıktan sonra terminali açık tutmanız gerektiğinden, şunu yazın:

gnome-terminal -e 'bash -c "git status; read line"'

kısayol tuşu kombinasyonu altında, işi yapacak. Bu bir açılacak yeni gnome-terminal pencere ve içindeki komutunu çalıştırın.

Kısayola ekle

Seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

gnome-terminal -e 'bash -c "git status; read line"'

için Ctrl+Enter

Not

Önerilen kısayolunuz çalışıyor olsa da , en azından yeni bir sayfaya atlamak için kısayolla çakıştığından Ctrl+ 'dan sonra başka bir tuş kombinasyonu seçebilirsiniz .EnterLibreOffice

açıklama

gnome-terminalKomut satırından yeni bir pencere açmak ve içinde bir komut çalıştırmak için aşağıdakileri kullanabilirsiniz:

gnome-terminal -e 'bash -c <command>'

Bununla birlikte, komut başarıyla çalışsa da, çıktıyı okuyabilmeniz için terminal penceresi hemen kapanacaktır.

Bölüm:

read line

Enterkomut çalıştıktan sonra terminali (vuruncaya kadar ) açık tutmaktır .

Diğer komutlar

Bu şekilde, terminalde herhangi bir (karmaşık) komutu hemen kapatmadan çalıştırabilirsiniz:

$ gnome-terminal -e 'bash -c "wmctrl -d; read line"'

( wmctrlkurulu ise) çıktı verir :

resim açıklamasını buraya girin

Basıldıktan Entersonra terminal kapanacaktır.

2. O anda etkin olan gnome terminali penceresinde bir komut çalıştırma

Tabii ki olabilir bir kısayol tuşu (eğer varsayarak altında basit tek astar koyun xdotoolyüklü):

xdotool type "<command>"

Ancak bu , herhangi bir uygulamada komutu körü körüne yazacaktır ve komutu yazmak en temiz seçenek değildir.

Bu nedenle aşağıdaki küçük komut dosyası:

  • etkin pencerenin bir gnome-terminalpencere olup olmadığını gösterir (pidine göre)
  • öyleyse, komutu etkin pencereye yapıştırırgnome-terminal , tuşuna basar Return.
    Değilse, komut dosyası hiçbir şey yapmaz , Yani diğer uygulamalara yapışmaz.

Komut dosyası, hedeflenen komutu bağımsız değişken olarak aldığından, birden çok kısayolun altına birden çok komut koyabilirsiniz.

Senaryo

#!/usr/bin/env python3
import subprocess
import sys
import time

app = "gnome-terminal"
s = (" ").join(sys.argv[1:])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def front(app):
    try:
        # see if gnome-terminal is running at all (raising error if not)
        app = get(["pgrep", app]) 
    except subprocess.CalledProcessError:
        app = False
    if app:
        # if so, see if the active window belongs to gnome-terminal comparing pids)
        active = get(["xdotool", "getwindowpid", get(["xdotool", "getactivewindow"])])
        return True if app == active else False

if front(app):
    # copy command to clipboard
    cm1 = ["/bin/bash", "-c", 'printf "'+s+'" | xclip -selection clipboard']
    # paste in terminal window
    cm2 = ["xdotool", "key", "Control_L+Shift_L+v"]
    # press return
    cm3 = ["xdotool", "key", "Return"]
    for cm in [cm1, cm2, cm3]:
        subprocess.call(cm)

Nasıl kullanılır

  1. Betiğin ihtiyacı var xdotool

    sudo uygun-get install xdotool

  2. Henüz ~/binyoksa bir dizin oluşturun, oturumu kapatın / oturum açın veya çalıştırınsource ~/.profile

  3. Yukarıdaki komut dosyasını boş bir dosyaya kopyalayın, gterm_keys(uzantı yok) olarak kaydedin ~/bin, yürütülebilir yapın

Şimdi komutu ekleyerek en ön pencerede bir kısayol tuşundan herhangi bir komutu çalıştırabilirsiniz gnome-terminal:

gterm_keys <command>

bölümünde açıklandığı gibi bir kısayol tuşuna [1]


Merhaba Jacob, cevabın için teşekkürler. Bununla birlikte, bind (ve bindkey) çözümleri kabuk yerleşikleri oldukları için daha iyi olduğunu düşünüyorum. Bu şekilde yanlışlıkla Libreoffice'e "git status" yazmayacağım. ;)
mniess

Mniess Cevabın iyi olduğunu kabul ediyorum, ancak kayıt için, cevabımı dikkatlice okursanız, LibreOffice'de yazdırıyorsanız, bu olamaz . ama sadece indirdin mi ?? Bu çok komik.
Jacob Vlijm

Biliyorum, script çalışan uygulamayı kontrol eder. Ben inmedim. Bu kadar ayrıntılı bir cevap yazmaya zaman ayırdığınız için teşekkür etmek için yorumu yazdım.
mniess

mniess Ah, sonuçlara atladığım için üzgünüm! İkisi mükemmel senkronize oldu. Senin olmadığına sevindim. "Sadece" umursamıyorum bir aşağılık oy.
Jacob Vlijm

2

Durumda zsh olarak, yerine Bash aşağıdaki satırı kullanılan ~/.zshrcbağlar git statusiçin ALT+ ENTER.

bindkey -s '^[^M' 'git status\n'

Bash'de ALT+ almak ENTERiçin bu satırı kullanıyorum:

bind -x '"\e\C-m":git status'

Kişi diğer anahtarların bağlantılarını nasıl belirleyebilir?
Josh Habdas

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.