zsh의 $PATH 캐시에서 자동 완성 인덱스(또는 무엇이라고 불리는지)와 바이너리를 다시 빌드합니다.

zsh의 $PATH 캐시에서 자동 완성 인덱스(또는 무엇이라고 불리는지)와 바이너리를 다시 빌드합니다.

새 소프트웨어를 설치한 후 zsh로 열린 터미널은 새 명령에 대해 알지 못하며 해당 명령에 대해 자동 완성을 생성할 수 없습니다. 분명히 새 터미널을 열면 문제가 해결되지만 자동 완성 기능이 기존 터미널에서 작동하도록 색인(또는 무엇이라고 부르든)을 다시 구축할 수 있습니까?

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

내 말은 명령 이름 중 몇 글자를 입력한 후 키를 누른 다음 Tab나머지 zsh를 실행하여 전체 이름을 추출해야 한다는 것입니다.

답변1

실행 가능한 명령의 캐시를 다시 작성하려면 rehash또는 를 사용하십시오 hash -rf.

이 옵션을 설정 해제하지 마십시오 hash_list_all. 이렇게 하면 디스크 액세스 횟수가 줄어들지만 캐시 업데이트 빈도가 낮아집니다.

명령을 입력하고 싶지 않은 경우 ~/.zshrczsh에 다음 줄을 넣어 작업이 완료되었을 때 캐시를 신뢰하지 않도록 지시할 수 있습니다.

zstyle ":completion:*:commands" rehash 1

성능 비용이 있기는 하지만 오늘날의 일반적인 데스크탑 설정에서는 무시해도 될 정도입니다. ( $PATHNFS 또는 RAM이 부족한 시스템을 사용 하는 경우에는 그렇지 않습니다 .)

명령 자체는 매뉴얼 페이지 zstyle에 문서화되어 있습니다 . zshmodule스타일 값은 zshcompsyszshcompwid매뉴얼 페이지에 문서화되어 있거나 소스 코드를 읽을 수 있습니다( _command_names여기서 함수의 소스 코드). 읽을 수 있는 문서가 필요하다면... 찾으면 알려주세요!

¹zsh≥4.3.3 이 필요합니다 . 감사합니다.크리스 존슨

답변2

새 명령에 대한 "인수 완성" 작업에 문제가 있는 경우엮다필요한 명령일 수도 있지만 캐싱 메커니즘으로 인해 문제가 발생할 수 있습니다.

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

덤프 파일 사용을 건너뛰려면 를 사용하세요 compinit -D. 이는 현재 셸에만 영향을 미칩니다.

덤프 파일을 재구성하려면 해당 파일을 삭제하고 다시 실행하십시오 compinit.

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

이는 현재 셸, plain 실행 중인 기존 셸 compinit및 향후 모든 셸에 영향을 미칩니다.

답변3

파일에 존재하는 완성을 처리/개발할 때 #compdef _foo foo모든 편집에 다음을 사용해야 한다는 것을 알았습니다.

unfunction _foo && compinit

업데이트된 항목 보기 명령을 사용하여 foo업데이트된 변경 사항을 완료합니다 .

관련 정보