git завершення за допомогою zsh: імена файлів з пробілами не вдається уникнути належним чином


20

Git завершення:

У мене виникають труднощі з автозавершеннями назви файлу 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файли: git-завершення.bash та _git (перейменовані _git.shтак, щоб CloudApp зробить його видимим у браузері.)


2
Для користувачів, які не є OSX серед аудиторії, чи можете ви зв’язати якесь місце, де ми можемо завантажити комплекти, які постачаються разом із вашим пакетом git?
Жил "ТАК - перестань бути злим"

2
Звичайно: _git (перейменований на _git.sh для CloudApp): cl.ly/code/423e0i1X1p29 та git-завершення.bash: cl.ly/code/153v2t142i2G
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, в __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каталогу, і його шлях може відрізнятися залежно від менеджера пакунків. Якщо ви встановили з домашньою мовою на 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.