저는 Arch Linux와 zsh를 사용하고 있습니다. 나는 그것을 사용하고 있다삼키다와 같은 다른 명령에 대한 래퍼로서 zsh 자동 완성이 내가 입력한 후에 플래그/매개변수를 제안하여 자동 완성이 for와 비슷 하지만 플래그가 없도록 만들고 devour cmd args...
싶습니다 . 예를 들어 제안되어야 하는 플래그를 입력합니다 .cmd
cmd
devour
sudo
devour
devour id <TAB>
id
을 확인했지만 /usr/share/zsh/functions/Completion/Unix/_sudo
자동 완성 zsh 스크립트에 대해 잘 모르기 때문에 원하는 동작을 얻으려면 여기에서 무엇을 추출해야 할지 모르겠습니다.
이러한 래퍼에 대한 자동 완성 스크립트를 어떻게 만들 수 있나요?
답변1
devour
다른 명령의 접두사일 뿐이고 자체적으로 옵션이 없는 경우 다음을 사용하세요._precommand
완전한 기능. 이것이 zsh가 eval
, time
, noglob
, nohup
등을 위한 것입니다.
compdef _precommand devour
접두사 명령에 옵션이 있는 경우 이러한 옵션을 수행하는 방법을 지정하는 일반적인 방법은 다음과 같습니다._arguments
기능. 최소한 전달한다는 -S -A "-*"
것은 _arguments
접두사 옵션이 명령 이름 뒤에 완료될 필요가 없으며 --
명령 이름 앞에 나타날 수 있음을 의미합니다(이렇게 하면 명령 이름이 대시로 시작할 수 있습니다). 별칭, 함수 또는 내장 명령이 아닌 외부 명령만 명령 이름으로 사용할 수 있도록 지정하려면 첫 번째 인수( ) 1
의 완성 형식을 지정합니다 _command_names -e
. *
( )에 전달된 옵션이 아닌 다른 인수 에 대한 완성 기능을 제공합니다._normal -p $service
. 이는 _arguments
매우 복잡한 구문 분석을 수행하고 예상치 못한 곳에서 구두점 및 공백 문제를 수행합니다. (오류의 영향은 전혀 완료되지 않는 것부터 메뉴 완료가 예상되는 프롬프트를 표시하지 않거나 특정 중첩 컨텍스트에서 잘못된 것을 완료하는 등 매우 사소한 문제까지 다양합니다.) 의심스러운 경우 아래 코드 조각을 확인하거나 zsh와 함께 제공되는 완성 기능에서.
#compdef my_prefix
_arguments -S -A '-*' : \
'1:command: _command_names -e' '*:: : _normal -p $service'
_fakeroot
그리고_setsid
몇 가지 훌륭하고 간단한 예가 있습니다. 좀 더 자세한 예는 다음과 같습니다._sudo
그리고_xargs
.
바라보다사용자 정의 명령에 대한 동적 zsh 자동 완성완성 기능을 배치하는 방법과 위치에 대한 일반적인 조언입니다.
이 답변은 귀하가 "새로운 스타일"(1990년대 중반에 추가된) 완성 시스템을 사용하고 compinit
있고 .zshrc
.