Cara membuat pintasan keyboard untuk perintah terminal

15

Saya sering bekerja dengan git dan menyukai iTerm2 untuk kemampuan mengatur pintasan keyboard untuk perintah. Misalnya, saya mengatur CTRL+ ENTERke git status.

Apakah ini mungkin dengan gnome-terminal atau dapatkah Anda merekomendasikan opsi lain untuk mencapai ini?

mniess
sumber

Jawaban:

16

Anda bisa menggunakan bind -xuntuk mengikat perintah ke pintasan di Bash. Misalnya, untuk mengikat git statusperintah ke Crtl+ ppintas Anda dapat menggunakan:

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

Masukkan ke dalam ~/.bashrcfile untuk mengingatnya. Dari halaman manual:

-x keyseq: shell-command

Menyebabkan shell-command dieksekusi setiap kali keyseq dimasukkan. Ketika shell-command dieksekusi, shell menetapkan variabel READLINE_LINE ke isi buffer baris Readline dan variabel READLINE_POINT ke lokasi saat ini dari titik penyisipan. Jika perintah yang dieksekusi mengubah nilai READLINE_LINE atau READLINE_POINT, nilai-nilai baru itu akan tercermin dalam keadaan pengeditan.

Nykakin
sumber
Luar biasa. Saya menggunakan zsh tetapi yang memiliki disebut setara bindkey . Jadi untuk mencapai apa yang saya inginkan, saya melakukan ini: bindkey -s '^[^M' 'git status\n'yang mengikat ke ALT + ENTER.
mniess
1
bind -x '"\C-k":firefox'Saya menggunakan ini tetapi tidak berhasil
alhelal
1
Ini bekerja di shell, tetapi saya ingin sepanjang waktu.
alhelal
Letakkan di akhir ~/.bashrcfile. Jika masih tidak berhasil, periksa ini
Nykakin
Informasi lebih lanjut tentang penggunaan binddapat ditemukan di sini: stackoverflow.com/a/4201274/712334
Josh Habdas
2

1. Secara otomatis membuka jendela terminal baru, menampilkan output dari perintah Anda

Karena Anda perlu menjaga terminal terbuka setelah perintah dijalankan, meletakkan:

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

di bawah kombinasi tombol pintas, akan melakukan pekerjaan. Ini akan membuka jendela baru gnome-terminal dan menjalankan perintah di dalamnya.

Tambahkan ke jalan pintas

Pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:

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

ke Ctrl+Enter

Catatan

Meskipun pintasan yang disarankan Anda berfungsi, Anda dapat memilih kombinasi tombol lain kemudian Ctrl+ Enter, karena setidaknya bentrok dengan LibreOfficepintasan untuk melompat ke halaman baru.

Penjelasan

Untuk gnome-terminalmembuka jendela baru dari baris perintah, dan menjalankan perintah di dalamnya, Anda dapat menggunakan:

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

Namun, meskipun perintah akan berjalan dengan sukses, jendela terminal akan segera ditutup sebelum Anda dapat membaca hasilnya.

Bagian:

read line

kemudian untuk menjaga terminal terbuka (sampai Anda menekan Enter) setelah perintah dijalankan.

Perintah lainnya

Dengan cara ini, Anda dapat menjalankan perintah (kompleks) apa saja di terminal, tanpa harus segera ditutup:

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

akan menampilkan (jika wmctrldiinstal):

masukkan deskripsi gambar di sini

Setelah menekan Enterterminal akan ditutup.

2. Menjalankan perintah di jendela terminal gnome yang saat ini aktif

Tentu saja Anda dapat menempatkan satu-liner sederhana di bawah tombol pintas (dengan asumsi Anda telah xdotoolmenginstal):

xdotool type "<command>"

Namun ini akan mengetik perintah secara membabi buta , dalam aplikasi apa pun , dan mengetikkan perintah bukanlah pilihan terbersih.

Oleh karena itu, skrip kecil di bawah ini:

  • terlihat jika jendela aktif adalah gnome-terminaljendela (dengan pidnya)
  • jika demikian, itu menempelkan perintah di gnome-terminaljendela aktif , tekan Return.
    Jika tidak, skrip tidak melakukan apa - apa , sehingga tidak akan menempel ke aplikasi lain.

Karena skrip mengambil perintah yang ditargetkan sebagai argumen, Anda dapat menempatkan beberapa perintah di bawah beberapa pintasan.

Naskah

#!/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)

Cara Penggunaan

  1. Kebutuhan skrip xdotool

    sudo apt-get install xdotool

  2. Buat direktori ~/binjika belum ada, logout / jalankan atau jalankansource ~/.profile

  3. Salin skrip di atas ke dalam file kosong, simpan sebagai gterm_keys(tanpa ekstensi) di ~/bin, membuatnya dapat dieksekusi

Sekarang Anda dapat menjalankan perintah apa pun , dari tombol pintas, di gnome-terminaljendela paling depan dengan menambahkan perintah:

gterm_keys <command>

ke tombol cara pintas, seperti dijelaskan dalam [1]

Yakub Vlijm
sumber
Hai Jacob, terima kasih atas jawaban Anda. Saya pikir, meskipun, solusi bind (dan bindkey) lebih baik karena mereka shell-builtin. Dengan begitu saya tidak akan sengaja menulis "status git" di Libreoffice. ;)
mniess
@ Nyonya Saya setuju jawabannya bagus, tetapi sebagai catatan, jika Anda membaca jawaban saya dengan hati-hati, mencetak di LibreOffice, itu tidak mungkin terjadi . tetapi apakah Anda baru saja downvote ?? Lucu sekali.
Yakub Vlijm
Saya tahu, skrip memeriksa untuk menjalankan aplikasi. Saya tidak downvote. Saya menulis komentar untuk mengucapkan terima kasih karena telah meluangkan waktu untuk menulis jawaban yang begitu terperinci.
mniess
@ Nyonya Ah, maaf sudah langsung menyimpulkan! Keduanya terjadi disinkronkan dengan sempurna. Aku senang bukan kamu. "Hanya" downvote saya tidak keberatan.
Jacob Vlijm
2

Jika zsh digunakan sebagai ganti bash, baris berikut ~/.zshrcdiikat git statuske ALT+ ENTER.

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

Untuk mendapatkan ALT+ ENTERdi Bash, saya menggunakan baris ini:

bind -x '"\e\C-m":git status'
mniess
sumber
Bagaimana cara mengidentifikasi pengikatan untuk kunci lain?
Josh Habdas
1
@JoshHabdas lihat di sini unix.stackexchange.com/questions/76566/...
mniess