Изменение функции завершения Zsh по умолчанию

Я заметил, что завершение с помощью табуляции для команды source в Zsh пытается завершить МНОГО файлов. Может все в $PATH? Я попытался использовать пустой файл .zshrc, чтобы убедиться, что там ничего нет.

ubuntu% source d
zsh: do you wish to see all 109 possibilities (16 lines)?

Я нашел этот файл, который, похоже, управляет этим: /usr/share/zsh/functions/Completion/Zsh/_source

#compdef source .

if [[ CURRENT -ge 3 ]]; then
  compset -n 2
  _normal
else
  if [[ -prefix */ && ! -o pathdirs ]]; then
    _files
  elif [[ $service = . ]]; then
    _files -W path
  else
    _files -W "(. $path)"
  fi
fi

Если я изменю строку в этом последнем операторе else с _files -W "(. $path)" на _files, она будет работать так, как я хочу. Завершение вкладки просматривает только файлы и каталоги в текущем каталоге.

Не похоже, что изменение этого файла - лучший способ. Я бы предпочел что-то изменить в моем файле .zshrc. Но моих знаний о завершении Zsh немного не хватает, и поиск, который я сделал до сих пор, не привел меня к ответу на этот вопрос.


person Andrew Lamarra    schedule 01.06.2021    source источник


Ответы (1)


Может все в $PATH?

Да, это правильно. Он предлагает их, потому что source будет искать ваш текущий каталог и ваш $PATH для любого имени файла, которое вы ему передадите.

Чтобы применить изменения без изменения исходного файла, добавьте это в свой файл .zshrc после вызова compinit:

compdef '
if [[ CURRENT -ge 3 ]]; then
  compset -n 2
  _normal
else
  _files
fi
' source

Это указывает системе завершения использовать встроенную функцию, которую вы указали для команды source (вместо функции по умолчанию).

В качестве альтернативы, чтобы увидеть завершение файлов только для текущего каталога, вы можете ввести

$ source ./<TAB>
person Marlon Richert    schedule 02.06.2021
comment
Похоже, я вообще не вызываю compinit в своем файле .zshrc. Как это должно называться? - person Andrew Lamarra; 02.06.2021
comment
Ах, неважно. Я просто поставил compinit перед этим блоком, и он работает. Благодарю вас! - person Andrew Lamarra; 02.06.2021
comment
Если вы используете, например, Oh-My-Zsh или Ubuntu, то compinit уже будет вызываться автоматически, и вам не нужно вызывать его вручную. - person Marlon Richert; 03.06.2021
comment
Я использую github.com/romkatv/powerlevel10k Похоже, там он тоже вызывается автоматически. - person Andrew Lamarra; 03.06.2021
comment
Я так не думаю: github.com/romkatv/powerlevel10k/search? q=compinit+&type= - person Marlon Richert; 04.06.2021
comment
Ааа, это все еще работает без вызова compinit в моем файле .zshrc. - person Andrew Lamarra; 04.06.2021
comment
Какую операционную систему вы используете? - person Marlon Richert; 04.06.2021
comment
Убунту/Арх Линукс - person Andrew Lamarra; 08.06.2021
comment
Как я уже сказал, в Ubuntu compinit вызывается автоматически: salsa.debian.org/debian/zsh/-/blob/debian/debian/zshrc#L106 - person Marlon Richert; 08.06.2021
comment
Ой ну спасибо. Я прочитал это как Oh-My-Zsh в Ubuntu, а не Oh-My-Zsh или Ubuntu. - person Andrew Lamarra; 08.06.2021