Используйте двоеточие в качестве разделителя имени файла при завершении вкладки zsh - PullRequest
0 голосов
/ 23 мая 2018

У меня есть программы, которые принимают аргументы имени файла как

scp:path/to/file.ext
ark:/abs/path/to/file.ext

Возможно ли сделать zsh полным именем файла после некоторых ключевых слов, за которыми следует двоеточие?

До сих пор я нашел, как это сделать вbash: добавьте : к переменной COMP_WORDBREAKS.


Благодаря Gilles мне удается работать следующим образом.

$ cat ~/.zshrc
...
function aftercolon() {
  if compset -P 1 '*:'; then
    _files "$expl[@]"
  else
    _files "$expl[@]"
  fi
}

autoload -Uz compinit
compinit
compdef aftercolon hello olleh

Теперь в командах hello и olleh, завершение после: работает, как и ожидалось.

Я думаю, что может быть лучше, так как:

  1. Мне пришлось нечетное if / else, так как команды также принимают имя файлабез префикса.

  2. И так как у меня много команд, принимающих этот тип аргумента, мне нужно добавить имена каждой команды

1 Ответ

0 голосов
/ 24 мая 2018

Позвоните compset -P 1 '*:', чтобы удалить все до первого двоеточия, затем _files, чтобы завершить то, что следует после двоеточия.Например, если дополнения имени файла не зависят от части перед двоеточием:

if compset -P 1 '*:'; then
  _files "$expl[@]"
else
  compadd "$expl[@]" -S : ark scp
fi

Если дополнения имени файла зависят от части перед двоеточием, сначала сохраните ее из $PREFIX.

if [[ $PREFIX = *:* ]]; then
  local domain=${PREFIX%%:*}
  compset -P 1 '*:'
  case $domain in
    ark) _files "$expl[@]" -g "*.((tar|cpio)(|.gz|.xz|.bz2)|tgz|zip|rar|7z)";;
    *) _files "$expl[@]";;
  esac
else
  compadd "$expl[@]" -S : ark scp
fi
...