방금 zsh와 oh-my-zsh를 설치했습니다(이전 쉘은 bash였습니다). My는 .zshrc
oh-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