Bash 자동 완성과 필터 모드를 동시에 사용하는 방법은 무엇입니까?

Bash 자동 완성과 필터 모드를 동시에 사용하는 방법은 무엇입니까?

명령을 올바르게 자동 완성 하지만 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 addgit 완성 스크립트를 자세히 살펴봐야 할 것 같습니다. _git_addwhich __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]패턴이 현재 디렉터리에서 확장되기 때문에 작동하지 않습니다).

관련 정보