কমান্ডটি সম্পূর্ণ করা (অন্যান্য জিনিস সহ) ব্যাশ রিডলাইন সমাপ্তির মাধ্যমে পরিচালনা করা হয় । এটি স্বাভাবিক "প্রোগ্রামেবল কমপ্লিউশন" (যা কমান্ড শনাক্ত করা হয় কেবল তখনই অনুরোধ করা হয় এবং আপনি যে দুটি বিশেষ কেস উপরে চিহ্নিত করেছেন) এর চেয়ে কিছুটা নিচু স্তরে পরিচালিত হয়।
আপডেট: বাশ -5.0 (জানুয়ারী 2019) এর নতুন প্রকাশটি complete -I
ঠিক এই সমস্যার জন্য যুক্ত করেছে।
সম্পর্কিত রিডলাইন কমান্ডগুলি হ'ল:
complete (TAB)
Attempt to perform completion on the text before point. Bash
attempts completion treating the text as a variable (if the text
begins with $), username (if the text begins with ~), hostname
(if the text begins with @), or command (including aliases and
functions) in turn. If none of these produces a match, filename
completion is attempted.
complete-command (M-!)
Attempt completion on the text before point, treating it as a
command name. Command completion attempts to match the text
against aliases, reserved words, shell functions, shell
builtins, and finally executable filenames, in that order.
আরও সাধারণভাবে একইভাবে complete -F
, এর কয়েকটি ব্যবহার করে কোনও ফাংশনে হস্তান্তর করা যেতে পারে bind -x
।
function _complete0 () {
local -a _cmds
local -A _seen
local _path=$PATH _ii _xx _cc _cmd _short
local _aa=( ${READLINE_LINE} )
if [[ -f ~/.complete.d/"${_aa[0]}" && -x ~/.complete.d/"${_aa[0]}" ]]; then
## user-provided hook
_cmds=( $( ~/.complete.d/"${_aa[0]}" ) )
elif [[ -x ~/.complete.d/DEFAULT ]]; then
_cmds=( $( ~/.complete.d/DEFAULT ) )
else
## compgen -c for default "command" complete
_cmds=( $(PATH=$_path compgen -o bashdefault -o default -c ${_aa[0]}) )
fi
## remove duplicates, cache shortest name
_short="${_cmds[0]}"
_cc=${#_cmds[*]} # NB removing indexes inside loop
for (( _ii=0 ; _ii<$_cc ; _ii++ )); do
_cmd=${_cmds[$_ii]}
[[ -n "${_seen[$_cmd]}" ]] && unset _cmds[$_ii]
_seen[$_cmd]+=1
(( ${#_short} > ${#_cmd} )) && _short="$_cmd"
done
_cmds=( "${_cmds[@]}" ) ## recompute contiguous index
## find common prefix
declare -a _prefix=()
for (( _xx=0; _xx<${#_short}; _xx++ )); do
_prev=${_cmds[0]}
for (( _ii=0 ; _ii<${#_cmds[*]} ; _ii++ )); do
_cmd=${_cmds[$_ii]}
[[ "${_cmd:$_xx:1}" != "${_prev:$_xx:1}" ]] && break
_prev=$_cmd
done
[[ $_ii -eq ${#_cmds[*]} ]] && _prefix[$_xx]="${_cmd:$_xx:1}"
done
printf -v _short "%s" "${_prefix[@]}" # flatten
## emulate completion list of matches
if [[ ${#_cmds[*]} -gt 1 ]]; then
for (( _ii=0 ; _ii<${#_cmds[*]} ; _ii++ )); do
_cmd=${_cmds[$_ii]}
[[ -n "${_seen[$_cmds]}" ]] && printf "%-12s " "$_cmd"
done | sort | fmt -w $((COLUMNS-8)) | column -tx
# fill in shortest match (prefix)
printf -v READLINE_LINE "%s" "$_short"
READLINE_POINT=${#READLINE_LINE}
fi
## exactly one match
if [[ ${#_cmds[*]} -eq 1 ]]; then
_aa[0]="${_cmds[0]}"
printf -v READLINE_LINE "%s " "${_aa[@]}"
READLINE_POINT=${#READLINE_LINE}
else
: # nop
fi
}
bind -x '"\C-i":_complete0'
এটি আপনার নিজস্ব প্রতি-কমান্ড বা প্রিফিক্স স্ট্রিং হুকটিকে সক্ষম করে ~/.complete.d/
। উদাহরণস্বরূপ: যদি আপনি এর ~/.complete.d/loc
সাথে একটি এক্সিকিউটেবল তৈরি করেন:
#!/bin/bash
echo localc
এটি আপনার প্রত্যাশাটি (মোটামুটি) করবে।
উপরের ফাংশনটি সাধারণ ব্যাশ কমান্ড সমাপ্তির আচরণ অনুকরণ করতে কিছুটা দৈর্ঘ্যে যায় যদিও এটি অসম্পূর্ণ (বিশেষত sort | fmt | column
ম্যাচের একটি তালিকা প্রদর্শন করার জন্য সন্দেহজনক ক্যারি-অন)।
যাইহোক , এটির সাথে একটি তুচ্ছ ত্রুটিযুক্ত সমস্যাটি কেবলমাত্র মূল complete
ফাংশনের সাথে বাঁধার প্রতিস্থাপন করতে একটি ফাংশন ব্যবহার করতে পারে (ডিফল্টরূপে টিএবির সাথে অনুরোধ করা হয়)।
এই পদ্ধতিটি কেবলমাত্র কাস্টম কমান্ড সমাপ্তির জন্য ব্যবহৃত আলাদা কী-বাইন্ডিংয়ের সাথে ভালভাবে কাজ করবে, তবে এটি কেবল তার পরে সম্পূর্ণ সমাপ্তির যুক্তি প্রয়োগ করে না (উদাহরণস্বরূপ কমান্ড লাইনের পরবর্তী শব্দগুলি)। এটি করার জন্য কমান্ড লাইনটি পার্স করা, কার্সার অবস্থানের সাথে সম্পর্কিত এবং অন্যান্য কৌশলগুলি প্রয়োজন যা শেল স্ক্রিপ্টে সম্ভবত বিবেচনা করা উচিত নয় ...
loc
করতেlocalc
? আমি বিকল্পগুলির পরামর্শ দিচ্ছি কারণ খনন এবং অনুসন্ধানের বেশ কিছু সময় পরেও এইভাবে বাশ সম্পূর্ণকরণটি কাস্টমাইজ করার কোনও উপায় আমি পাইনি। এটা সম্ভব নাও হতে পারে।