며칠 전 oh-my-zsh 자동 업그레이드를 했습니다. 이제 내 필터 기록(몇 글자와 위쪽 화살표 입력)이 더 이상 작동하지 않습니다. 나는 내가 그것에 얼마나 의존하고 있는지 깨닫지 못했습니다.
편집하다:
예를 들어, 명령의 몇 글자를 입력한 다음 위쪽 화살표를 눌러 내 기록을 검색한 적이 있습니다.
➜ scratch git:(develop) up # press ↑ arrow key
프롬프트가 다음으로 변경됩니다.
➜ scratch git:(develop) upupdowndownleftrightleftrightbabastartselect # 3 key presses
내가 실행중인 버전이 무엇인지 모르겠습니다. 지금:
➜ scratch git:(develop) echo $ZSH_VERSION
5.0.2
다음은 증분 검색이 작동한다고 생각되는 .zshrc 파일의 몇 줄입니다.
# Set bindkeys to start search from last word
bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
답변1
커서 키에는 사실상 두 가지 표준 이스케이프 시퀀스가 있으며, 동일한 터미널의 다른 모드에서도 그 중 하나를 보낼 수 있습니다. 예를 들어, xterm은 "응용 프로그램 커서 모드" 등 \eOA
으로 전송됩니다 . 왜냐하면 두 가지를 동시에 만날 수 있기 때문입니다.Up\e[A
Down\e[B
\eOB
한 가지 해결책은 바인딩을 복사하는 것입니다. 하나의 이스케이프 시퀀스를 바인딩할 때마다 다른 이스케이프 시퀀스를 동일한 명령에 바인딩합니다.
bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward
또 다른 접근 방식은 항상 하나의 이스케이프 시퀀스를 바인딩하고 다른 이스케이프 시퀀스에 다른 이스케이프 시퀀스를 삽입하도록 하는 것입니다.
bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
bindkey -s '\eOA' '\e[A'
bindkey -s '\eOB' '\e[B'
oh-my-zsh를 업그레이드하면 쉘이 터미널에서 수신하는 이스케이프 시퀀스에 영향을 미치는 이유를 모르겠습니다. 어쩌면 새 버전에서는 응용 프로그램 커서 모드를 활성화하기 위해 다른 터미널 초기화를 수행할 수도 있습니다.