zsh로 git complete : 공백이있는 파일 이름이 올바르게 이스케이프되지 않습니다


20

힘내 완료 :

내 시스템에서 git의 파일 이름 자동 완성에 어려움을 겪고 있습니다. OS X (10.9.3)에서 (1.9.3) zsh과 함께 (5.0.5)를 사용하고 git있습니다. 모두 zshgit사제를 통해 설치되었습니다. (전체 버전 출력은 게시물 하단에 있습니다.)

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

나는이 약간의 기능에 영향을 미치지 시도했다 : 나는 시도했다 그래서 나의 dotfiles는 버전 제어에 zsh 4.3.15, git 1.8.3나는 거의 확신 할 때, 1 년 전부터 나의 dotfiles이했다. 이상하게도이 설정은 여전히 ​​깨졌습니다.

나는 까지를 좁혀 _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전에 수동으로 변경 하거나 단순히 심볼릭 링크 를 제거하면 완료가 다시 예상대로 작동합니다..zshrccompinit/usr/local/share/zsh/site-functions/_gitzsh

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그들은 더 많은 REPO 인식 댄이기 때문에 완료가 대단 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

내가 업로드 한 _gitgit-completion.bash파일 : 자식-completion.bash_git (로 변경 _git.sh. CloudApp는 브라우저에서 볼 수 있도록 않도록를)


2
대상 독자가 아닌 OSX 사용자의 경우 git 패키지와 함께 제공되는 완성품을 다운로드 할 수있는 곳으로 링크 할 수 있습니까?
Gilles 'SO- 악마 그만해'

2
물론 : _git (CloudApp의 경우 _git.sh로 이름 변경) : cl.ly/code/423e0i1X1p29 및 git-completion.bash : cl.ly/code/153v2t142i2G
cbowns

3
나는 한 눈에 보았다 _git. compadd -Q이상하게 보이기 위한 호출 : -Q"특수 문자를 인용하지 않음"을 의미합니다. 통화 -Q에서 제거해보십시오 compadd.
Gilles 'SO- 악마 그만해'

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에 homebrew와 함께 설치 한 경우에 있습니다 /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다시 작동합니다.
Melvyn

거기의 echo단지이 함수 정의 위의 해당 파일에, 그리고 내 껍질에서 그것의 모양의 부족 (및 테스트 일부 인접 코드)이 완료 심지어 사용되지 않습니다 제안 :if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns은

1
brew git 설치 폴더 내 및 폴더 의 모든 인스턴스에 대해 compadd -Q-> compadd를 변경하면 나에게 도움이되었습니다 (git 2.18, zsh 5.4.2 osx) . 고맙습니다!!! _gitgit-completion.bash/usr/local/Cellar/git/2.18.0/share/zsh/site-functions/
멀린
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.