Автодополнение файла Zsh с голым репозиторием git

Возможно, вы стали жертвой того же замешательства, что и я. Есть тема Adwaita, а есть libAdwaita.so, которая является частью стандарта gnome -themes -. Эта общая библиотека представляет собой механизм тем Adwaita, который используют приложения GTK, независимо от того, какая тема используется. Предупреждения выдаются из-за отсутствия стандартного пакета gnome -themes -. Попробуйте установить это, чтобы удалить предупреждения.

1
05.11.2019, 23:15
1 ответ

Если --git-dirприсутствует в командной строке, код завершения распознает его и учитывает при поиске вещей для завершения, если ваш zsh достаточно свежий (≥5.3 ). Это делается путем передачи аргумента в --git-dirв качестве переменной окружения GIT_DIR. Например, чтобы завершить удаленные имена после git fetch, zsh запускает git remote. После git --git-dir=/some/wherezsh запускает git remoteс GIT_DIR=/some/whereв среде. Так что эта часть работает.

К сожалению, в текущей версии zsh (5.7.1+ )он передает нерасширенный аргумент . Поэтому, если вы напишете что-то вроде git --git-dir=~/repositories/foo.git, zsh пройдет GIT_DIR=~/repositories/foo.git, а не GIT_DIR=/home/aaa/repositories/foo.git.

Код завершения zsh не поддерживает аналогичную --work-tree.

Я думаю, вы можете исправить проблему расширения с --git-dirи добавить поддержку --git-worktree, отредактировав файл _gitи заменив строку

        (( $+opt_args[--git-dir] )) && local -x GIT_DIR=$opt_args[--git-dir]

по

        (( $+opt_args[--git-dir] )) && local -x GIT_DIR=${(e)~opt_args[--git-dir]}
        (( $+opt_args[--work-tree] )) && local -x GIT_WORKTREE=${(e)~opt_args[--work-tree]}

Я не проверял это.

У меня недостаточно мотивации, чтобы публиковать сообщения в списке рассылки zsh, но, пожалуйста, сделайте :это (или его рабочую версию, если она не работает, )будет полезным патчем.

Если вы поместите --git-dirили --work-treeв псевдоним, это будет прозрачно :zsh расширяет псевдонимы перед выполнением завершения (при условии, что вы не отключили параметрcomplete_aliases). Если вы поместите их в функцию или скрипт, это непрозрачно :zsh не увидит их и даже не узнает, что функция или скрипт вызывает git, если вы не скажете ему об этом.

Если вы не можете заставить этот патч работать или не хотите поддерживать свою собственную версию _git, вы можете обойти это, определив пользовательскую команду с пользовательской функцией завершения, которая охватывает git.

gitx () {
  git --git-dir=/some/where --work-tree=/else/where "$@"
}
_gitx () {
  local -x GIT_DIR=/some/where GIT_WORKTREE=/else/where
  _git "$@"
}
compdef _gitx gitx

Если у вас есть несколько оберток, вам понадобится функция завершения для каждой из них. Кроме того, вы можете добавить некоторую логику в функцию завершения, чтобы выяснить, какое значение GIT_DIRи GIT_WORKTREEиспользовать. Имя функции находится в $service.

4
27.01.2020, 23:29

Теги

Похожие вопросы