วิธีสร้างแป้นพิมพ์ลัดสำหรับคำสั่งเทอร์มินัล


16

ฉันมักจะทำงานกับคอมไพล์และรัก iTerm2 สำหรับความสามารถในการตั้งค่าแป้นพิมพ์ลัดสำหรับคำสั่ง ตัวอย่างเช่นผมตั้งCTRL+ ไปENTERgit status

เป็นไปได้ด้วยคำพังเพยขั้วหรือคุณสามารถแนะนำตัวเลือกอื่นเพื่อให้บรรลุนี้

คำตอบ:


17

คุณสามารถใช้bind -xเพื่อผูกคำสั่งกับทางลัดใน Bash ตัวอย่างเช่นในการผูกgit statusคำสั่งกับCrtl+ pทางลัดคุณสามารถใช้:

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

ใส่ลงใน~/.bashrcไฟล์เพื่อจดจำ จากหน้าคน:

-x keyseq: shell-command

ทำให้เชลล์คำสั่งถูกเรียกใช้งานเมื่อใดก็ตามที่ป้อน keyseq เมื่อเชลล์คำสั่งถูกเรียกใช้งานเชลล์จะตั้งค่าตัวแปร READLINE_LINE เป็นเนื้อหาของบัฟเฟอร์บรรทัดไลน์และตัวแปร READLINE_POINT เป็นตำแหน่งปัจจุบันของจุดแทรก หากคำสั่งที่ดำเนินการเปลี่ยนแปลงค่าของ READLINE_LINE หรือ READLINE_POINT ค่าใหม่เหล่านั้นจะปรากฏในสถานะการแก้ไข


น่ากลัว ฉันใช้ zsh แต่ที่มีเทียบเท่าที่เรียกว่าbindkey ดังนั้นเพื่อให้บรรลุสิ่งที่ฉันต้องการฉันทำสิ่งนี้: bindkey -s '^[^M' 'git status\n'ซึ่งผูกกับ ALT + ENTER
mniess

1
bind -x '"\C-k":firefox'ฉันใช้สิ่งนี้ แต่ใช้งานไม่ได้
alhelal

1
มันใช้งานได้ในเปลือก แต่ฉันต้องการตลอดเวลา
alhelal

วางไว้ที่ท้าย~/.bashrcไฟล์ หากยังใช้งานไม่ได้ให้ตรวจสอบสิ่งนี้
Nykakin

ข้อมูลเพิ่มเติมเกี่ยวกับการใช้bindสามารถดูได้ที่นี่: stackoverflow.com/a/4201274/712334
Josh Habdas

2

1. เปิดหน้าต่างเทอร์มินัลใหม่โดยอัตโนมัติเพื่อแสดงผลลัพธ์ของคำสั่งของคุณ

เนื่องจากคุณต้องเปิดเทอร์มินัลหลังจากที่คำสั่งรันอยู่ทำให้:

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

ภายใต้คีย์ลัดรวมกันจะทำงาน มันจะเปิดหน้าต่างใหม่ gnome-terminalและเรียกใช้คำสั่งภายใน

เพิ่มลงในทางลัด

เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:

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

ถึงCtrl+Enter

บันทึก

แม้ว่าทางลัดที่แนะนำของคุณจะใช้งานได้คุณอาจเลือกชุดคีย์อื่นแล้วCtrl+ Enterเพราะอย่างน้อยก็ขัดแย้งกับLibreOfficeทางลัดเพื่อข้ามไปยังหน้าใหม่

คำอธิบาย

ในการgnome-terminalเปิดหน้าต่างใหม่จากบรรทัดคำสั่งและเรียกใช้คำสั่งในหน้าต่างนั้นคุณสามารถใช้:

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

อย่างไรก็ตามแม้ว่าคำสั่งจะทำงานได้สำเร็จ แต่หน้าต่างเทอร์มินัลจะปิดทันทีก่อนที่คุณจะสามารถอ่านเอาต์พุต

ส่วน:

read line

คือให้เปิดเทอร์มินัล (จนกว่าคุณจะตีEnter) หลังจากคำสั่งรัน

คำสั่งอื่น ๆ

ด้วยวิธีนี้คุณสามารถเรียกใช้คำสั่งใด ๆ (ซับซ้อน) ในเทอร์มินัลโดยไม่ต้องปิดมันทันที:

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

จะส่งออก (ถ้าwmctrlติดตั้ง):

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากกดEnterขั้วจะปิด

2. การเรียกใช้คำสั่งในหน้าต่าง gnome-terminal ที่ใช้งานในปัจจุบัน

แน่นอนคุณสามารถวางหนึ่งซับง่ายๆภายใต้คีย์ลัด (สมมติว่าคุณxdotoolติดตั้ง):

xdotool type "<command>"

อย่างไรก็ตามสิ่งนี้จะพิมพ์คำสั่งสุ่มสี่สุ่มห้าในแอปพลิเคชันใด ๆและการพิมพ์คำสั่งไม่ใช่ตัวเลือกที่ดีที่สุด

สคริปต์ขนาดเล็กด้านล่าง:

  • ดูว่าหน้าต่างที่ใช้งานอยู่เป็นgnome-terminalหน้าต่าง (ตาม pid)
  • ถ้าเป็นเช่นนั้นก็วางคำสั่งในการใช้งานgnome-terminalหน้าต่าง, Returnเครื่องรีด
    ถ้าไม่สคริปต์ไม่ทำอะไรเลยมันจะไม่วางลงในแอปพลิเคชันอื่น

เนื่องจากสคริปต์ใช้คำสั่งเป้าหมายเป็นอาร์กิวเมนต์คุณสามารถวางหลายคำสั่งภายใต้ช็อตคัตหลายตัว

บท

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

วิธีใช้

  1. สคริปต์ต้องการ xdotool

    sudo apt-get install xdotool

  2. สร้าง dirctory ~/binหากยังไม่มีให้ออกจากระบบ / ออกหรือเรียกใช้source ~/.profile

  3. คัดลอกสคริปต์ด้านบนลงในไฟล์เปล่าบันทึกเป็นgterm_keys(ไม่มีส่วนขยาย) ~/binเพื่อให้สามารถเรียกใช้งานได้

ตอนนี้คุณสามารถเรียกใช้คำสั่งใด ๆจากปุ่มลัดในgnome-terminalหน้าต่างด้านหน้าโดยเพิ่มคำสั่ง:

gterm_keys <command>

ไปที่คีย์ลัดดังอธิบายใน [1]


สวัสดีจาค็อบขอบคุณสำหรับคำตอบของคุณ แต่ฉันคิดว่าการแก้ปัญหาการผูก (และ bindkey) นั้นดีกว่าเพราะพวกมันสร้างเชลล์ขึ้นมา ด้วยวิธีนี้ฉันจะไม่เขียน "สถานะ git" ใน Libreoffice โดยไม่ตั้งใจ ;)
mniess

@mniess ฉันเห็นด้วยกับคำตอบนั้นเป็นสิ่งที่ดี แต่สำหรับบันทึกถ้าคุณอ่านคำตอบของฉันอย่างระมัดระวังพิมพ์ใน LibreOffice นั่นไม่สามารถเกิดขึ้นได้ แต่คุณเพิ่งลงคะแนนหรือไม่? นั่นคือเฮฮา
Jacob Vlijm

ฉันรู้ว่าสคริปต์ตรวจสอบแอปที่รันอยู่ ฉันไม่ได้ลงคะแนน ฉันเขียนความคิดเห็นเพื่อขอบคุณที่สละเวลาเขียนคำตอบอย่างละเอียด
mniess

@mniess Ah ขอโทษที่กระโดดไปสู่ข้อสรุป! ทั้งสองเกิดขึ้นตรงกันอย่างสมบูรณ์แบบ ฉันดีใจที่ไม่ใช่คุณ "Just" downvote ฉันไม่สนใจ
Jacob Vlijm

2

ในกรณี zsh ใช้แทนทุบตีบรรทัดต่อไปนี้ใน~/.zshrcการเชื่อมโยงที่git statusจะ+ALTENTER

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

รับALT+ ENTERใน Bash ฉันใช้บรรทัดนี้:

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

เราจะระบุการผูกสำหรับคีย์อื่น ๆ ได้อย่างไร?
Josh Habdas

1
@JoshHabdas ดูที่นี่unix.stackexchange.com/questions/76566/…
mniess
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.