Một tùy chọn là, bạn thay thế ràng buộc khóa mặc định cho TAB
Chìa khóa
bindkey "^I" expand-or-complete
với
bindkey "^I" complete-word
mà sẽ không mở rộng một *
cho tất cả các tập tin phù hợp, nhưng để lại ngôi sao không bị ảnh hưởng. Bằng cách này, bạn thoát khỏi danh sách vô tận, nhưng nó vẫn không hoàn thành biểu thức toàn cầu.
Để giải quyết điều này là khó khăn hơn nhiều.
Bạn phải tự viết hoàn thành widget (xem man zshcompwid
).
Hãy bắt đầu với định nghĩa:
zle -C complete-glob menu-complete compglob
Điều này giới thiệu các widget mới toàn cầu , mà hành xử như thực đơn hoàn thành và sử dụng chức năng vỏ âm mưu để tạo ra các trận đấu.
[Lưu ý: Nếu bạn không muốn hoàn thành menu, hãy sử dụng các tùy chọn thô sơ hơn nhiều từ hoàn chỉnh hoặc là danh sách lựa chọn ]
Liên kết tiện ích mới này với một phím tắt thuận tiện, như CTRL+K
:
bindkey "^K" complete-glob
Đừng ràng buộc điều này với TAB
, vì các widget ở dạng hiện tại của nó chỉ hoàn thành các tập tin!
Xác định hàm shell âm mưu như sau, công việc thực tế:
compglob () {
setopt localoptions globsubst
compset -P '*'
files=(${IPREFIX}*)
display=(${files/${IPREFIX}/${(q)IPREFIX}})
glob=(${files/${IPREFIX}/})
compadd -d display -- $glob
}
Trình diễn:
$ touch a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo
$ cat *.f<CTRL+K>
$ cat *.foo
\*.foo \*.foo-bar
Lỗ hổng duy nhất tôi thấy là \
ở phía trước của ngôi sao trong danh sách trình bày. Nhưng đây chỉ là một lỗ hổng quang học, vì sự hoàn thành là chính xác: *.foo
hoặc là *.foo-bar
.