명령을 올바르게 자동 완성 하지만 bash
(예: find
, git
등) 특정 파일 패턴이 완료되는 것을 방지하기 위해 필터를 사용하자마자 오류가 발생하는 것 같습니다. 예:
complete -f -X '*.@(cmi|cmo)' git
*.cmi
위의 내용은 자동 완성 기능이 일치하는 *.cmo
파일 이름을 선택하지 못하게 해야 합니다 git
. 이것은 예상대로 작동합니다. 불행하게도 이로 인해 git
명령과 플래그의 자동 완성도 중단됩니다. 완성 파일의 로딩 순서와 위의 정의를 바꾸는 것은 중요하지 않은 것 같습니다.
이 두 기능을 함께 작동시키는 방법에 대한 아이디어가 있습니까?
답변1
git
명령 구문을 이해하는 외부 완성 함수를 호출하는 대신 내장된 파일 완성 메커니즘을 사용하도록 bash에 지시했습니다 git
. 일련의 필터가 아닌 하나의 완성 메커니즘만 있습니다. 일련의 필터를 원하면 이를 인코딩해야 합니다.
다행스럽게도 2.7-kLoC git 완성 스크립트는 git add
이러한 패턴을 .gitignore
.
printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore
git의 무시 목록에 파일을 추가하지 않고 완료에서 파일을 제외 하려면 git add
git 완성 스크립트를 자세히 살펴봐야 할 것 같습니다. _git_add
which __git_complete_index_file
호출은 __git_index_files
후보 파일 목록을 생성하기 위해 호출되며, 그런 다음 전달된 옵션과 함께 차례로 호출됩니다 __git_ls_files_helper
. 그래서 당신은 변경할 수 있습니다git ls-files
_git_add
_git_add
__git_complete_index_file "--others --modified --directory --no-empty-directory"
다음과 같은 몇 가지 옵션을 추가합니다 --exclude=*.cm[aiox]
(인용 문제에 유의하세요. 와일드카드는 결국 명령에 연결되어 -x *.cm[aiox]
패턴이 현재 디렉터리에서 확장되기 때문에 작동하지 않습니다).