dirs-stack
via 에서 선택할 수 있는 간단한 zsh 함수를 작성했습니다 fzf
.
내 .zshrc
모습
DIRSTACKSIZE='99'
setopt PUSHD_IGNORE_DUPS
# change to directory from the dirs stack
fzf-change-dirstack () {
cd "$(dirs -lv | cut -f2 | fzf )"
}
zle -N fzf-change-dirstack
bindkey '^[p' fzf-change-dirstack # shortcut ALT+P
약간의 개선이 필요하더라도 잘 작동합니다. 나에게 매우 짜증나는 유일한 점은 키 바인딩을 사용할 때 Enter디렉토리로 변경하려면 두 번 입력해야 한다는 것입니다.
cd
스크립트를 두 번 입력하지 않고 즉시 수정하려면 어떻게 해야 합니까 Enter?
답변1
fzf-change-dirstack () {
local dir
print -rNC1 -- $dirstack |
fzf --read0 --print0 |
IFS= read -rd '' dir &&
cd -- $dir &&
zle -I
}
zle -N fzf-change-dirstack
bindkey '^[p' fzf-change-dirstack # shortcut ALT+P
주요 요점은 현재 작업 디렉토리가 변경될 때 프롬프트를 zle -I
무효화 I
하고 나머지는 임의의 디렉토리 이름을 사용할 수 있도록 코드의 다른 문제를 수정하는 것입니다.
특히:
dirs -lv | cut -f2
이러한 디렉터리 이름에 줄 바꿈이나 탭이 포함되어 있으면 실패합니다. 보다 일반적으로 파일 경로는 비어 있지 않은 바이트 시퀀스일 수 있습니다. 따라서 에 전달하려면fzf
이를 사용--read0
하고 구분된 빈 목록( 여기서print
olumn에 ullr
로 구분됨N
)을 제공해야 합니다.1
C
- 을 잊어버리면
--
다음으로 시작하는 모든 디렉토리에 문제가 발생합니다-
(일반적으로 이전 오류 없이는 발생하지 않음).이를 잊어버리면print
명령 주입 취약점이 발생할 수도 있습니다.. - 오류 처리를 잊지 마세요!
cd +
Tab 또한 zsh에는 ~+
Tabdirstack 요소를 모든 명령에 대한 인수로 완료하거나 완료 할 때 이미 자체 dirstack 완성자가 있다는 점에 유의하세요( cd
/ 뿐만 아니라).pushd
예를 들어 cd +
TabTab다음을 시도해 보세요.
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' menu select=2
autoload compinit
compinit
탐색하려면 화살표 키를 사용하세요.
(보통 이 설정으로 조정합니다 compinstall
.)
cd
불행하게도 For는 --
모든 문제를 해결하지 못합니다. -
, 여전히 특별대우를 받고 있는 +1
등 . 이는 의 요소로 표시되지 않지만 like after 출력에서 탭으로 구분된 두 번째 필드로 표시될 수 있습니다.-1
cd
$dirstack
dirs -lv
cd $'foo\nx\t+1\twhatever'