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 zsh
và git
đã được cài đặt thông qua homebrew. (Đầu ra phiên bản đầy đủ nằm ở cuối bài.)
git
Hoà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. zsh
Hoàn thành tích hợp sẵn không làm điều này, nhưng git
thự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 add
tự độ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.3
và 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 _git
tậ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 $FPATH
trước khi .zshrc
chạy compinit
(hoặc đơn giản là xóa /usr/local/share/zsh/site-functions/_git
liên kết tượng trưng), thì các lần hoàn thành sẽ quay trở lại zsh
và hoạt động như mong đợi.
Việc zsh
hoà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.bash
liê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 _git
hoà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 zsh
cò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 _git
và git-completion.bash
các tệp: git- xong.bash và _git (được đổi tên thành để _git.sh
CloudApp sẽ làm cho nó có thể xem được trong trình duyệt.)
_git
. Các lời kêu gọi có compadd -Q
vẻ kỳ lạ: -Q
có nghĩa là không được trích dẫn các ký tự đặc biệt. Hãy thử loại bỏ -Q
khỏi các compadd
cuộc gọi.
zsh
hà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ế - \bs
lố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
${=$(completion)}
hoặc bất cứ thứ gì chúng trả về.