এটি নিখুঁত নয়, তবে তারপরে আবারও বাশ সম্পূর্ণ হওয়া বেশ জটিল জিনিস ...
খুব সহজ উপায় হ'ল পার-কমান্ডের ভিত্তিতে 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
আপনি ডিরেক্টরিতে থাকলে এটি সম্পূর্ণরূপে অক্ষম করে (পুরোপুরি), তবে এটি কেবলমাত্র সেই ডিরেক্টরিতে থাকা ফাইল নয় প্রতিটি পথের জন্য এটি অক্ষম করে।
এটি নির্ধারিত পাথের জন্য বেছে বেছে এটি অক্ষম করা আরও সাধারণভাবে কার্যকর হবে তবে আমি বিশ্বাস করি যে একটিমাত্র উপায় হ'ল একটি ডিফল্ট সমাপ্তি ফাংশন (ব্যাশ-৪.১ এবং পরে সহ 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ডিরেক্টরিতে ডিরেক্টরিতে পারেন প্রয়োজন হিসাবে; এবং জিএনইউ ব্যবহার করে ডিরেক্টরি আকার অনুমান করা stat। আপনি এই তিনটি বিকল্পের যে কোনও বা সমস্ত ব্যবহার করতে পারেন।
(দ্য stat পদ্ধতিটি কেবলমাত্র একটি অনুমান , এর তালিকাভুক্ত ডিরেক্টরি আকারটি এর বিষয়বস্তুগুলির সাথে বৃদ্ধি পায়, এটি একটি "উচ্চ জলের চিহ্ন" যা কোনও প্রশাসনিক হস্তক্ষেপ ছাড়াই ফাইলগুলি মুছে ফেলা হলে সাধারণত সঙ্কুচিত হবে না a সম্ভাব্য বৃহতের প্রকৃত সামগ্রী নির্ধারণের চেয়ে সস্তা ডিরেক্টরি। ফাইলের প্রতি যথাযথ আচরণ এবং বর্ধন অন্তর্নিহিত ফাইল সিস্টেমের উপর নির্ভর করে I আমি এটি লিনাক্স ext2 / 3/4 সিস্টেমে কমপক্ষে একটি নির্ভরযোগ্য সূচক পাই))
খালি সমাপ্তি ফিরে আসার পরেও বাশ একটি অতিরিক্ত স্থান যুক্ত করে (এটি কেবলমাত্র একটি লাইনের শেষে সম্পূর্ণ করার সময় ঘটে)। তুমি যোগ করতে পার-o nospaceএটি completeরোধ কমান্ডটিতে করতে ।
আর একটি নিগল হ'ল আপনি যদি একটি টোকেন এবং হিট ট্যাব শুরু করার জন্য কার্সারটিকে ব্যাক আপ করেন তবে ডিফল্ট সমাপ্তি আবার শুরু হবে। এটি একটি বৈশিষ্ট্য বিবেচনা করুন ;-)
(অথবা আপনি ${COMP_LINE:$COMP_POINT-1:1}যদি ওভার ইঞ্জিনিয়ারিং পছন্দ করেন তবে আপনি আশেপাশে ফুট করতে পারেন, তবে আমি খুঁজে পাচ্ছি যে আপনি যখন ব্যাকআপ নেবেন এবং কোনও কমান্ডের মাঝখানে সম্পূর্ণ করার চেষ্টা করবেন তখন ব্যাশ নিজেই সম্পূর্ণরূপে পরিবর্তনশীলগুলি সেট করতে ব্যর্থ হয়))