Git завершение:
У меня проблемы с автозаполнением имени файла в моей системе. Я использую zsh
(5.0.5) с git
(1.9.3) на OS X (10.9.3). Оба zsh
и git
были установлены через доморощенный. (Полная версия вывода находится внизу поста.)
git
Завершение имени файла не вставляет пробелы, как я ожидаю. Когда я набираю имя файла с пробелом в имени, оболочка вставляет имя файла без пробелов. zsh
Встроенное завершение не делает этого, но git
делает.
Вот пример того, что я вижу.
У меня есть хранилище с несколькими файлами с пробелами в их именах.
% ls -la
test
test four - latest.txt
test three.txt
test two
Обратная косая черта оболочки экранирует имена файлов, как и ожидалось, когда я использую завершение табуляции для вставки имени файла.
% echo "testing" >> test<tab>
автозаполнение до трех раз после нажатия на вкладку.
% echo "testing" >> test\ four\ -\ latest.txt
––– file
test test\ four\ -\ latest.txt test\ three.txt test\ two
git status
показывает эти имена файлов в кавычках (он полностью понимает, что случилось):
% git status --short
M test
M "test four - latest.txt"
M "test three.txt"
M "test two"
но когда я пытаюсь git add
с автозаполнением вкладки, это идет в сторону.
% git add test<tab>
результаты в этом после нажатия на вкладку три раза:
% git add test four - latest.txt
test test four - latest.txt test three.txt test two
Я попытался регресс это немного: мои в точечных файлов контроля версий, поэтому я пытался zsh 4.3.15
, git 1.8.3
и мои из точечных файлов год назад, когда я почти уверен , что это сработало. Как ни странно, эта установка все еще не работает.
Я уже сузили его к _git
файлу завершения , что в настоящее время получены из /usr/local/share/zsh/site-functions
:
% echo $FPATH
/usr/local/share/zsh/site-functions:/usr/local/Cellar/zsh/5.0.5/share/zsh/functions
% ls -l /usr/local/share/zsh/site-functions
_git@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/_git
_hg@ -> ../../../Cellar/mercurial/3.0/share/zsh/site-functions/_hg
_j@ -> ../../../Cellar/autojump/21.7.1/share/zsh/site-functions/_j
git-completion.bash@ -> ../../../Cellar/git/1.9.3/share/zsh/site-functions/git-completion.bash
go@ -> ../../../Cellar/go/HEAD/share/zsh/site-functions/go
Если я вручную изменяю $FPATH
свои .zshrc
прогоны compinit
(или просто удаляю /usr/local/share/zsh/site-functions/_git
символическую ссылку), завершения возвращаются к zsh
работе и работают, как ожидалось.
zsh
Завершение без _git
:
% git add test<tab>
нажатие на вкладку три раза дает правильные результаты:
% git add test\ four\ -\ latest.txt
––– modified file
test test\ four\ -\ latest.txt test\ three.txt test\ two
Примечание: я пытался удалить git-completion.bash
ссылку, и она просто ломает вещи:
% git add test<tab>
выдает это
% git add test__git_zsh_bash_func:9: command not found: __git_aliased_command
git add test
––– file
test test\ four\ -\ latest.txt test\ three.txt test\ two
Я действительно хочу, чтобы это работало правильно: остальные _git
дополнения были великолепны, потому что они более осведомлены о репо, чем zsh
те, но мне нужно, чтобы имена файлов с пробелами или другими специальными символами были правильно экранированы.
Версии программного обеспечения:
% zsh --version
zsh 5.0.5 (x86_64-apple-darwin13.0.0)
% git --version
git version 1.9.3
% sw_vers
ProductName: Mac OS X
ProductVersion: 10.9.3
BuildVersion: 13D65
Я загрузил _git
и git-completion.bash
файлы: ГИТ-completion.bash и _git (переименовано в _git.sh
. Так CloudApp сделает его просмотр в браузере)
источник
_git
. Призывыcompadd -Q
выглядеть странно:-Q
означает «не заключать в кавычки специальные символы». Попробуйте удалить-Q
изcompadd
звонков.zsh
с поведением по умолчанию, а не с делением слов результатов подстановки команд. На самом деле -\bs
побег не нужен - или бесполезен, в зависимости от того, как вы на это смотрите. Установите"SH_WORD_SPLIT"
zsh.sourceforge.net/FAQ/zshfaq03.html${=$(completion)}
или что бы то ни было, что они возвращают.Ответы:
Эта ошибка упоминается в списке рассылки .
Исправление состоит в том, чтобы отредактировать файл
git-completion.zsh
и удалить-Q
опцию изcompadd
, in in__gitcomp_file
.Этот файл устанавливается из
contrib/completion
каталога, и его путь может отличаться в зависимости от вашего менеджера пакетов. Если вы установили homebrew на macOS, он находится в/usr/local/Cellar/git/2.10.2/share/zsh/site-functions
.источник
__git_aliased_command
том, что каталог общего ресурса изменил имя на git-core (по крайней мере, во FreeBSD), из-за чего он не может быть найденgit-completion.bash
. Если вы измените первое местоположение в строке 33 на жестко запрограммированное,/usr/local/share/git-core/contrib/completion/git-completion.bash
оно снова заработает .echo
этом файле есть чуть выше этих определений функций, и его отсутствие в моей оболочке (и некоторый смежный код при тестировании) предполагает, что эти дополнения даже не используются:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
compadd -Q
->compadd
для всех экземпляров в_git
иgit-completion.bash
в папке/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
моей установки brew git. Спасибо!!!