निर्देशिका में फ़ाइल नाम का स्वत: पूर्ण


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और वर्डलिस्ट बनाने वाले कमांड को भी उद्धृत करें।

इस ब्लॉग पर पूर्ण कार्य लिखने के बारे में अधिक जानकारी: अपना स्वयं का बैश कम्पलीटेशन फंक्शन लिखना


6
यह व्हॉट्सएप और अन्य विशेष वर्णों वाले फ़ाइल नामों पर विफल हो जाएगा।
गिल्स एसओ- बुराई को रोकना '

2
completeयदि आप पहले से ही इसे नहीं जानते हैं और autocompleteया इसे खोज रहे हैं, तो कमांड का नाम ढूंढना बहुत मुश्किल है tab-completion... यह पहला स्थान है जिसे मैंने कमांड नाम पाया है, और मुझे ejectउबंटू में अपग्रेड करने के लिए इसे ठीक करने की आवश्यकता थी। 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 "

( डॉगबैन के आधार पर और एडुआर्डो अल्मेडा डॉस सैंटोस के उत्तर, लेकिन एसओ पर एंटक द्वारा प्रदान किए गए बचने के साथ : /programming//a/11536437/1536933 )


0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.