zsh 탭이 완료되었습니다. 도착하다. /

zsh 탭이 완료되었습니다. 도착하다. /

중복되지 않음:
나는 디렉토리 이름을 완성하거나 고정된 디렉토리에서 스크립트를 실행하는 방법을 찾고 있지 않습니다. 내가 해결하려는 문제는 완료하는 것입니다.현재의목차아니요긴급한/


.나는 zsh가 bash처럼 탭 완성 기능을 사용할 수 있었으면 좋겠다 ./.

.TABTABbash를 사용하면 을 눌러 모든 파일을 보는 데 익숙합니다 .현재 작업 디렉토리먼저 완료된 ./다음 해당 디렉토리의 모든 것을 표시하기 때문입니다. 내가 /어떻게든 피하고 싶은 이유는 독일어 키보드에서는 두 손가락과 Shift를 사용하거나 숫자 패드에서 멀리 떨어져 있는 것보다 훨씬 더 어렵고 /, a를 입력하는 것보다 bash로 다시 전환하는 편이 낫기 때문입니다. 내가 달성하고 싶은 것, 즉 bash가 하는 일은 다음과 같습니다.TAB/

$ .               <TAB>
$ ./              <TAB>
foo.sh   somedir/
$ ./              <F><TAB>
$ ./foo.sh        <ENTER>

zsh/oh-my-zsh를 사용하면 을 클릭할 때 (점 공간)이 .TAB표시되는데 .이는 전혀 소용이 없습니다.

  • zstyle ':completion:*' special-dirs truewith setopt auto_cd(oh-my-zsh 기본값)를 사용하면 top 옵션이 훨씬 덜 유용해져서 ../이 옵션을 껐습니다. 완성되어 기쁘네요 cd.
  • .열려 있지 않으며 $PATH그대로 유지되어야 합니다. f<TAB>예를 들어 완료 ./foo.sh해도 괜찮습니다 .

.zsh가 로컬 디렉토리 내용을 즉시 또는 더 효과적으로 완성하도록 어떻게 가르칠 수 있습니까 ./? 아니면 을 포함하지 않는 효율적인 방법으로 로컬 스크립트 파일을 처리하는 다른 방법이 있습니까 /?

답변1

위대한 도전! 명령줄에서 시도해보고 작동하면 ~/.zshrc에 추가하세요.

bindkey '^I' dotcomplete
zle -N dotcomplete
function dotcomplete() {                                        
  if [[ $BUFFER =~ ^'\.'$ ]]; then
    BUFFER='./'
    CURSOR=2
    zle list-choices
  else
    zle expand-or-complete
  fi
}                    

TAB(^I)을 누를 때마다 실행되는 함수를 추가합니다. 현재 입력 중인 줄에 점(^=줄 시작, '\.'=슈퍼 이스케이프 점, $=줄 끝)만 포함되어 있으면 점을 ./로 바꾸고 일반 완성을 계속합니다.

그것은 당신이 요청한 것을 정확히 수행하지 않습니다. 즉, 해당 지점을 현재 디렉토리로 취급하는 것입니다. 하지만 저장하려는 키 입력이 저장됩니다.

답변2

귀하의 f<TAB>옵션/해결 방법을 고려하여 다음을 제안합니다.

$ function f(){ local x=$1; shift; ./"$x" "$@"; }
$ f foo<TAB>

f마지막 줄 뒤의 공백에 유의하세요.

관련 정보