당신이 잘 지내기를 바랍니다.
내 안에는 다음이 있습니다 .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
}