2013-06-26 31 views
8

zsh thật tuyệt vời nhưng hệ thống hoàn thành của nó rất đa dạng. Và tài liệu thiếu các ví dụ hay. Có mẫu để hoàn thành cho một ứng dụng cụ thể không. Việc hoàn thành sẽ lấy dữ liệu đối sánh của nó từ một tệp, được phân cách bằng dòng mới?Đặt đối số hoàn chỉnh zsh từ một tệp

Tôi đã cố gắng thay đổi một ví dụ cũ của tôi mà mất dữ liệu trận đấu "sống":

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

tôi có thể cung cấp cat my_file có thay vì mpc gọi và vân vân nhưng sẽ có thể là một cách thanh lịch hơn để làm điều này nhiệm vụ đơn giản? Và việc hoàn thành đó có vị trí cụ thể: bạn có thể cung cấp ví dụ về nơi zsh sẽ cố gắng hoàn thành bất kỳ lúc nào sau khi tên chương trình được nhận dạng không?

Dữ liệu đối sánh sẽ có khoảng trắng, v.v., việc hoàn thành sẽ thoát khỏi WS. Ví dụ về rằng:

Foo bar 
Barbaric 
Get it (42) 

Bây giờ nếu hoàn thành sẽ được cấu hình cho một lệnh Say, chúng tôi sẽ nhận được loại hành vi ra khỏi zsh:

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

Trả lời

15

nhu cầu hoàn thành đơn giản được giải quyết tốt hơn với _describe, nó cặp một mảng giữ các tùy chọn hoàn thành và mô tả cho chúng (bạn có thể sử dụng nhiều cặp/cặp mô tả, kiểm tra hướng dẫn).

(_arguments là rất tốt nhưng quá phức tạp.)

[...]

Đầu tiên tạo một file

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

Sau đó tạo một file _simple đâu đó trong $fpath của bạn:

#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})' 

rồi

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

simple [TAB] 

hoạt động. Chỉ cần đảm bảo rằng tệp hoàn thành _simple được đặt ở đâu đó trong số fpath của bạn.

Lưu ý rằng : trong danh sách tùy chọn được cho là được sử dụng để tách tùy chọn khỏi mô tả (cá nhân) của họ (oh:noes). Vì vậy, điều đó sẽ không hoạt động với _describe trừ khi bạn báo giá (oh\:yes). Nhận xét ra _arguments ví dụ sẽ không sử dụng : làm dấu phân cách.

+0

Tuyệt vời. Tôi sẽ giải thưởng một số tiền thưởng nếu bạn có thể mở một chút về tài liệu tham khảo và các chi tiết nhưng điều này phục vụ như là ví dụ hoàn hảo tôi đang tìm kiếm. – progo

+2

Cảm ơn bạn rất nhiều. Đây là hướng đi ngắn nhất mà tôi đã tìm thấy để hoàn thành zsh. Nó xứng đáng nhận được nhiều hơn upvotes hơn nó nhận được. –

+0

Tôi có thể lấy thông tin về các cờ 'uf' ở đâu – Timo