Bash 자동 완성 기능과 필터 패턴을 함께 사용하려면 어떻게 해야 하나요?

Bash 자동 완성 기능과 필터 패턴을 함께 사용하려면 어떻게 해야 하나요?

bash명령(예 find: , 등) 을 올바르게 자동 완성 git하지만 특정 파일 패턴의 완료를 방지하기 위해 필터를 사용하자마자 작동이 중단되는 것 같습니다.

complete -f -X '*.@(cmi|cmo)' git

위의 내용은 자동 완성이 일치하는 파일 이름을 선택하는 것을 *.cmi방지 해야 합니다 . 이것은 실제로 의도한 대로 작동합니다. 불행하게도 이로 인해 명령과 플래그의 자동 완성도 중단됩니다. 완성 파일을 로드하는 순서와 위의 정의를 바꾸는 것은 문제가 되지 않는 것 같습니다.*.cmogitgit

두 기능을 함께 작동시키는 방법에 대한 아이디어가 있습니까?

답변1

git명령 구문을 이해하는 외부 완성 함수를 호출하는 대신 에 내장된 파일 완성 메커니즘을 사용하도록 bash에 지시했습니다 git. 일련의 필터가 아닌 하나의 완성 메커니즘만 있습니다. 일련의 필터를 원하면 이를 코딩해야 합니다.

다행히 2.7-kLoC git 완성 스크립트는 git add자연스러운 방식으로 패턴 제외를 지원합니다. 이러한 패턴을 .gitignore.

printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore

git의 무시 목록에 파일을 추가하지 않고 완료 에서 파일을 제외하려면 git addgit 완성 스크립트를 살펴봐야 할 것 같습니다. 후보 파일 목록을 생성하기 위해 호출하는 호출을 _git_add호출 하고, 차례로 에서 아래로 전달된 옵션을 사용하여 호출하는 호출을 호출합니다 . 그래서 당신은 바뀔 수 있습니다__git_complete_index_file__git_index_files__git_ls_files_helpergit ls-files_git_add_git_add

    __git_complete_index_file "--others --modified --directory --no-empty-directory"

다음과 같은 몇 가지 옵션을 추가합니다 --exclude=*.cm[aiox](인용 문제에 주의하세요. 와일드카드는 결국 명령에 연결되므로 -x *.cm[aiox]패턴이 현재 디렉터리에서 확장되므로 작동하지 않습니다).

관련 정보