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

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

나는 노력 compinit했지만 도움이되지 않았다. 또한 쉘 종속적이지 않은 방법이 있습니까? 답변을 확인하는 방법이 있으면 좋습니다 (무언가를 제거하고 다시 설치하는 것을 제외하고).

내 말은 명령의 이름의 몇 글자를 입력 한 후, 내가 누를 수있다 Tab, 그리고 zsh전체 이름을 뽑아 나머지를해야한다.



답변

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

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

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

zstyle ":completion:*:commands" rehash 1

성능 비용이 있지만 오늘날 일반적인 데스크톱 설정에서는 무시할 수 있습니다. ( $PATHNFS 또는 RAM이 부족한 시스템에는 없습니다.)

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

¹ Chris Johnsen에게 zsh≥4.3.3이 필요합니다.


답변

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

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

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

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

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

이것은 현재 쉘, 일반 쉘을 실행하는 기존 쉘 compinit및 향후 쉘에 영향을 미칩니다 .


답변