저는 때때로 이전에 사용했던 명령에 빠르게 액세스하기 위해 bash와 위쪽 화살표 키를 사용합니다. 짜증나게때때로이렇게 하면 [A
이전 명령 대신 명령이 표시됩니다. 온라인에서 조사한 결과 이는 컴퓨터로 전송되는 위쪽 화살표 키를 나타내는 키 코드인 것으로 보입니다.
온라인에서 답변을 찾을 수 없는 것 같습니다. 이런 일이 다시 발생하지 않도록 하려면 어떻게 해야 합니까?
답변1
배경
시퀀스는 실제로 이며 Escape[A, 가져온 세트의 일부입니다.엑스마1976년 기준ECMA-48, ANSI에서 별도이지만 수년 동안 거의 동일한 표준으로 지원되었으며(나중에 철회됨) ANSI에서 승인되었습니다.ISO/IEC 6429도중에. 이러한 다중 표준화의 결과로 ANSI 이스케이프 코드로 자주 인용되지만 올바르게 ECMA-48 제어 함수 * 로 호출되어야 합니다 .
설명하다
화면에는 표시되지만 작업에는 표시되지 않는 일반적인 이유 [A
는 초기 이스케이프 코드가 실수로 흡수되었기 때문입니다. Ctrl V터미널 라인 드라이버가 다음 문자를 단어로 처리하도록 지시하는 먼저 를 누르지 않으면 키보드에서 이것을 재현할 수 없습니다 .
따라서 우리는 이 시퀀스를 얻어 Ctrl VEscape[A가시적인 출력을 생성 할 수 있습니다 [A
.
일련의 문자를 빠르게 연속해서 누르면 Escape[A커서가 위로 이동한다는 것을 알 수 있습니다. 그러나 첫 번째 문자 이후에 일시 중지하면 커서가 움직이지 않습니다. 이는 이스케이프 문자와 관련된 시간 초과가 있기 때문입니다. 이는 UNIX 시스템에 연결된 느린 직렬 회선에서 실제 문제였으며 가장 가까운 문제는 이 시퀀스를 전송하는 동안 잠시 지연되는 느리거나 간헐적인 네트워크 연결입니다.
방지
이제 귀하의 질문에 답변해 드리고, 이러한 일이 발생하지 않도록 방지하는 방법을 알려드리겠습니다. 간헐적인 네트워크 연결을 사용하는 경우 Escapek"vi 모드"( )에서 명령 편집 중에 사용할 수 있는 다음 과 같은 대체 시퀀스 중 하나를 사용하는 것 외에는 할 수 있는 일이 많지 않습니다 .kkset -o vi
* 제 생각에는 JavaScript처럼 ECMAScript라고 불러야 할 것 같습니다.
답변2
@roaima가 언급했듯이 이는 네트워크나 직렬 회선을 통해 실행되는 프로그램에서 자주 발생하는 잘 알려진 문제였으며, 전송 지연으로 인해 일반 텍스트(예: vi)를 구별하려는 프로그램이 방해를 받았습니다.탈출하다의 문자이스케이프 시퀀스. 대부분의 사용자는 더 이상 시간 공유 서버에서 프로그램을 실행하지 않기 때문에 이를 눈치채지 못할 것입니다.
문제는 프로그램이 오류가 있는지 확인하기 위해 "짧은" 시간 동안 지연해야 한다는 것입니다.탈출하다문자 뒤에 다른 문자가옵니다.할 수 있다중 하나의 일부가 되다이스케이프 시퀀스기다리고 있습니다. 전통적으로 특수 키(예: 커서 키, 기능 키 등)는 이스케이프 시퀀스로 전송됩니다.
키 반복 기능이 활성화되도록 키를 누르고 있는 경우 이러한 이스케이프 시퀀스는 (일부) 프로그램이 읽을 수 있는 것보다 빠르게 전송될 수 있습니다. 이런 일이 발생하면 개별 문자 사이의 시간이 늘어나는 경향이 있으며 결국 문자를 구별하는 데 할당된 "짧은" 시간을 초과하게 됩니다.탈출하다문자이스케이프 시퀀스.
readline(/번들에 포함된 일부) bash는 (vi와 같이) 동일한 방식으로 시작될 수 있는 서로 다른 문자 시퀀스를 구별하려고 시도합니다. 이 "짧은" 시간을 변경하는 기능이 있습니다.
8.3.1Readline 초기화 파일 구문
keyseq-timeout
모호한 키 시퀀스를 읽을 때 Readline이 문자를 기다리는 기간을 지정합니다(지금까지 읽은 입력을 사용하여 완전한 키 시퀀스를 형성하거나 추가 입력을 사용하여 더 긴 키 시퀀스를 완성할 수 있습니다). 제한 시간 내에 입력이 수신되지 않으면 Readline은 더 짧지만 완전한 키 시퀀스를 사용합니다. Readline은 이 값을 사용하여 현재 입력 소스에서 입력이 가능한지 여부를 결정합니다(기본값은 rl_instream). 값은 밀리초 단위로 지정되므로 값 1000은 Readline이 추가 입력을 1초 동안 기다린다는 의미입니다. 이 변수가 0보다 작거나 같은 값 또는 숫자가 아닌 값으로 설정되면 Readline은 완료할 키 시퀀스를 결정하기 위해 다른 키를 누를 때까지 기다립니다. 기본값은 500입니다.
즉, 다음을 ~/.inputrc
파일에 넣을 수 있습니다.
set keyseq-timeout 0
readline은 이 커서 키를 무한정 기다립니다. 단점은 라이브러리에 있는 일부 문자와 일치하는 일부 문자를 입력할 때 예상치 못한 결과가 발생할 수 있다는 것입니다.
답변3
내 터미널 쉘(bash를 사용하는 Konsole)에서 허용되는 답변에 설명된 ^[[A
대로 재현할 수 있습니다. Ctrl+V하지만 내가 받아들인 대답과는 달리할 수 있다[A
구체적으로 묻는 질문을 눌러 직접 복사하는 것처럼EscArrowUp
실수로 눌렀을 때 화살표 키가 빠져나가는 것을 Esc방지하기 위해 화살표 키의 첫 번째 부분을 다시 누르면 빠져나가는 것을 방지할 수 있습니다 [A
.
답변4
모든 답변은 매우 좋습니다. 빠르고 더러운 방법은 h, j, k, l을 화살표 키로 사용하는 것입니다. 또는 전체 vim 패키지를 설치하세요. 내가 정확하게 기억한다면 Ubuntu 배포판의 기본값은 vim??-runtime이며, vim??을 설치하면 문제가 저절로 "해결"됩니다. ??는 최신 완전한 패키지 버전입니다. 우분투에 대해 apt-cache search vim
알려드리겠습니다.
h=왼쪽, j=아래, k=위, l=오른쪽