Bash는 Esc 키를 누른 후 키 입력을 무시합니다.

Bash는 Esc 키를 누른 후 키 입력을 무시합니다.

Esc 키(ESC)를 누를 때마다 bash는 내가 입력하는 다음 문자를 무시합니다. 이게 정상인가요? 삽입 모드에서 일반 모드로 돌아갈 때 사용하는 vim을 사용할 때 Esc 키를 반복해서 누르는 습관이 있기 때문에 이것은 짜증나는 일입니다.

Bash는 왜 이렇게 작동하며 어떻게 끄나요?

답변1

이는 ANSI 터미널의 정상/예상 동작입니다.

입력하는 동안 Esc터미널은 최종 처리를 시작합니다.ANSI 이스케이프 시퀀스(계속 입력하면 [커서 A가 올라갑니다.)

따라서 Esc터미널이 시퀀스의 다음 문자를 기다린 후 알려진 시퀀스에 속하지 않으면 처리가 중지되지만 Esc입력한 두 문자와 다음 문자는 손실됩니다(이들은 잘못된 시퀀스의 일부입니다. 그래서 버려졌습니다).

그것을 멈추는 방법? 할 수 있는 한 가지 작업은 timeout()예를 들어 프로그램에서 호출하여 터미널의 문자 간 시간 초과를 변경하는 것입니다. 바라보다이것:

입력 이스케이프 시퀀스를 해석할 때 wgetch는 다음 문자를 기다리는 동안 타이머를 설정합니다. notimeout(win, TRUE)이 호출되면 wgetch는 타이머를 설정하지 않습니다. 타임아웃의 목적은 기능 키로부터 수신된 시퀀스와 사용자가 입력한 시퀀스를 구별하는 것입니다.

답변2

bashrc 파일을 확인하고 한 줄을 찾아 set -o vi다음으로 변경하십시오. set -o emacs문제가 여전히 존재하고 자체 vim 모드가 내장된 alacrity와 같은 터미널 에뮬레이터를 사용하고 있다면 에뮬레이터 구성을 변경해야 할 수도 있습니다.

편집: 이것은 설정하는 가장 일반적인 방법이지만 inputrc 파일이 있는 경우 vi 모드를 설정하는 데에도 사용할 수 있습니다. inputrc 파일이 있는 경우 set editing-mode vi파일과 줄이 존재하면 명령이 거기에 있을 것입니다. 주석 처리만 하면 됩니다. 아니면 줄을 삭제하세요.

답변3

Esc 키를 누른 다음 다른 키를 누르는 것은 많은 터미널 에뮬레이터에서 Alt+Key 키 입력을 보내는 대신 처리됩니다. 예 Esc를 들어 A+와 같습니다. 따라서 Esc 키를 누른 후 첫 번째 키 입력이 실제로 손실된 것은 아니지만 예상한 방식으로 전송되지 않는다는 점에서 "분실"되는 것은 드문 일이 아닙니다.AltA

관련 정보