Không mở rộng ký tự đại diện khi hoàn thành tab


5

Tôi đang tự hỏi làm thế nào tôi có thể cấu hình zsh đến không phải mở rộng ký tự đại diện trong một tên tệp. Ví dụ: tôi có một thư mục gồm vài trăm tệp có tên như sau:

a.foo-bar a.foo b.foo-bar b.foo c.foo-bar c.foo

Tôi muốn có thể thực hiện khớp hoàn thành tab sau một ký tự đại diện, vì vậy

cat *.foo-< tab > => cat *.foo-bar

Đây là những gì tôi nhận được thay thế:

$  cat *.foo-
=> cat a.foo-bar
    tập tin  a.foo-bar b.foo-bar c.foo-bar 

Câu trả lời:


5

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 ).

  1. 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 ]

  2. 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!

  3. 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
    }
    
  4. 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.


0

Tôi không nghĩ điều đó là có thể. Bạn đang yêu cầu shell không chỉ tìm ra tệp nào bạn làm và không muốn kết thúc là "hợp lệ theo bản mở rộng ký tự đại diện của bạn", mà bạn muốn shell tìm ra biểu thức ký tự đại diện "tốt nhất" sẽ mở rộng cách này. Tôi hy vọng rằng phần thứ hai là NP-hoàn chỉnh.


0

Tôi chưa thấy một cách nào để bạn có thể có được những gì bạn đang theo đuổi, nhưng bạn có thể nhận được một chút sửa đổi (có thể hữu ích hoặc không hữu ích cho bạn) setopt GLOB_COMPLETE (điều này sẽ chỉ cung cấp cho bạn một bản mở rộng và sau đó bạn có thể chuyển qua chúng ... hoặc chỉnh sửa bản mở rộng đó thành một bản mở rộng * một lần nữa, mà ít nhất có thể là một cải tiến nhỏ).

Bạn cũng có thể đào xung quanh trong man zshoptions, man zshcompctl, man zshcompwid và / hoặc tương tự. Các công cụ hoàn thành cho zsh khá phức tạp, vì vậy tôi đoán có thể có một cách để làm điều này.

Cũng lưu ý, một câu hỏi hơi liên quan:

Làm cách nào để tôi tự động hoàn thành zsh để hoàn thành các ký tự đại diện như bash?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.