바인딩키를 실행한 후 zle 기능을 취소하는 방법은 무엇입니까?

바인딩키를 실행한 후 zle 기능을 취소하는 방법은 무엇입니까?

당신이 잘 지내기를 바랍니다.

내 안에는 다음이 있습니다 .zshrc.

# 1. invoke zoxide to pick dir
# 2. open target dir in ranger
# 3. when exiting ranger, cd into last dir
zoxide_to_ranger () {
    eval 'ranger "$(zoxide query -i)" --choosedir=$HOME/.rangerdir < $TTY'
    LASTDIR=$(< ~/.rangerdir)
    cd "$LASTDIR" || exit

    # ensure `precmds` are run after `cd`
    local precmd
    for precmd in $precmd_functions; do
      $precmd
    done
    zle reset-prompt
}

zle -N zoxide_to_ranger
bindkey '^f' zoxide_to_ranger

Ctrl-f인라인 주석에서 제안한 대로, 이는 트리거할 때 fzf 메뉴를 표시하고 선택 시 해당 디렉토리에서 레인저를 여는 편리한 도구입니다 .

문제는 를 눌러 선택을 취소하려고 할 때 Esc여전히 Ranger를 열고 내가 원하는 것이 아닌 홈 디렉토리를 나에게 보낸다는 것입니다.

제 질문은 바인드키를 실행한 후 zle 기능을 취소하는 방법입니다.

구성:

zsh 5.9(x86_64-pc-linux-gnu)

운영 체제: Manjaro Linux

어떤 조언이라도 대단히 감사하겠습니다. 감사합니다:)

답변1

라인 eval은 여러 가지 일을 하고 있습니다. 어쩌면 너무 많은 일이 벌어지고 있을지도 모릅니다. 한 가지 방법은 호출을 분리하여 zoxide무언가를 반환하는지 확인하는 것입니다. 또 다른 요구 사항은 ~/.rangerdir디렉터리(또는 무언가)가 있는지 확인 하고 사용 후 파일을 비우는 것입니다. 이러한 새로운 검사는 함수가 정리되고 종료되어야 하는 여러 지점을 생성합니다.

function zoxide_to_ranger {
  local zz; zz=$(zoxide query -i)
  [[ -z $zz ]] && { zle reset-prompt; return }

  # not sure if the 'eval' is necessary; does ranger ever exit with
  # shell commands to be run?
  ranger $zz --choosedir=~/.rangerdir < $TTY

  local dd; dd=$(< ~/.rangerdir)
  [[ -z $dd ]] && { zle reset-prompt; return }
  :> ~/.rangerdir

  # this could be "local" unless you use it elsewhere
  LASTDIR=$dd
  cd $LASTDIR || { zle reset-prompt; return }

  local precmd; for precmd in $precmd_functions; $precmd
  zle reset-prompt
}

관련 정보