git завершение с помощью zsh: имена файлов с пробелами не экранируются должным образом


20

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 сделает его просмотр в браузере)


2
Для пользователей не-OSX в аудитории, не могли бы вы дать ссылку на какое-нибудь место, где мы можем загрузить дополнения, которые поставляются с вашим пакетом git?
Жиль "ТАК ... перестать быть злым"

2
Конечно: _git (переименован в _git.sh для CloudApp): cl.ly/code/423e0i1X1p29 и git- creation.bash
cbowns

3
Я взглянул на _git. Призывы compadd -Qвыглядеть странно: -Qозначает «не заключать в кавычки специальные символы». Попробуйте удалить -Qиз compaddзвонков.
Жиль "ТАК - перестань быть злым"

3
Я вполне уверен, что проблема связана zshс поведением по умолчанию, а не с делением слов результатов подстановки команд. На самом деле - \bsпобег не нужен - или бесполезен, в зависимости от того, как вы на это смотрите. Установите "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeserv

4
Или отредактируйте функции завершения bash так, чтобы они выводили как ${=$(completion)}или что бы то ни было, что они возвращают.
mikeserv

Ответы:


5

Эта ошибка упоминается в списке рассылки .

Исправление состоит в том, чтобы отредактировать файл git-completion.zshи удалить -Qопцию из compadd, in in __gitcomp_file.

--- i/contrib/completion/git-completion.zsh
+++ w/contrib/completion/git-completion.zsh
@@ -90,7 +90,7 @@ __gitcomp_file ()

    local IFS=$'\n'
    compset -P '*[=:]'
-   compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
+   compadd -p "${2-}" -f -- ${=1} && _ret=0
 }

 __git_zsh_bash_func ()

Этот файл устанавливается из 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
cbowns

1
Это сработало для меня (git 2.18, zsh 5.4.2 osx), когда я изменил compadd -Q-> compaddдля всех экземпляров в _gitи git-completion.bashв папке /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/моей установки brew git. Спасибо!!!
Мерлин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.