ZSH 탭 완성: 바이너리 대신 전체 파일만

ZSH 탭 완성: 바이너리 대신 전체 파일만

파일 이름 탭을 클릭할 때 바이너리 완료를 방지하기 위해 사용자 정의 zsh 완성 파일을 만들 수 있습니까? 예를 들어, myprogram.c와 myprogram, 바이너리 파일이라는 두 개의 파일이 있습니다. vim myprog(tab)를 실행하면 myprogram 대신 myprogram.c가 자동 완성될 수 있나요? 미리 감사드립니다!

답변1

조정하여 완료 시 특정 패턴을 무시할 수 있습니다.완전한 스타일그리고zstyle내장. 가지다zsh 가이드의 예.

예를 들어 *.ovim을 사용하여 파일 편집을 완료하는 동안 파일을 무시하려면 다음을 다음과 같이 입력합니다 .zshrc.

zstyle ':completion:*:*:vim:*:*files' ignored-patterns '*.o'

이는 유용한 방법으로 실행 파일을 제외하지 못합니다. 제외 *~*.*하거나 더 정확하게는 제외할 수 있지만 이는 스크립트 및 더 나쁜 디렉토리를 포함하여 (|*/)[^/.]##포함되지 않은 모든 파일 이름을 제외합니다 . .내가 아는 한, 완성 무시 메커니즘은 파일 존재나 유형을 확인할 수 없으며 단지 텍스트 패턴과 일치할 뿐입니다.

답변2

물론 특정 폴더나 파일 집합에서 작동하도록 이를 수정할 수 있지만 먼저 지금은 이 작업을 수행하지 않는 이유를 이해해야 합니다.

Linux에서는 파일 확장자가 중요하지 않습니다. 중요한 것은 실행 비트뿐입니다. 실제 바이너리 파일이나 스크립트 형태의 텍스트를 실행할 수 있습니다. "바이너리 파일이 아님"기준은 파일이 무엇인지 아닌지에 대한 Linux의 구별과 완전히 일치하지 않습니다.

즉, 주어진 명령에 대한 파일 이름 glob 완성 함수를 대체하기 위해 사용자 정의 완성 함수를 작성하는 것은 그리 어렵지 않을 것입니다. 이 함수는 모든 파일을 나열하지만 ".c" 버전의 파일은 제외합니다. 이를 위해서는 약간의 오버헤드가 필요하므로 탭 완료 속도가 약간 느려집니다.

관련 정보