hoàn thành git với zsh: tên tệp có dấu cách không được thoát đúng


20

Hoàn thành Git:

Tôi đang gặp khó khăn với tự động hoàn thành tên tệp của git trên hệ thống của mình. Tôi đang sử dụng zsh(5.0.5) với git(1.9.3) trên OS X (10.9.3). Cả hai zshgitđã được cài đặt thông qua homebrew. (Đầu ra phiên bản đầy đủ nằm ở cuối bài.)

gitHoàn thành tên tệp không chèn các khoảng trắng như tôi mong đợi. Khi tôi nhập tên của một tệp có một khoảng trắng trong tên, shell sẽ chèn tên tệp mà không có khoảng trắng thoát. zshHoàn thành tích hợp sẵn không làm điều này, nhưng gitthực hiện.

Đây là một ví dụ về những gì tôi đang thấy.

Tôi có một kho lưu trữ với một vài tệp có khoảng trắng trong tên của chúng.

% ls -la
test
test four - latest.txt
test three.txt
test two

Dấu gạch chéo ngược thoát khỏi tên tệp như mong đợi khi tôi sử dụng hoàn thành tab để chèn tên tệp.

% echo "testing" >> test<tab>

tự động hoàn thành việc này sau khi nhấn tab ba lần.

% echo "testing" >> test\ four\ -\ latest.txt
––– file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

git status hiển thị các tên tệp này trong dấu ngoặc kép (nó hoàn toàn hiểu những gì đang xảy ra):

% git status --short
 M test
 M "test four - latest.txt"
 M "test three.txt"
 M "test two"

nhưng khi tôi cố gắng git addtự động hoàn thành tab, nó sẽ đi ngang.

% git add test<tab>

kết quả trong việc này sau khi nhấn tab ba lần:

% git add test four - latest.txt
test                    test four - latest.txt  test three.txt          test two

Tôi đã cố gắng suy thoái này một chút: dotfiles của tôi là trong điều khiển phiên bản, vì vậy tôi đã cố gắng zsh 4.3.15, git 1.8.3và dotfiles của tôi từ một năm trước, khi tôi gần như chắc chắn này làm việc. Thật kỳ lạ, thiết lập này vẫn bị hỏng.

Tôi đã thu hẹp nó xuống _gittập tin hoàn thành có nguồn gốc từ /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

Nếu tôi thay đổi thủ công $FPATHtrước khi .zshrcchạy compinit(hoặc đơn giản là xóa /usr/local/share/zsh/site-functions/_gitliên kết tượng trưng), thì các lần hoàn thành sẽ quay trở lại zshvà hoạt động như mong đợi.

Việc zshhoàn thành mà không có _git:

% git add test<tab>

nhấn tab ba lần tạo ra kết quả chính xác:

% git add test\ four\ -\ latest.txt
––– modified file
test                       test\ four\ -\ latest.txt  test\ three.txt            test\ two                

Lưu ý bên lề: Tôi đã thử xóa git-completion.bashliên kết và nó hoàn toàn phá vỡ mọi thứ:

% git add test<tab>

sản xuất cái này

% 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                

Tôi thực sự muốn làm cho điều này hoạt động đúng: phần còn lại của các phần _githoàn thành là tuyệt vời vì chúng nhận thức được nhiều hơn so với phần zshcòn lại, nhưng tôi cần tên tập tin có khoảng trắng hoặc các ký tự đặc biệt khác để được thoát đúng.


Phiên bản phần mềm:

% 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

Tôi đã tải lên _gitgit-completion.bashcác tệp: git- xong.bash_git (được đổi tên thành để _git.shCloudApp sẽ làm cho nó có thể xem được trong trình duyệt.)


2
Đối với những người dùng không phải OSX trong đối tượng, bạn có thể liên kết đến một nơi nào đó để chúng tôi có thể tải xuống các phần hoàn thành được gửi cùng với gói git của bạn không?
Gilles 'SO- ngừng trở nên xấu xa'

2
Chắc chắn: _git (đổi tên thành _git.sh cho CloudApp): cl.ly/code/423e0i1X1p29 và git-completion.bash: cl.ly/code/153v2t142i2G
cbowns

3
Tôi liếc nhìn _git. Các lời kêu gọi có compadd -Qvẻ kỳ lạ: -Qcó nghĩa là không được trích dẫn các ký tự đặc biệt. Hãy thử loại bỏ -Qkhỏi các compaddcuộc gọi.
Gilles 'SO- ngừng trở nên xấu xa'

3
Tôi khá chắc chắn rằng vấn đề là do zshhành vi mặc định của các kết quả thay thế lệnh không chia tách từ. Trên thực tế - \bslối thoát không cần thiết - hoặc vô ích, tùy thuộc vào cách bạn nhìn vào nó. Đặt "SH_WORD_SPLIT" zsh.sourceforge.net/FAQ/zshfaq03.html
mikeerv

4
Hoặc chỉnh sửa các hàm hoàn thành bash thành đầu ra như thế nào ${=$(completion)}hoặc bất cứ thứ gì chúng trả về.
mikeerv

Câu trả lời:


5

Lỗi này được đề cập trong danh sách gửi thư .

Cách khắc phục là chỉnh sửa tệp git-completion.zshvà xóa -Qtùy chọn khỏi compadd, trong __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 ()

Tập tin này được cài đặt từ contrib/completionthư mục và đường dẫn của nó có thể thay đổi theo trình quản lý gói của bạn. Nếu bạn đã cài đặt homebrew trên macOS, nó sẽ nằm trong /usr/local/Cellar/git/2.10.2/share/zsh/site-functions.


Lỗi về __git_aliased_commandlà do thư mục chia sẻ đã đổi tên thành git-core (ít nhất là trên FreeBSD), khiến nó không tìm thấy git-completion.bash. Nếu bạn thay đổi vị trí đầu tiên trên dòng 33 thành mã hóa cứng, /usr/local/share/git-core/contrib/completion/git-completion.bashnó sẽ hoạt động trở lại.
Melvyn

Có một echotệp trong tệp đó ngay phía trên các định nghĩa hàm này và sự thiếu xuất hiện của nó trong vỏ của tôi (và một số mã liền kề khi kiểm tra) cho thấy những hoàn thành này thậm chí không được sử dụng:if [[ -n ${ZSH_VERSION-} ]]; then echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
cbowns

1
Điều này làm việc cho tôi (git 2.18, zsh 5.4.2 osx) khi tôi thay đổi compadd -Q-> compaddcho tất cả các trường hợp trong _gitgit-completion.bashtrong thư mục /usr/local/Cellar/git/2.18.0/share/zsh/site-functions/cài đặt brew git của tôi. Cảm ơn bạn!!!
Merlin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.