zle 재설정 프롬프트는 화살표 키를 사용하여 검색 기록을 방지합니다.

zle 재설정 프롬프트는 화살표 키를 사용하여 검색 기록을 방지합니다.

방금 zsh와 oh-my-zsh를 설치했습니다(이전 쉘은 bash였습니다). My는 .zshrcoh-my-zsh의 기본 설정을 전혀 수정하지 않았습니다. "git" 플러그인만 활성화됩니다(기본적으로 활성화됨).

나는 다음을 사용하여 매우 간단한 테마를 만들었습니다.이 기술:

setopt PROMPT_SUBST
PROMPT='[%D{%L:%M:%S}] '
TMOUT=1
TRAPALRM() {
  zle reset-prompt
}

이 테마를 활성화한 후 위쪽 및 아래쪽 화살표 키가 내 기록을 올바르게 기억하지 못하는 것을 발견했습니다.

  • 예상대로 위쪽 화살표를 한 번 누르면 가장 최근 명령이 호출됩니다.
  • 위쪽 화살표를 두 번째로 누르면 아무 일도 일어나지 않습니다. 나는 가장 가까운 다음 주문이 회수될 것으로 예상합니다.
  • 위쪽 화살표를 먼저 누른 다음 아래쪽 화살표를 눌러도 아무 일도 일어나지 않습니다. 프롬프트가 내가 시작한 빈 프롬프트로 돌아가기를 원합니다.

내가 .zshrc사용한다면오직위 스크립트의 내용(기본적으로 테마의 프롬프트 설정을 사용하지만 oh-my-zsh를 비활성화함)의 위쪽 및 아래쪽 화살표는 예상대로 작동합니다.

oh-my-zsh로 돌아가서 제목의 줄을 .zshrc주석 처리 하면 zle reset-prompt기록이 제대로 작동합니다(그러나 시계는 더 이상 존재하지 않습니다).

zle reset-prompt위쪽/아래쪽 화살표가 다르게 동작 하지 않고 oh-my-zsh를 동시에 사용할 수 있는 방법은 무엇입니까 ? 이것은 oh-my-zsh의 버그입니까, 아니면 잘못된 구성입니까?

답변1

대신 이 기능을 사용할 수 있습니다.

TRAPALRM() {
    case "$WIDGET" in
        expand-or-complete|self-insert|up-line-or-beginning-search|down-line-or-beginning-search|backward-delete-char|.history-incremental-search-backward|.history-incremental-search-forward)
            :
            ;;

        *)
            zle reset-prompt
            ;;
    esac
}

zle reset-prompt기본적으로 WIDGET섀시 내부가 아닐 때만 실행됩니다. 위젯 목록을 추가하여 reset-prompt분리를 무시할 수 있습니다.|

문제는 TMOUT쉘의 시간 초과가 실제로 지정된다는 것입니다. 셸 시간이 초과되면 SIGALRM신호를 보내고 셸을 종료합니다. 이 함수는 정의된 함수를 실행하는 동안 신호를 TRAPALRM()포착 하고 종료를 가로챕니다.SIGALRM

위쪽/아래쪽 화살표는 다르게 동작하지 않고 대신 프롬프트가 재설정될 때 실행되므로 동작이 이상합니다. 위의 기능은 히스토리를 입력하거나 스크롤할 때 실행되지 않으며 zle reset-prompt지연을 제거합니다. 유일한 단점은 위젯 외부에서 작업(예: 위젯을 ENTER트리거하는 버튼을 누르는 등)을 수행할 때까지 입력할 때 프롬프트가 업데이트되지 않는다는 것입니다.accept-line

관련 정보