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

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



답변

당신은 눌러 키에 의해 방출되는 문자 순서를 확인할 수 있습니다 Ctrlv명령 줄에서, 당신이 관심있는 키를 눌러 내 시스템에. 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"'

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

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

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

편집하다:

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

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

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

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

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


답변

~/.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를 누르십시오’.


답변

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

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

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


답변

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

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

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

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

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


답변