Как мне заставить мои функции оболочки использовать существующее автозаполнение в zsh?

10

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

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

Однако, когда я использую эти функции оболочки, я не могу воспользоваться встроенными в zsh функциями завершения команд. (В случае SSH, автоматическое заполнение имен хостов на основе known_hosts и 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' - нет; вместо того, чтобы пытаться завершить имена хостов, он возвращается к автозаполнению по умолчанию, предоставляя мне список файлов, когда я нажимаю «tab». Есть ли какая-то странность в том, как обрабатывается завершение 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 - это то, что я хотел использовать. Интересно, есть ли причина, по которой вы создаете локальную переменную и shift, а не ссылаетесь на $ 1 и $ 2 при вызове compdef?
Мурали Суриар
@Murali: Вот так я могу написать что-то вроде compdefas xterm cxterm uxterm xterm-color.
Жиль "ТАК - перестань быть злым"
1
интересно - поэтому я определил две оболочки, одну для «человека» и одну для «ssh». Используя compdef, завершение для моей оболочки 'man' работает, но завершение для моей оболочки 'ssh' не работает. Вы сталкивались с такими проблемами раньше? Есть ли что-то еще, что я должен ткнуть, чтобы _ssh работал с моим псевдонимом / оболочкой?
Мурали Суриар