Làm cách nào để tôi đặt quy tắc tự động hoàn thành Zsh cho đối số thứ hai (của hàm) thành quy tắc của lệnh hiện có?


9

Tôi có chức năng Zsh tùy chỉnhg :

function g() {
  # Handle arguments [...]
}

Trong đó, tôi xử lý các đối số ngắn thực thi các lệnh Git. Ví dụ:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

Tôi cần có khả năng đặt quy tắc tự động hoàn thành thành quy tắc của Git cho các đối số ngắn nhưng tôi không chắc chắn về cách thực hiện việc này.

Ví dụ: tôi cần g ls <TAB>hoàn thành tab các quy tắc git ls-files <TAB>sẽ cung cấp cho tôi các đối số cho git ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

Đây không chỉ đơn giản là cài đặt gtự động hoàn tất gitvì tôi đang ánh xạ các lệnh ngắn tùy chỉnh của mình sang các lệnh Git.


1
Nếu chức năng của bạn chỉ ánh xạ các tên ngắn hơn đến các tiểu ban git, bạn cũng có thể sử dụng hệ thống bí danh git cho việc này. Đọc về nó trong bản đồ : man git-config.
Lucas

Câu trả lời:


3

Tôi tìm thấy /usr/share/zsh/functions/Completion/Unix/_gitcó một số lời khuyên cho các bí danh như thế này và cuối cùng đã xác định các hàm này cho các bí danh:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

Sau đó, tôi đã làm một thẳng compdef g=git. Hệ thống tự động hoàn thành sẽ thấy rằng bạn đang chạy, ví dụ, g lsvà sử dụng _git-lschức năng tự động hoàn tất.

Cảm ơn user67060 đã giúp tôi đi đúng hướng.


2

Tôi đã phải làm một cái gì đó rất giống nhau vì vậy đây là những gì nên giải quyết vấn đề của bạn.

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

Một điều cần lưu ý là nếu bạn thay đổi số lượng đối số, bạn sẽ cần điều chỉnh $CURRENTbiến.


1

Đây là những gì tôi sẽ làm:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

Tuy nhiên, đây là sử dụng hoàn thành của Git, không phải hoàn thành của zsh:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh


Cảm ơn, cuối cùng tôi đã đi một con đường khác vì tôi không biết tìm quy tắc hoàn thành Git ở đâu và đang gặp lỗi. Xem câu trả lời của tôi.
Erik Nomitch
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.