คอมไพล์ด้วย zsh: ชื่อไฟล์ที่มีช่องว่างไม่ได้รับการหลบหนีอย่างเหมาะสม


20

เสร็จสิ้น Git:

ฉันมีปัญหากับการเติมข้อความอัตโนมัติของชื่อคอมไพล์ในระบบของฉัน ฉันใช้zsh(5.0.5) กับgit(1.9.3) ใน OS X (10.9.3) ทั้งสองzshและgitได้รับการติดตั้งผ่าน homebrew (เอาท์พุทเวอร์ชั่นเต็มอยู่ที่ด้านล่างของโพสต์)

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และ 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ก่อนที่จะ.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ความสำเร็จได้ดีเพราะพวกเขากำลังมากขึ้น 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

ฉันได้อัปโหลด_gitและgit-completion.bashไฟล์: git-completion.bashและ_git (เปลี่ยนชื่อเป็น_git.shCloudApp จะทำให้สามารถดูได้ในเบราว์เซอร์)


2
สำหรับผู้ใช้ที่ไม่ใช่ OSX ในกลุ่มผู้ชมคุณสามารถลิงค์ไปยังสถานที่ที่เราสามารถดาวน์โหลดความสำเร็จที่มาพร้อมกับแพ็คเกจ git ของคุณได้หรือไม่?
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

2
แน่นอน: _git (เปลี่ยนชื่อเป็น _git.sh สำหรับ CloudApp): cl.ly/code/423e0i1X1p29และ git-completion.bash: cl.ly/code/153v2t142i2G
cbowns

3
_gitฉันได้อย่างรวดเร็วที่ การเรียกร้องให้compadd -Qดูแปลก ๆ : -Qหมายถึง“ อย่าพูดตัวอักษรพิเศษ” ลองลบออก-Qจากการcompaddโทร
Gilles 'ดังนั้นหยุดความชั่วร้าย'

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ไดเรกทอรีและพา ธ ของไฟล์อาจแตกต่างกันไปตามแพ็คเกจผู้จัดการของคุณ หากคุณติดตั้งกับ 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มันจะทำงานได้อีกครั้ง
Melvyn

มี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 ของฉัน ขอขอบคุณ!!!
เมอร์ลิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.