it-swarm-ko.tech

zsh의 $ PATH 캐시에서 자동 완성 색인 (또는 호출 된 항목) 및 바이너리를 다시 작성

새 소프트웨어를 설치 한 후, zsh로 이미 열린 터미널은 새 명령에 대해 알지 못하며 자동 완성을 생성 할 수 없습니다. 새 터미널을 열면 문제가 해결되지만 이전 터미널에서 자동 완성 기능이 작동하도록 인덱스 (또는 호출 한 것)를 다시 작성할 수 있습니까?

compinit으로 시도했지만 도움이되지 않았습니다. 또한 쉘에 의존하지 않는 방법이 있습니까? 답변을 확인할 수있는 방법이 있습니다 (무언가를 제거하고 다시 설치하는 것을 제외하고).

내 말은 명령 이름의 몇 문자를 입력 한 후 Tabzsh은 (는) 전체 이름을 가져 오기 위해 나머지를 수행해야합니다.

80
phunehehe

실행 가능 명령의 캐시를 재 구축하려면 rehash 또는 hash -rf를 사용하십시오.

hash_list_all 옵션을 설정 해제하지 않았는지 확인하십시오 (디스크 액세스는 훨씬 적지 만 캐시 업데이트 횟수는 줄어 듭니다).

명령을 입력하지 않으려면 ~/.zshrc ¹에 다음 줄을 넣어 zsh에게 캐시를 신뢰하지 않도록 지시 할 수 있습니다.

zstyle ":completion:*:commands" rehash 1

성능 비용이 있지만 오늘날 일반적인 데스크톱 설정에서는 무시할 수 있습니다. NFS에 $PATH가 있거나 RAM이 부족한 시스템은 아닙니다.

zstyle 명령 자체는 zshmodule 매뉴얼 페이지에 설명되어 있습니다. 스타일 값은 zshcompsyszshcompwid 매뉴얼 페이지에 설명되어 있거나 소스 (여기서는 _command_names 함수)를 읽을 수 있습니다. 읽을 수있는 문서를 원한다면… 문서를 찾으면 알려주십시오!

¹ zsh≥4.3.3 필요, 감사합니다 Chris Johnsen

새 명령에 대해 "인수 완료"를 수행하는 데 문제가있는 경우 compinit가 필요한 명령 일 수 있지만 캐싱 메커니즘이있어 문제를 일으킬 수 있습니다.

내 버전 (4.3.10)의 설명서에 따르면 compinit는 캐시 된 "덤프 파일".zcompdump을 사용하여 컴파일 된 완료 함수를 저장하여 후속 호출 속도를 높입니다. 완료 파일 수 (#compdef … 또는 #autoload …로 시작하는 fpath 요소 파일)가 변경된 것을 발견하면 덤프 파일 만 무효화합니다. 아마도 새 소프트웨어를 설치하면 그러한 완성 파일의 수가 변경 될 것입니다 (-zsh 자동 완성 파일도 올바른 위치에 설치했다고 가정). 따라서 일반 compinit은 작업. 작동하지 않는 상황에서는 덤프 파일을 무시하거나 수동으로 무효화해야합니다.

덤프 파일 사용을 건너 뛰려면 compinit -D; 이것은 현재 쉘에만 영향을 미칩니다.

덤프 파일을 재 빌드하려면 덤프 파일을 제거하고 compinit을 다시 실행하십시오.

rm -i ${ZDOTDIR:-${HOME:?No ZDOTDIR or HOME}}/.zcompdump &&
compinit

이는 현재 셸, 일반 compinit을 실행하는 기존 셸 및 향후 셸에 영향을줍니다.

13
Chris Johnsen

파일에있는 완료를 처리/개발할 때 #compdef _foo foo 편집 할 때마다 사용해야합니다.

unfunction _foo && compinit

업데이트 된 변경 사항으로 완료된 업데이트 된 foo 명령을 보려면.

0
Micah Elliott