เติมชื่อไฟล์อัตโนมัติในไดเรกทอรี


16

คำถามนี้ค่อนข้างคล้ายกับคำถามนี้แต่ฉันไม่เข้าใจวิธีแก้ปัญหา ฉันรู้ด้วยบทช่วยสอนนี้แต่ฉันก็ยังไม่สามารถเข้าใจสิ่งที่ฉันทำผิดได้

ฉันกำลังพยายามเติมข้อความอัตโนมัติในรายการไดเรกทอรีที่อยู่ใน/something/:

$ ls /something/

One    Other    Three

ในแบบที่จะเกิดขึ้น:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

เฉพาะเมื่อคำแรกเป็นhiและไม่เพียง /something/แต่ภายใน

นี่คือสิ่งที่ฉันกำลังทำอยู่.profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "

คำตอบ:


15

ลอง:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

คุณต้องระบุ-Wตัวเลือกในcompgenและอ้างคำสั่งที่สร้างรายการคำ

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเขียนฟังก์ชั่นเสร็จสมบูรณ์ในบล็อกนี้: การเขียนฟังก์ชั่น Bash Completion ของคุณเอง


6
สิ่งนี้จะล้มเหลวในชื่อไฟล์ที่มีช่องว่างและอักขระพิเศษอื่น ๆ
Gilles 'หยุดความชั่วร้าย'

2
มันยากที่จะหาชื่อของcompleteคำสั่งถ้าคุณยังไม่รู้และกำลังค้นหาautocompleteหรือtab-completion... นี่เป็นที่แรกที่ฉันพบชื่อคำสั่งและสิ่งที่ฉันต้องแก้ไขejectในการอัพเกรดเป็น Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt lsดังนั้นการแก้ไขคือcomplete -F _longopt eject
:)

1

ให้ฉันพยายามปรับปรุงตามคำตอบที่ยอมรับ

คำตอบเดิมจะล้มเหลวด้วยชื่อไฟล์ที่มีช่องว่าง หลังจากการสอบสวนฉันรู้ว่าคุณสามารถเปลี่ยนตัวแยกอินพุตเป็นจุดสิ้นสุดของบรรทัด:

IFS=$'\n'

ทำให้ฟังก์ชั่นการจัดการช่องว่างอย่างถูกต้อง

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi

1

นี่คือรุ่นที่ไม่เพียง แต่จัดการกับช่องว่าง แต่ยังหนีออกมาได้อีกด้วย:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(ขึ้นอยู่กับคำตอบของdogbaneและEduardo Almeida dos Santosแต่มีการหลบหนีที่จัดทำโดยantakบน SO: /programming//a/11536437/1536933 )


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