터미널 명령에 대한 키보드 단축키를 만드는 방법


16

나는 종종 명령에 대한 키보드 단축키를 설정하는 기능을 위해 git과 사랑하는 iTerm2와 함께 일합니다. 예를 들어 CTRL+ ENTER를로 설정 했습니다 git status.

gnome-terminal에서 가능합니까 아니면 이것을 달성하기 위해 다른 옵션을 추천 할 수 있습니까?

답변:


17

bind -xBash에서 바로 가기에 명령을 바인딩하는 데 사용할 수 있습니다 . 예를 들어, git status명령을 Crtl+ p바로 가기 에 바인딩 하려면 다음을 사용할 수 있습니다.

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

그것을 ~/.bashrc기억하기 위해 파일에 넣으십시오 . 매뉴얼 페이지에서 :

-x keyseq : 쉘 명령

keyseq를 입력 할 때마다 쉘 명령이 실행되도록합니다. shell-command가 실행될 때, 쉘은 READLINE_LINE 변수를 Readline 라인 버퍼의 내용으로 설정하고 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을
조쉬 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. 현재 활성화 된 그놈 터미널 창에서 명령 실행

물론 당신은 수있는 바로 가기 키 (당신이 한 가정에서 간단하게 한 줄을 배치 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 설치 xdotool

  2. 디렉토리 ~/bin가 존재하지 않으면 로그 아웃 / 인 또는 실행source ~/.profile

  3. 빈 파일로 위의 스크립트를 복사로 저장 gterm_keys에서 (확장자) ~/bin, 메이크업 그것을 실행

이제 다음 명령을 추가하여 가장 앞쪽 창 에서 바로 가기 키로 모든 명령을 실행할 수 있습니다 gnome-terminal.

gterm_keys <command>

에 설명 된대로 바로 가기 키 [1]


야곱 안녕하세요, 답변 주셔서 감사합니다. 그러나 bind (및 bindkey) 솔루션은 쉘 내장이므로 더 좋습니다. 그렇게하면 실수로 Libreoffice에 "git status"를 쓰지 않습니다. ;)
mniess

@mniess 나는 대답이 좋은 것이라고 동의하지만, 기록을 위해 LibreOffice에서 인쇄 하면 내 대답을주의 깊게 읽으면 그렇게 될 수 없습니다 . 하지만 당신은 그냥 downvote 했습니까 ?? 재밌 네요.
Jacob Vlijm

스크립트가 실행중인 앱을 확인합니다. 나는 공감하지 않았다. 시간을내어 자세한 답변을 작성해 주셔서 감사합니다.
mniess

@mniess 아, 결론에 뛰어 들어 죄송합니다! 이 두 가지는 완벽하게 동기화되었습니다. 당신이 아니 어서 다행입니다. 난 그냥 신경 쓰지 않아요.
Jacob Vlijm

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.