.inputrc를 통해 터미널 애플리케이션의 다른 명령에 Ci 및 TAB 키를 바인딩합니다.

.inputrc를 통해 터미널 애플리케이션의 다른 명령에 Ci 및 TAB 키를 바인딩합니다.

내가 시도한 바에 따르면 .inputrc에서 동일한 것을 의미하는 것 같습니다. 하나에 바인딩하면 다른 것에 바인딩됩니다 TAB. C-i나는 그것이 원래 같은 것이고 이 동작이 옛날로부터 상속되었다는 것을 알고 있지만 이제 터미널 에뮬레이터를 제외한 모든 X 응용 프로그램은 a C-iTABpress를 구별합니다.

TAB그러면 해당 키를 누를 때 터미널 명령(예: "done")을 실행하고 눌렀을 때 다른 명령을 실행할 수 있는 방법이 있습니까 C-i?

(동일한 문제는 C-mENTER, C-zC-d원래 바인딩이 아닌 다른 수단을 통해 보내고 이러한 귀중한 키 바인딩에 내 명령을 적용하려는 모든 제어 시퀀스에 적용됩니다.)

그런데, 키 입력부터 쉘 해석까지의 과정을 설명해 주시면 이해하는 데 도움이 될 것입니다. 이제 나는 키보드 이벤트가 Xmodmap에 의해 변환되고, Xmodmap이 .inputrc에 의해 변환되고, 그 결과가 셸 또는 이와 유사한 것에 의해 해석된다는 것을 이해합니다.

저는 현재 Guake를 사용하고 때로는 gnome-terminal을 터미널 에뮬레이터로 사용합니다.

주석에 제안된 링크를 따라가면 터미널 에뮬레이터는 TABX 서버의 키심(keyym)을 변환하여 C-ibash 셸로 보내는 체인의 요소인 것으로 보입니다. 이는 TAB, ENTER피어와 같은 것을 이해하지 못하기 때문입니다. 따라서 readline 자체를 구성하는 것은 터미널 에뮬레이터 뒤, bash 쉘 앞에 위치하므로 아무런 효과가 없습니다. 따라서 질문은 다음과 같이 정확할 수 있습니다. TAB및 등 C-i을 다른 문자 시퀀스 쌍으로 변환하도록 터미널 에뮬레이터를 어떻게 구성합니까 ? 나중에 .inputrc의 원래 명령에 매핑되고 결국 다른 목적 으로 사용될 수 있는 새로운 사용자 정의 이스케이프 시퀀스를 만들어 보낼 수도 있습니다 . 아니면 나가서 이스케이프 시퀀스 를 만들어 보내세요 .ENTERC-mTABENTERC-iC-mTABENTERC-iC-m

답변1

터미널 에뮬레이터는 " Tab키 누름"과 같은 이벤트를 터미널에서 실행 중인 애플리케이션(귀하의 경우 bash)이 읽을 수 있는 일련의 문자로 변환합니다. 바라보다키보드 입력과 텍스트 출력은 어떻게 작동합니까?이 주제에 대한 자세한 소개입니다.

Ctrl역사적인 이유로 일부 키는 다른 문자를 누르는 것과 동일한 문자( Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ ) 를 보냅니다 [. 그 이유는 역사물리학 때문이다.단말기이는 터미널에서 실행 중인 애플리케이션이 이를 기대하도록 수행되므로 터미널이 이를 수행합니다.

Guake와 Gnome 터미널 모두 사용VTE 라이브러리, 이는 키와 코드에서 문자 시퀀스로의 매핑 구성을 허용하지 않습니다. 너도 같은 문제가 있어bash - Ctrl+Alt+Space를 사용한 키 시퀀스 바인딩 오류

Xterm완전히 구성 가능한 키 바인딩이 있습니다. Tab키를 누르는 동안 탭 문자(기본값)를 보내거나 문자열을 보내 hello거나 원하는 대로 보낼 수 있습니다 . Xterm 구성이 통과되었습니다.XResources. 예를 들어, press 및 release 에 이스케이프 시퀀스를 보내려면 Tab다음을 입력하세요.\e[t\e]t~/.Xresources

XTerm.vt100.translations: #override \
  <Key>Tab: string("\033[t") \n\
  <KeyRelease>Tab: string("\033]t") \n\

또는 Tab전송 탭을 종료하고 다른 항목을 만들고 보낼 Ctrl수도 있습니다.I

XTerm.vt100.translations: #override \
  Ctrl~Meta~Shift<Key>I: string("\033[a5i") \n\
  Ctrl~Meta Shift<Key>I: string("\033[a6i") \n\

\e[a5i그런 다음 구성 가능한 키 바인딩을 사용하여 bash 및 기타 터미널 애플리케이션에서 원하는 대로 바인딩 할 수 있습니다 .

규칙에 따라 다중 문자 이스케이프 시퀀스는 이스케이프 문자(일반적으로 프로그래밍 언어 및 구성 파일에서 \e또는 \033로 표시됨 \x1b)로 시작합니다. 일부 응용 프로그램은 다른 문자로 시작하는 이스케이프 시퀀스에 문제가 있을 수 있습니다. 시간 초과를 허용하지 않는 한 이스케이프 시퀀스이자 자체 키인 문자를 가져서는 안 됩니다(이것이 본질적으로 vi와 같은 응용 프로그램의 Esc일부 기능에 바인딩되어 있는 이유입니다). 자신만의 키 시퀀스를 정의하는 경우 기능 키와 커서 키에서 전송되는 키 시퀀스와 충돌하지 않도록 주의하십시오.어느 정도 사실상의 표준화.

답변2

Gilles의 뛰어난 답변에 추가하기 위해 urxvt 터미널 에뮬레이터에서 키맵을 구성하는 것도 가능합니다 . 예를 들어, 비교할 .Xresources파일에 다음 줄을 추가했습니다 Ctrl+Backspace(Ctrl+H이 문제) 두 개의 키 코드를 다른 방식으로 사용할 수 있도록:

# Map Ctrl+Backspace to little-used escape sequence
urxvt.keysym.C-BackSpace: \033[33~

~/.zshkbd그런 다음 zsh가 두 키 코드를 구별하도록 my에 다음을 추가했습니다 .

bindkey "^H" kill-line

# Ctrl + Backspace
bindkey "\033[33~" backward-delete-word

Ctrl+I나는 이것이 zsh 및 기타 애플리케이션 에서도 비슷한 방식으로 작동해야 한다고 믿습니다 TAB(비록 이 경우 분명히 Ctrl+I다른 문자로 다시 매핑될 것이지만).

관련 정보