Làm cách nào để có được các hàm shell của tôi để sử dụng tự động hoàn thành trong zsh?


10

Tôi có một vài hàm shell được xác định trong .zshrcđó giúp tiết kiệm việc nhập và cho phép tích hợp với màn hình. Ví dụ:

function s()
{
     screen -t "$1" ssh "$@"
}

Tuy nhiên, khi tôi sử dụng các hàm shell này, tôi không thể tận dụng các tính năng hoàn thành lệnh được tích hợp sẵn của zsh. (Trong trường hợp SSH, tự động hoàn thành tên máy chủ dựa trên know_hosts và ssh_config). Cách ưa thích để kết nối với các cơ chế hoàn thành hiện có cho các lệnh tôi đã tạo trình bao bọc là gì?

BIÊN TẬP:

Cảm ơn Gilles cho câu trả lời của mình dưới đây. Sử dụng compdef dường như là cách để làm điều này, nhưng thú vị là nó dường như không hoạt động đồng đều. Trong trường hợp này, tôi có thiết lập sau:

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

Hoàn thành cho chức năng trình bao bọc của tôi 'm' hoạt động như mong đợi, tuy nhiên hoàn thành cho chức năng của tôi 's' thì không; thay vì cố gắng hoàn thành tên máy chủ, nó dường như quay trở lại tự động hoàn thành mặc định bằng cách cung cấp cho tôi danh sách các tệp khi tôi nhấn 'tab'. Có một số điều kỳ lạ trong cách xử lý hoàn thành SSH có nghĩa là tôi cần phải làm gì đó hơn nữa?

Câu trả lời:


9

Tôi sử dụng hàm sau để nói rằng một hàm hoặc bí danh hoặc tập lệnh bao bọc (ví dụ s) sẽ được hoàn thành giống như một lệnh hiện có (ví dụ ssh):

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

Một số lệnh hoàn thành áp dụng cho một họ các hàm và đọc từ đầu tiên của dòng lệnh để xác định lệnh cụ thể nào sẽ hoàn thành. Ví dụ, các lệnh ssh, scp, sftpvà một vài chi tiết đều hoàn thành các chức năng _ssh. Trong trường hợp đó, bạn cần cho biết chức năng hoàn thành mà dịch vụ của Cameron là chức năng của bạn (theo mặc định, dịch vụ là tên thực thi, ở đây là tên hàm của bạn).

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s

Cảm ơn - Tôi giả sử compdef là những gì tôi muốn sử dụng. Không có hứng thú, có bất kỳ lý do nào khiến bạn tạo một biến cục bộ và thay đổi, thay vì tham chiếu $ 1 và $ 2 trong lệnh gọi tới compdef không?
Murali Suriar

@Murali: Đó là vì vậy tôi có thể viết một cái gì đó như compdefas xterm cxterm uxterm xterm-color.
Gilles 'SO- ngừng trở nên xấu xa'

1
thú vị - vì vậy tôi đã xác định hai hàm bao, một cho 'người đàn ông' và một cho 'ssh'. Sử dụng compdef, hoàn thành cho trình bao bọc 'người đàn ông' của tôi hoạt động, nhưng hoàn thành cho trình bao bọc 'ssh' của tôi thì không. Bạn đã gặp phải bất kỳ vấn đề như thế này trước đây? Có cái gì khác tôi phải chọc để _ssh hoạt động với bí danh / trình bao bọc của tôi không?
Murali Suriar
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.