bash에서 기능 키를 명령에 어떻게 바인딩합니까?


91

예 : "foobar"메시지를 F12누를 echo "foobar"때마다 F12화면에 인쇄되도록 키를 명령 에 바인딩하고 싶습니다 . 이상적으로는 내장 기능뿐만 아니라 임의의 쉘 명령 일 수 있습니다. 이것에 대해 어떻게 갑니까?

답변:


164

당신은 눌러 키에 의해 방출되는 문자 순서를 확인할 수 있습니다 Ctrl- v명령 줄에서, 당신이 관심있는 키를 눌러 내 시스템에. F12, 내가 얻을 ^[[24~. 을 ^[나타냅니다 Esc. 다른 유형의 터미널 또는 터미널 에뮬레이터는 동일한 키에 대해 다른 코드를 내보낼 수 있습니다.

Bash 프롬프트에서 다음과 같은 명령을 입력하여 키 매크로를 활성화하여 사용해 볼 수 있습니다.

bind '"\e[24~":"foobar"'

이제를 누르면 F12추가 편집을 위해 명령 줄에 "foobar"가 표시됩니다. 키 입력으로 명령을 즉시 입력하려면 새 줄을 추가 할 수 있습니다.

bind '"\e[24~":"pwd\n"'

이제를 누르면를 누르지 F12않아도 현재 디렉토리가 표시됩니다 Enter. 이미 줄에 무언가를 입력했고 자동으로 실행되는 이것을 사용한다면 어떨까요? 지저분해질 수 있습니다. 그러나 매크로의 일부로 줄을 지울 수 있습니다.

bind '"\e[24~":"\C-k \C-upwd\n"'

이 공간은 Ctrl- u에 벨이 울리지 않도록 삭제할 내용이 있는지 확인합니다 .

원하는 방식으로 매크로가 작동하면 ~/.inputrc파일 에 추가하여 영구적으로 만들 수 있습니다. bind명령이나 외부 작은 따옴표 세트가 필요하지 않습니다 .

"\e[24~":"\C-k \C-upwd\n"

편집하다:

현재 명령 줄을 방해하지 않고 무언가를 실행할 키 바인딩을 만들 수도 있습니다.

bind -x '"\eW":"who"'

그럼 당신은 예를 들어, 사용자 이름을 필요로하는 명령을 입력하고, 당신은 당신이 누를 수, 로그인 한 사용자의 이름을 알 필요가있는 동안 Alt- Shift- W와의 출력이 who표시되고 메시지가 다시 발행 될 것입니다 부분 명령은 그대로두고 커서는 줄의 같은 위치에 있습니다.

불행히도 이것은 F12두 개 이상의 문자를 출력하는 것과 같은 키에 대해서는 제대로 작동하지 않습니다 . 어떤 경우에는이 문제를 해결할 수 있습니다.

명령 ( who이 경우)은 프로그램, 스크립트 또는 함수와 같은 실행 파일 일 수 있습니다.


2
"ctrl + q"에 바인딩을 추가하려면 어떻게해야합니까?
kubudi 2013

5
@kubudi : bind '"\C-q": menu-complete'예를 들어 (또는 당신 ~/.inputrc: "\C-q": menu-complete). 또한 stty -ixon에서 ~/.bashrc흐름 제어를 비활성화하고 ^ S 및 ^ Q를 사용할 수 있도록 해야 할 수도 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

당신은 그것을 ^[대표 한다고 말하고 당신의 예에서 esc그것을 대체하는 것처럼 보입니다 \e. 이유를 설명해 주시겠습니까?
Remover

1
@Remover : ^[출력 표현입니다. (가) \e를 입력하는 방법 중 하나입니다 ( ^[이 작동하지 않습니다).
추후 공지가있을 때까지 일시 중지되었습니다.

"\ Cz"를 어떻게 바인딩 할 수 있습니까? 나는에 zsh을 설명한 무슨 같은 것을 얻을 싶어요 sheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch

19

~/.inputrc(GNU Readline 라이브러리의 구성 파일) 에서 bash 키 바인딩을 정의 할 수 있습니다 . 구문은

<keysym 또는 키 이름> : 매크로

예를 들면 :

Control-o: "> output"

를 누르면 "> 출력"을 삽입하는 매크로가 생성됩니다. ControlO

 "\e[11~": "echo foobar"

를 누를 때 "echo foobar"를 삽입하는 매크로를 생성합니다 F1. 키 심이 무엇인지 잘 모르겠습니다 F11.

편집하다:

.inputrc\n줄 바꿈 의 이스케이프 시퀀스를 이해 하므로 다음을 사용할 수 있습니다.

 "\e[11~": "echo foobar\n"

명령이 실행 된 후 효과적으로 'Enter를 누르십시오'.


4
매크로 내에서 "\ n"을 사용하여 개행 문자를 추가 할 수 있습니다.
Barton Chittenden

이것은 터미널을 열 때 키 매핑을 정의하기 때문에 더 잘 작동합니다.
Heldraug

의 경우 Alt, \e예를 들어 "\eo": "> output".
제니스 Elmeris

에 대한 더 심도있는 자습서 .inputrc를 참조 hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion을
조쉬 Habdas을

1
@ArthurHenriqueDellaFraga 나는 대답을 편집했습니다; 홈 디렉토리에 있습니다. 존재하지 않는 경우 만들 수 있습니다.
Barton Chittenden

7

이 솔루션은 X11 환경에만 해당되며 bash와는 관련이 없지만 .Xmodmaps에 다음을 추가합니다.

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

F12를 누르면 "foobar"문자열이 터미널에 전송됩니다.


이것은 명령을 실행하는 쉘과 동일하지 않습니다. 실제로 명령을 실행하려면 Enter 키를 눌러야합니다 (또는 전송 된 문자열이 대신 수행하도록합니다). 아마도 안전하고 먼저 선을 지우고 싶을 것입니다.
Cascabel

2
이것은 굉장 할 것이지만 어쨌든 Fedora 20에서는 작동하지 않는 것 같습니다. 나는 xev를 사용하여 F12에 대한 적절한 키 코드를 먼저 찾고 (제 경우에는 96) 88 대신 사용하려고했습니다. 둘 다 작동하지 않습니다.
BobDoolittle

2

나는 Ctrl+B명령 에 묶고 싶었다 . 위의 답변에서 영감을 받아 사용하려고했지만 bind일련의 비밀 물결 선 ( \e[24~?)이 Ctrl+B.

Mac에서 터미널 앱의 설정, 프로파일-> 키보드->로 이동 +한 다음 원하는 키보드 단축키를 누르면 나타납니다. 나를 위해 Ctrl+B결과에 \002있는 내가 성공적으로 명령에 바인딩

bind '"\002":"echo command"'

또한 명령이 프롬프트에 삽입되는 것이 아니라 바로 실행되도록하려면 다음과 같이 명령 끝에 Enter를 추가 할 수 있습니다.

bind '"\002":"echo command\015"'

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