Cách tạo lối tắt bàn phím cho lệnh terminal


14

Tôi thường làm việc với git và yêu thích iTerm2 về khả năng đặt phím tắt cho các lệnh. Ví dụ: tôi đặt CTRL+ ENTERthành git status.

Điều này có thể với gnome-terminal hay bạn có thể đề xuất một tùy chọn khác để đạt được điều này?

Câu trả lời:


16

Bạn có thể sử dụng bind -xđể liên kết một lệnh với một phím tắt trong Bash. Ví dụ: để liên kết git statuslệnh với Crtl+ pphím tắt, bạn có thể sử dụng:

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

Đặt nó vào ~/.bashrctập tin để ghi nhớ nó. Từ trang nam:

-x keyseq: lệnh shell

Nguyên nhân lệnh shell được thực thi bất cứ khi nào keyseq được nhập. Khi lệnh shell được thực thi, shell sẽ đặt biến READLINE_LINE thành nội dung của bộ đệm dòng Readline và biến READLINE_POINT thành vị trí hiện tại của điểm chèn. Nếu lệnh được thực thi thay đổi giá trị của READLINE_LINE hoặc READLINE_POINT, những giá trị mới đó sẽ được phản ánh trong trạng thái chỉnh sửa.


Tuyệt vời. Tôi đang sử dụng zsh nhưng có một khóa tương đương gọi là bindkey . Vì vậy, để đạt được những gì tôi muốn, tôi đã làm điều này: bindkey -s '^[^M' 'git status\n'liên kết với ALT + ENTER.
mniess

1
bind -x '"\C-k":firefox'Tôi sử dụng cái này nhưng không hoạt động
alrcal

1
Điều này hoạt động trong vỏ, nhưng tôi muốn tất cả thời gian.
alrcal

Đặt nó ở cuối ~/.bashrctập tin. Nếu nó vẫn không hoạt động, hãy kiểm tra cái này
Nykakin

Thông tin thêm về việc sử dụng bindcó thể được tìm thấy ở đây: stackoverflow.com/a/4201274/712334
Josh Habdas

2

1. Tự động mở một cửa sổ terminal mới, hiển thị đầu ra của lệnh của bạn

Vì bạn cần giữ cho thiết bị đầu cuối mở sau khi lệnh chạy, đặt:

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

dưới một tổ hợp phím tắt, sẽ thực hiện công việc. Nó sẽ mở một cửa sổ mới gnome-terminal và chạy lệnh bên trong nó.

Thêm nó vào một phím tắt

Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:

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

đến Ctrl+Enter

Ghi chú

Mặc dù lối tắt được đề xuất của bạn hoạt động, bạn có thể chọn một tổ hợp phím khác sau đó Ctrl+ Enter, vì ít nhất nó sẽ đụng độ với LibreOfficephím tắt để chuyển sang một trang mới.

Giải trình

Để gnome-terminalmở cửa sổ mới từ dòng lệnh và chạy lệnh trong đó, bạn có thể sử dụng:

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

Tuy nhiên, mặc dù lệnh sẽ chạy thành công, cửa sổ terminal sẽ đóng ngay lập tức trước khi bạn có thể đọc đầu ra.

Phần:

read line

là để giữ cho thiết bị đầu cuối mở (cho đến khi bạn nhấn Enter) sau khi lệnh chạy.

Các lệnh khác

Bằng cách này, bạn có thể chạy bất kỳ lệnh (phức tạp) nào trong thiết bị đầu cuối mà không cần phải đóng ngay lập tức:

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

sẽ xuất ra (nếu wmctrlđược cài đặt):

nhập mô tả hình ảnh ở đây

Sau khi nhấn Enterthiết bị đầu cuối sẽ đóng lại.

2. Chạy lệnh trong cửa sổ gnome-terminal hiện đang hoạt động

Tất nhiên, bạn có thể đặt một lớp lót đơn giản dưới phím tắt (giả sử bạn đã xdotoolcài đặt):

xdotool type "<command>"

Tuy nhiên, điều này sẽ gõ lệnh một cách mù quáng , trong bất kỳ ứng dụng nào lệnh không phải là tùy chọn sạch nhất.

Do đó, đoạn script nhỏ bên dưới:

  • xem nếu cửa sổ hoạt động là một gnome-terminalcửa sổ (bởi pid của nó)
  • nếu vậy, nó sẽ dán lệnh trong gnome-terminalcửa sổ đang hoạt động , nhấn Return.
    Nếu không, tập lệnh không làm gì cả , vì vậy nó sẽ không dán vào các ứng dụng khác.

Vì tập lệnh lấy lệnh được nhắm mục tiêu làm đối số, bạn có thể đặt nhiều lệnh dưới nhiều phím tắt.

Kịch bản

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

Cách sử dụng

  1. Kịch bản cần xdotool

    sudo apt-get cài đặt xdotool

  2. Tạo một dirctory ~/binnếu nó chưa tồn tại, đăng xuất / đăng nhập hoặc chạysource ~/.profile

  3. Sao chép tập lệnh ở trên vào một tệp trống, lưu nó dưới dạng gterm_keys(không có phần mở rộng) ~/bin, làm cho nó có thể thực thi được

Bây giờ Bạn có thể chạy bất kỳ lệnh nào , từ phím tắt, trong gnome-terminalcửa sổ ngoài cùng bằng cách thêm lệnh:

gterm_keys <command>

đến một phím tắt, như được mô tả trong [1]


Xin chào Jacob, cảm ơn câu trả lời của bạn. Tuy nhiên, tôi nghĩ rằng các giải pháp liên kết (và bindkey) tốt hơn vì chúng là các phần tử dựng sẵn. Bằng cách đó, tôi sẽ không vô tình viết "trạng thái git" trong Libreoffice. ;)
mness

@mniess Tôi đồng ý câu trả lời là một câu hỏi hay, nhưng đối với hồ sơ, nếu bạn đọc kỹ câu trả lời của tôi, in bằng LibreOffice, điều đó không thể xảy ra . nhưng bạn vừa downvote ?? Điều đó thật vui nhộn.
Jacob Vlijm

Tôi biết, kịch bản kiểm tra cho ứng dụng đang chạy. Tôi đã không downvote. Tôi đã viết bình luận để cảm ơn bạn đã dành thời gian để viết một câu trả lời chi tiết như vậy.
mniess

@mniess Ah, xin lỗi vì đã đi đến kết luận! Hai đã xảy ra đồng bộ hoàn hảo. Tôi rất vui vì đó không phải là bạn. "Chỉ" một downvote tôi không bận tâm.
Jacob Vlijm

2

Trong trường hợp zsh được sử dụng thay cho bash, dòng sau trong ~/.zshrcliên kết git statusvới ALT+ ENTER.

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

Để lấy ALT+ ENTERtrong Bash, tôi sử dụng dòng này:

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

Làm thế nào một người đi về việc xác định các ràng buộc cho các khóa khác?
Josh Habdas

1
@JoshHabdas nhìn vào đây unix.stackexchange.com/questions/76566/NH
mniess
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.