यह बिल्कुल सही नहीं है, लेकिन फिर बैश पूरा होना काफी मुश्किल काम है ...
सबसे सरल तरीका प्रति आदेश के आधार पर है, यह थोड़ा अधिक लचीला है FIGNORE
, आप कर सकते हैं:
complete -f -X "/myproject/data/*" vi
यह स्वत: पूर्ण को निर्देश देता है कि vi
फाइलों के लिए पूरा हो रहा है, और -X
फिल्टर से मेल खाने वाले पैटर्न को हटाने के लिए । नकारात्मक पक्ष यह है कि पैटर्न सामान्यीकृत नहीं है, इसलिए ../data
और विविधताएं मेल नहीं खाएंगी।
अगली सबसे अच्छी बात एक कस्टम PROMPT_COMMAND
फ़ंक्शन हो सकती है :
# associative arrays of non-autocomplete directories
declare -A noacdirs=([/myproject/data]=1 )
function _myprompt {
[[ -n "${noacdirs[$PWD]}" ]] && {
echo autocomplete off
bind 'set disable-completion on'
} || {
echo autocomplete on
bind 'set disable-completion off'
}
}
PROMPT_COMMAND=_myprompt
इस प्रकार से अक्षम पूरा होने (पूरी तरह से) जब आप निर्देशिका में कर रहे हैं, लेकिन यह हर पथ के लिए यह अक्षम कर देता है नहीं सिर्फ इतना है कि निर्देशिका में फाइल।
यह परिभाषित पथों के लिए इसे चुनिंदा रूप से अक्षम करने के लिए आम तौर पर अधिक उपयोगी होगा, लेकिन मेरा मानना है कि एकमात्र तरीका डिफ़ॉल्ट समापन फ़ंक्शन (बैश-4.1 और बाद में complete -D
) का उपयोग करना है और इसके बारे में बहुत कुछ गड़बड़ है।
यह आपके लिए काम करना चाहिए , लेकिन इसके अनपेक्षित दुष्प्रभाव हो सकते हैं (अर्थात कुछ मामलों में अपेक्षित पूर्णता में परिवर्तन):
declare -A noacdirs=([/myproject/data]=1 )
_xcomplete() {
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
name=$(readlink -f "${cur:-./}") # poor man's path canonify
dirname=$(dirname "$name/.")
[[ -n "${noacdirs[$dirname]}" ]] && {
COMPREPLY=( "" ) # dummy to prevent completion
return
}
# let default kick in
COMPREPLY=()
}
complete -o bashdefault -o default -F _xcomplete vi
यह पूरा होने के लिए काम करता है vi
, अन्य कमांड को आवश्यकतानुसार जोड़ा जा सकता है। यह पथ या कार्यशील निर्देशिका की परवाह किए बिना नामित निर्देशिकाओं में फ़ाइलों के लिए पूरा करना बंद कर देना चाहिए।
मेरा मानना है कि सामान्य दृष्टिकोण के साथ complete -D
गतिशील रूप से प्रत्येक कमांड के लिए पूरा होने वाले कार्यों को जोड़ना है क्योंकि यह सामना करना पड़ा है। किसी को complete -E
इनपुट बफ़र खाली होने पर कमांड नाम पूरा करने की भी आवश्यकता हो सकती है ।
अपडेट
यहां PROMPT_COMMAND
और फंक्शन सॉल्यूशंस का हाइब्रिड वर्जन है , मुझे लगता है कि इसे समझना और हैक करना थोड़ा आसान है:
declare -A noacdirs=([/myproject/data]=1 [/project2/bigdata]=1)
_xcomplete() {
local cmd=${COMP_WORDS[0]}
local cur=${COMP_WORDS[COMP_CWORD]} # the current token
[[ -z "$cur" && -n "$nocomplete" ]] && {
printf "\n(restricted completion for $cmd in $nocomplete)\n"
printf "$PS2 $COMP_LINE"
COMPREPLY=( "" ) # dummy to prevent completion
return
}
COMPREPLY=() # let default kick in
}
function _myprompt {
nocomplete=
# uncomment next line for hard-coded list of directories
[[ -n "${noacdirs[$PWD]}" ]] && nocomplete=$PWD
# uncomment next line for per-directory ".noautocomplete"
# [[ -f ./.noautocomplete ]] && nocomplete=$PWD
# uncomment next line for size-based guessing of large directories
# [[ $(stat -c %s .) -gt 512*1024 ]] && nocomplete=$PWD
}
PROMPT_COMMAND=_myprompt
complete -o bashdefault -o default -F _xcomplete vi cp scp diff
nocomplete
जब आप कॉन्फ़िगर की गई निर्देशिकाओं में से एक दर्ज करते हैं तो यह प्रॉम्प्ट फ़ंक्शन चर सेट करता है । संशोधित पूरा होने वाला व्यवहार केवल तभी होता है जब वह चर गैर-रिक्त होता है और केवल जब आप खाली स्ट्रिंग से पूरा करने का प्रयास करते हैं, तो इस प्रकार आंशिक नामों को पूरा करने की अनुमति देता है ( -z "$cur"
पूरी तरह से रोकने के लिए स्थिति को हटा दें )। printf
मूक ऑपरेशन के लिए दो पंक्तियों पर टिप्पणी करें ।
अन्य विकल्पों में एक प्रति-निर्देशिका .noautocomplete
फ़्लैग फ़ाइल शामिल होती है जिसे आप touch
आवश्यकतानुसार डायरेक्ट्री में कर सकते हैं ; और GNU का उपयोग करके निर्देशिका आकार का अनुमान लगाना stat
। आप उन तीन विकल्पों में से किसी एक या सभी का उपयोग कर सकते हैं।
( stat
विधि केवल एक अनुमान है , रिपोर्ट की गई निर्देशिका का आकार इसकी सामग्री के साथ बढ़ता है, यह एक "उच्च पानी का निशान" है जो आमतौर पर तब नहीं सिकुड़ता है जब कुछ प्रशासनिक हस्तक्षेप के बिना फाइलें हटा दी जाती हैं। यह संभावित रूप से बड़े की वास्तविक सामग्री का निर्धारण करने की तुलना में सस्ता है। निर्देशिका। सटीक फ़ाइल के प्रति व्यवहार और वेतन वृद्धि अंतर्निहित फाइल सिस्टम पर निर्भर करती है। मुझे लगता है कि यह linux ext2 / 3/4 सिस्टम पर कम से कम एक विश्वसनीय संकेतक है।)
एक खाली पूरा होने पर भी बैश एक अतिरिक्त स्थान जोड़ता है (यह केवल एक पंक्ति के अंत में पूरा होने पर होता है)। इसे रोकने के -o nospace
लिए आप complete
कमांड को जोड़ सकते हैं ।
एक शेष निगेल यह है कि यदि आप कर्सर को टोकन और हिट टैब की शुरुआत में वापस करते हैं, तो डिफ़ॉल्ट पूर्णता फिर से किक होगी। इसे एक विशेषता पर विचार करें ;-)
(या ${COMP_LINE:$COMP_POINT-1:1}
यदि आप ओवर-इंजीनियरिंग को पसंद करते हैं, तो आप चारों ओर फ्यूज़ कर सकते हैं , लेकिन मुझे लगता है कि जब आप बैक अप लेते हैं और कमांड के बीच में पूरा होने का प्रयास करते हैं, तो मैं स्वयं को पूर्ण रूप से चर सेट करने में विफल रहता है।)