바로가기 키 동작 제어에 관한 질문

바로가기 키 동작 제어에 관한 질문

Ctrl-key터미널에서 조합이 어떻게 작동하는지 혼란스러워요. Bash 매뉴얼 페이지에는 다음과 같은 다양한 조합이 있습니다.

  • C-e- 줄 끝으로 이동
  • C-f- 한 글자 앞으로 이동

등.

하지만 좀 더 있어요문서화되지 않은바로가기 예:

  • C-j(OR C-m)은 리턴 키로 사용됩니다.
  • C-h백스페이스 키의 경우
  • C-i탭 등의 경우

이 단축키가 녹음하는 것을 잊었나요? 아니면

  • C-jLF
  • C-mCR
  • C-iTab

이것이 ASCII의 "기본" 동작입니까? 즉, 동작 C-j이지만 구현 C-m되지 않습니다.C-i통과bash하지만 다른 것을 통해?

C-v또 다른 문제는 왼쪽 화살표 키를 누르면 ^[[D화면이 나타난다는 것입니다. 즉, ESC-[-d. 그런데 를 누르면 ESC-[-d커서가 왼쪽으로 움직이지 않습니다. 그 이유는 무엇입니까?

편집하다:

C-j처음에는 를 누르면 키보드가 00001010커널로 직접 전달되는 줄 알았습니다 . 그러나 등의 프로그램을 사용하여 키 누르기 와 표시가 다른 이벤트로 xev관찰 되었기 때문에 그렇지 않다고 생각했습니다 . 따라서 를 누르면 키보드는 을 보내지 않지만 여러 바이트를 보낼 수 있습니다. 그렇다면 이러한 여러 바이트는 어디에서 변환됩니까?evtestControljC-j0000101000001010

답변1

C-m등의 동작은 bash로 구현되지만, C-i등과 동일하다는 사실은 터미널의 동작에 따라 결정됩니다. 모든 터미널은 항상 이런 식으로 동작해왔고 이것이 애플리케이션에서 기대하는 것이기 때문에 모든 터미널이 이런 식으로 동작합니다. 터미널과 애플리케이션 간의 인터페이스는 키 입력이 아닌 문자(실제로 바이트)를 기반으로 하므로 인쇄 가능한 문자를 전송하지 않는 키 입력 및 키 입력 조합은 어떤 방식으로든 인코딩되어야 합니다. 바라보다ReturnTab키보드 입력과 텍스트 출력은 어떻게 작동합니까?이 주제에 대한 추가 정보. 당신은 또한 볼 수 있습니다https://emacs.stackexchange.com/questions/1020/problems-with-keybounds-when-using-terminal

TAB탭 문자입니다ASCII 코드, 이는 ASCII의 Ctrl+I 문자와 동일합니다. 다른 키도 마찬가지입니다. 터미널은 사용자가 를 누를 때 Tab와 +를 누를 때 모두 이 문자를 보냅니다 . (CR) 및 , 및 (대부분의 키보드에는 없음) 및 및 의 경우 에도 마찬가지입니다 . 또한 어느 것이 보내는지 또는 , 그것은 그 자체의 문제입니다.CtrlIRETC-mLFDC-jESCC-[BackSpaceC-hC-?

터미널의 구성( stty설정)도 작동합니다. 이는 bash의 일부 설정에 영향을 주지만(예: stty erase @bash는 누르기를 BackSpace로 처리함 ) 현재 행에 영향을 주거나 커밋 하지 @않습니다 .C-mC-j

^[[DEsc [ D, 하지만 자본금이 있어야 합니다 D. 를 누르면 커서 키 이스케이프 시퀀스가 ​​선언되어 있으므로 Esc [ Dbash는 키를 볼 것입니다.Left용어 모자또는용어 정보데이터 베이스. 기본 바인딩은 없습니다 Esc [ d(공통 터미널에서 보낸 이스케이프 시퀀스가 ​​아닙니다).

답변2

두 가지 질문, 두 가지 요점:

  • control/ J, control/ M및 control/ 은 I대부분의 프로그램에서 사용되는 일반적인 ASCII 컨트롤입니다. bash단지 readline에서 항목을 쉽게 다시 바인딩할 수 있도록 해줍니다.

  • 특수 키(예: 왼쪽 화살표)를 허용하는 대부분의 프로그램은 Esc 키를 인식하는 방법을 제공합니다.뛰어난그 특수 키에서타이밍. 문자를 충분히 빠르게 입력하지 못할 수도 있습니다(Emacs와 같은 특별한 경우는 제외).아니요타이밍에주의하십시오).

    빠르게 입력하지 않기 때문에 프로그램은 커서를 움직이지 않는 개별 문자를 봅니다. 개별 문자가능한재미있는 일을 해보세요.

어쨌든(질문에서 무시한 오타에 대한 설명을 참고하세요.) 이것은 ESC[d터미널로 전송되면 커서를 화면 맨 위 줄로 이동하는 표준 제어 시퀀스입니다.

CSI Pm d  Line Position Absolute  [row] (default = [1,column]) (VPA).

~부터xterm은 이것을 구현합니다물론, xterm과 같은 척하는 것은 모두 같은 일을 할 것입니다.리눅스 콘솔똑같이하십시오. 그러나 bash제어 시퀀스는 일반적으로 에코되지 않습니다. 관찰하는 동작은 bash이를 인식하지 못하는 이스케이프에 대해 수행되는 모든 동작입니다.

양식 피드 관련(의견은 질문의 일부라고 가정함): bash의 양식 피드 사용(예:입력하다) 화면 지우기일부 사람들을 혼란스럽게 하다(PuTTY 개발자 포함)은 터미널이 페이지 피드를 해석해야 한다고 믿습니다. 이 기능은 실제로 다양한 인쇄 기능을 포함하여 터미널에서는 거의 찾아볼 수 없었던 라인 프린터에서 나온 것입니다. 관련 토론에 대해서는 내 메모를 참조하십시오.다시 페이지네이터그리고후속 조치기능을 재사용하세요.

관련 정보