2013-06-26 2 views
8

zsh은 훌륭하지만 완료 시스템은 매우 다양합니다. 그리고 문서에는 좋은 예가 없습니다. 특정 애플리케이션을 완료하기위한 템플릿이 있습니까? 완성은 개행 문자로 구분 된 파일에서 일치 데이터를 얻습니다.파일에서 zsh 완전한 인수를 만드십시오.

나는 "라이브"일치하는 데이터를 가져와 내 이전 예제를 수정 시도 :

~ % cat .zsh/completers/_jazzup 
#compdef jazz_up 
_arguments "2: :(`mpc lsplaylists|sed -e 's# #\\\\ #g'`)" 

내가 그래서 대신 mpc 호출이 cat my_file를 공급하고 있었다 그러나이 일을 더 우아한 방법이있을 것 간단한 작업? 그리고 그 위치 완성은 특정 위치에 있습니다 : 프로그램 이름이 인식 된 후에 zsh가 어느 시점에서 완료하려고 시도하는 예제를 제공 할 수 있습니까?

일치 데이터는 공백을 포함하므로 완료되면 WS가 이스케이프 처리되어야합니다. 그 예 : 그 완성이 명령 Say 구성 할 것입니다 이제 경우

Foo bar 
Barbaric 
Get it (42) 

, 우리는 zsh에서 행동의이 종류를 얻어야한다 :

$ Say Fo<TAB> 
$ Say Foo\ bar 
$ Say Ge<TAB> 
$ Say Get\ it\ \(42\) 

답변

15

간단한 완료 요구에 더 잘 _describe으로 해결됩니다, 완성 옵션과 그 설명을 담고있는 배열을 쌍으로 만든다. (다중 배열/설명 쌍을 사용할 수있다.

(_arguments 큰하지만 너무 복잡합니다.)

[...]

먼저

echo "foo\nbar\nbaz\nwith spac e s\noh:noes\noh\:yes" >! ~/simple-complete 

그런 다음 어딘가에 $fpath에서 파일 _simple을 만들 파일 생성 :

#compdef simple 

# you may wish to modify the expansion options here 
# PS: 'f' is the flag making one entry per line 
cmds=(${(uf)"$(< ~/simple-complete)"}) 

# main advantage here is that it is easy to understand, see alternative below 
_describe 'a description of the completion options' cmds 

# this is the equivalent _arguments command... too complex for what it does 
## _arguments '*:foo:(${cmds})' 

다음에

function simple() { echo $* } 
autoload _simple # do not forget BEFORE the next cmd! 
compdef _simple simple # binds the completion function to a command 

simple [TAB] 

작동합니다. 완성 파일 _simplefpath 어딘가에 있는지 확인하십시오.

옵션 목록에있는 :은 (개별) 설명 (oh:noes)에서 옵션을 분리하는 데 사용됩니다. 따옴표를 사용하지 않으면 _describe으로 작동하지 않습니다 (oh\:yes). 주석 처리 된 _arguments 예제에서는 :을 구분 기호로 사용하지 않습니다.

+0

환상적. 참고 자료와 세부 사항에 대해 약간 열어 볼 수 있다면 약간의 현상금을 수여 할 것입니다. 그러나 이것은 내가 찾고있는 완벽한 사례입니다. – progo

+2

정말 고마워요. 이것은 zsh 완성을위한 가장 간결한 연습입니다. 그것은받은 것보다 훨씬 더 많은 upvotes를받을 가치가있다. –

+0

'uf' 플래그에 대한 정보는 어디에서 얻을 수 있습니까 – Timo

관련 문제