Як змусити мої функції оболонки використовувати існуюче автозавершення в zsh?


10

У мене визначено пару функцій оболонки, .zshrcякі заощаджують при наборі тексту та дозволяють інтегруватись із екраном. Наприклад:

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

Однак, коли я використовую ці функції оболонки, я не можу скористатися вбудованими функціями завершення команд zsh. (У випадку SSH, автоматично заповнюючи імена хостів на основі відомих_хостів та ssh_config). Який кращий спосіб підключитися до існуючих механізмів завершення команд, для яких я створив обгортки?

Редагувати:

Дякую Жиллу за його відповідь нижче. Використання compdef виглядає як спосіб зробити це, але що цікаво, схоже, це не працює однаково. У цьому випадку у мене є така настройка:

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

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

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

Виконання функції моєї обгортки 'm' працює як очікувалося, проте виконання моєї функції 's' не має; замість спроби заповнити імена хостів, схоже, вона повертається до автоматичного завершення за замовчуванням, надаючи мені список файлів, коли я натискаю "вкладку". Чи є якась дивна поведінка в обробці завершення SSH, що означає, що мені потрібно зробити щось далі?

Відповіді:


9

Я використовую наступну функцію, щоб сказати, що функцію або псевдонім або скрипт для обгортки (наприклад s) потрібно виконати як існуючу команду (наприклад ssh):

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

Деякі команди завершення застосовуються до сімейства функцій і читають перше слово командного рядка, щоб визначити, яку саме команду потрібно виконати. Наприклад, команди ssh, scp, sftpі дещо більше все завершені функцією _ssh. У такому випадку вам потрібно повідомити функцію завершення, якою є «послуга» вашої функції (за замовчуванням послуга - це ім'я виконавця, тут назва вашої функції).

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

Дякую - я припустив, що compdef - це те, що я хотів використати. Не цікаво, чи є якась причина, коли ви створюєте локальну змінну та перехід, а не посилаєтесь на $ 1 і $ 2 у своєму дзвінку на compdef?
Муралі Суріар

@Murali: Ось так я можу написати щось на кшталт compdefas xterm cxterm uxterm xterm-color.
Жил "ТАК - перестань бути злим"

1
цікаво - тому я визначив дві обгортки, одну для 'людина' та одну для 'ssh'. Використовуючи compdef, завершення роботи для моєї обгортки 'man' працює, але завершення для моєї 'ssh' обгортки не працює. Ви стикалися з подібними проблемами раніше? Чи є мені щось інше, щоб _ssh працював зі своїм псевдонімом / обгорткою?
Муралі Суріар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.