ฉันจะตั้งค่ากฎการเติมข้อความอัตโนมัติ Zsh สำหรับอาร์กิวเมนต์ที่สอง (ฟังก์ชัน) เป็นกฎของคำสั่งที่มีอยู่ได้อย่างไร


9

ฉันมีฟังก์ชั่น Zsh ที่กำหนดเองg :

function g() {
  # Handle arguments [...]
}

ภายในนั้นฉันจัดการกับข้อโต้แย้งสั้น ๆ ที่เรียกใช้คำสั่ง Git ตัวอย่างเช่น:

g ls # Executes git ls-files ...
g g  # Executes git grep ...

ฉันต้องสามารถตั้งค่ากฎการเติมข้อความอัตโนมัติให้เป็นกฎของ Git สำหรับข้อโต้แย้งสั้น ๆ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

ตัวอย่างเช่นฉันต้องg ls <TAB>แท็บทำตามกฎgit ls-files <TAB>ซึ่งจะทำให้ฉันมีข้อโต้แย้งสำหรับgit ls-files:

$ g ls --<TAB>
--abbrev                 -- set minimum SHA1 display-length
--cached                 -- show cached files in output
--deleted                -- show deleted files in output
# Etc...

นี่ไม่ใช่การตั้งค่าgให้เติมข้อความอัตโนมัติgitเนื่องจากฉันกำลังจับคู่คำสั่งสั้น ๆ ที่กำหนดเองกับคำสั่ง Git


1
หากฟังก์ชันของคุณแม็พชื่อที่สั้นกว่ากับคำสั่งย่อย git คุณสามารถใช้ระบบนามแฝง git ได้ อ่านเกี่ยวกับมันใน mapage man git-configนี้:
ลูคัส

คำตอบ:


3

ฉันพบว่า/usr/share/zsh/functions/Completion/Unix/_gitมีเคล็ดลับสำหรับนามแฝงเช่นนี้และสิ้นสุดการกำหนดฟังก์ชันเหล่านี้สำหรับนามแฝง:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

compdef g=gitจากนั้นผมตรง ระบบเติมข้อความอัตโนมัติจะเห็นว่าคุณกำลังใช้งานอยู่g lsและใช้_git-lsฟังก์ชั่นเติมข้อความอัตโนมัติ

ขอบคุณ user67060 ที่ช่วยผลักฉันไปในทิศทางที่ถูกต้อง


2

ฉันต้องทำสิ่งที่คล้ายกันมากดังนั้นนี่คือสิ่งที่ควรแก้ปัญหาของคุณ

_g () {
    case "${words[2]}" in
      ls) words[1,2]=(git ls-files);;
      g) words[1,2]=(git grep);;
      *) return 1;;
    esac

    _git # Delegate to completion
}
compdef _g g

สิ่งหนึ่งที่ควรทราบคือถ้าคุณเปลี่ยนจำนวนอาร์กิวเมนต์คุณจะต้องปรับ$CURRENTตัวแปร


1

นี่คือสิ่งที่ฉันจะทำ:

_tg () {
    local _ret=1
    local cur cword prev

    cur=${words[CURRENT]}
    prev=${words[CURRENT-1]}
    cmd=${words[2]}
    let cword=CURRENT-1

    case "$cmd" in
    ls)
        emulate ksh -c _git_ls_files
        ;;
    g)
        emulate ksh -c _git_grep
        ;;
    esac

    let _ret && _default && _ret=0
    return _ret
}

compdef _tg tg

อย่างไรก็ตามนี่เป็นการใช้ความสำเร็จของ Git ไม่ใช่ความสมบูรณ์ของ zsh:

https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh


ขอบคุณฉันลงเอยด้วยการไปในเส้นทางอื่นเนื่องจากฉันไม่รู้ว่าจะหากฎการเติม Git ได้ที่ไหนและได้รับข้อผิดพลาด ดูคำตอบของฉัน
Erik Nomitch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.