zsh 기능 및 fzf 선택에는 Enter가 필요합니다.

zsh 기능 및 fzf 선택에는 Enter가 필요합니다.

dirs-stackvia 에서 선택할 수 있는 간단한 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하고 구분된 빈 목록( 여기서 printolumn에 ull r로 구분됨 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 출력에서 ​​탭으로 구분된 두 번째 필드로 표시될 수 있습니다.-1cd$dirstackdirs -lvcd $'foo\nx\t+1\twhatever'

관련 정보