আমি কীভাবে আমার এলিয়াসগুলির জন্য ট্যাব-সমাপ্তি সম্পাদন করতে বাশ পেতে পারি?


45

আমার কাছে একগুচ্ছ ব্যাশ সমাপ্তি স্ক্রিপ্টস সেট আপ হয়েছে (বেশিরভাগ ব্যাশ-এটি এবং কিছু ম্যানুয়ালি সেটআপ ব্যবহার করে)।

আমিও মত সাধারণ কাজের জন্য alias লেখা সেটআপ একটি গুচ্ছ আছে gcoজন্য git checkout। এই মুহূর্তে আমি টাইপ করতে পারি git checkout dTabএবং developআমার জন্য সম্পূর্ণ হয়ে যায় তবে আমি যখন টাইপ gco dTabকরি তখন এটি পূর্ণ হয় না।

আমি ধরে নিচ্ছি এটি কারণ এটি সম্পূর্ণরূপে স্ক্রিপ্টটি সম্পূর্ণ হচ্ছে gitএবং এটি দেখতে ব্যর্থ হয় gco

জেনারিকভাবে / প্রোগ্রামগতভাবে আমার সম্পূর্ণকরণের সমস্ত স্ক্রিপ্টগুলি আমার এলিয়াসগুলির সাথে কাজ করার উপায় আছে? উপনামের ধরণের নামটি হ'ল উপনামের উদ্দেশ্যটি ব্যবহার করার সময় সম্পূর্ণ করতে সক্ষম হচ্ছেন না।


আপনি কোন ওএস এবং ব্যাশ ব্যবহার করছেন? আমি উবুন্টু ১১.১০ এবং ব্যাশ b.২.১০ (১) -রিলেজ (x86_64-পিসি-লিনাক্স-গনু) এবং আমার অনেকগুলি এলিয়াসের জন্য আমার শেলটিতে এই কার্যকারিতাটি নির্মিত হয়েছে। বিটিডব্লিউ bash --versionএটি পেতে (ব্যবহার করবেন না -v, বিভিন্ন আউটপুট)।
মাইকেল ডুরান্ট

দুঃখিত তথ্যের কিছুটা মিস করেছেন - ওএসএক্স সিংহ, জিএনইউ ব্যাশ, সংস্করণ 3.2.48 (1) - রিলিজ (x86_64-আপেল-ডারউইন 11)
দস্তর

1
@ কিলারমিস্ট: যতক্ষণ না আমি সম্পূর্ণরূপে ভুল হয়ে থাকি, zsh বাক্সের বাইরে কোনও অ্যালাইজড কমান্ড সম্পূর্ণ করে না। কোনও ফাংশন প্রয়োগ করা যা সংজ্ঞায়িত উপকরণকে সমাপ্তির সাথে যুক্ত করে বাশের চেয়ে তুলনামূলক সহজ বলে মনে হয়, যদিও zh এর সমাপ্তি সিস্টেমটি বাশের চেয়ে বেশি শক্তিশালী এবং আরও সোজা বলে মনে হয়।
কোপিশচে


1
@ মিশেলডুরান্ট আপনি কি নিশ্চিত যে এটি প্রকৃতপক্ষে এলিয়াসগুলির জন্য নির্মিত? আমি বাশ ৪.৩.৪২ (১) -রিলেজ (x86_64-pc-linux-gnu) সহ উবুন্টু 15.10 এ আছি এবং এরকম কোনও জিনিস নেই। আমি কয়েক আগের রিলিজ পরীক্ষা করেছি। সুতরাং উদাহরণস্বরূপ আপনি যদি ll --[TAB]এটি টাইপ করেন তবে বিকল্পগুলির একটি তালিকা মুদ্রণ করবে ls? আমি এটি সম্পর্কে বেশ সংশয়বাদী, তবে আপনি যদি নিশ্চিত হন যে ১১.১০-তে এই জাতীয় কোনও কিছুর অস্তিত্ব আছে তবে আমি এটি খনন করতে এবং কোনটি অপসারণ করা হয়েছে তা নির্ধারণ করতে আগ্রহী।
ছয়

উত্তর:


42

এই স্ট্যাক ওভারফ্লো উত্তর এবং এই উবুন্টু ফোরাম আলোচনার থ্রেড থেকে গৃহীত নিম্নলিখিত কোডগুলি আপনার সমস্ত সংজ্ঞায়িত উপকরণগুলির জন্য পরিপূর্ণতা যুক্ত করবে:

# Automatically add completion for all aliases to commands having completion functions
function alias_completion {
    local namespace="alias_completion"

    # parse function based completion definitions, where capture group 2 => function and 3 => trigger
    local compl_regex='complete( +[^ ]+)* -F ([^ ]+) ("[^"]+"|[^ ]+)'
    # parse alias definitions, where capture group 1 => trigger, 2 => command, 3 => command arguments
    local alias_regex="alias ([^=]+)='(\"[^\"]+\"|[^ ]+)(( +[^ ]+)*)'"

    # create array of function completion triggers, keeping multi-word triggers together
    eval "local completions=($(complete -p | sed -Ene "/$compl_regex/s//'\3'/p"))"
    (( ${#completions[@]} == 0 )) && return 0

    # create temporary file for wrapper functions and completions
    rm -f "/tmp/${namespace}-*.tmp" # preliminary cleanup
    local tmp_file; tmp_file="$(mktemp "/tmp/${namespace}-${RANDOM}XXX.tmp")" || return 1

    local completion_loader; completion_loader="$(complete -p -D 2>/dev/null | sed -Ene 's/.* -F ([^ ]*).*/\1/p')"

    # read in "<alias> '<aliased command>' '<command args>'" lines from defined aliases
    local line; while read line; do
        eval "local alias_tokens; alias_tokens=($line)" 2>/dev/null || continue # some alias arg patterns cause an eval parse error
        local alias_name="${alias_tokens[0]}" alias_cmd="${alias_tokens[1]}" alias_args="${alias_tokens[2]# }"

        # skip aliases to pipes, boolean control structures and other command lists
        # (leveraging that eval errs out if $alias_args contains unquoted shell metacharacters)
        eval "local alias_arg_words; alias_arg_words=($alias_args)" 2>/dev/null || continue
        # avoid expanding wildcards
        read -a alias_arg_words <<< "$alias_args"

        # skip alias if there is no completion function triggered by the aliased command
        if [[ ! " ${completions[*]} " =~ " $alias_cmd " ]]; then
            if [[ -n "$completion_loader" ]]; then
                # force loading of completions for the aliased command
                eval "$completion_loader $alias_cmd"
                # 124 means completion loader was successful
                [[ $? -eq 124 ]] || continue
                completions+=($alias_cmd)
            else
                continue
            fi
        fi
        local new_completion="$(complete -p "$alias_cmd")"

        # create a wrapper inserting the alias arguments if any
        if [[ -n $alias_args ]]; then
            local compl_func="${new_completion/#* -F /}"; compl_func="${compl_func%% *}"
            # avoid recursive call loops by ignoring our own functions
            if [[ "${compl_func#_$namespace::}" == $compl_func ]]; then
                local compl_wrapper="_${namespace}::${alias_name}"
                    echo "function $compl_wrapper {
                        (( COMP_CWORD += ${#alias_arg_words[@]} ))
                        COMP_WORDS=($alias_cmd $alias_args \${COMP_WORDS[@]:1})
                        (( COMP_POINT -= \${#COMP_LINE} ))
                        COMP_LINE=\${COMP_LINE/$alias_name/$alias_cmd $alias_args}
                        (( COMP_POINT += \${#COMP_LINE} ))
                        $compl_func
                    }" >> "$tmp_file"
                    new_completion="${new_completion/ -F $compl_func / -F $compl_wrapper }"
            fi
        fi

        # replace completion trigger by alias
        new_completion="${new_completion% *} $alias_name"
        echo "$new_completion" >> "$tmp_file"
    done < <(alias -p | sed -Ene "s/$alias_regex/\1 '\2' '\3'/p")
    source "$tmp_file" && rm -f "$tmp_file"
}; alias_completion

সরল (কেবল কমান্ড, কোনও আর্গুমেন্ট নয়) উপকরণের জন্য এটি ওরফকে মূল সমাপ্তির ফাংশন বরাদ্দ করবে; যুক্তিযুক্ত এলিয়াসগুলির জন্য, এটি একটি মোড়ক ফাংশন তৈরি করে যা মূল সমাপ্তির ফাংশনে অতিরিক্ত যুক্তি সন্নিবেশ করে।

যে স্ক্রিপ্টগুলি থেকে এটি বিকশিত হয়েছে তার বিপরীতে, ফাংশনটি ওরফে কমান্ড এবং তার যুক্তিগুলির উভয়ই উদ্ধৃতি দেয় (তবে পূর্ববর্তীটি সম্পূর্ণ কমান্ডের সাথে মিলিত হতে হবে, এবং বাসা বাঁধতে পারে না), এবং এটি নির্ভরযোগ্যভাবে কমান্ড তালিকাগুলির জন্য উপকরণগুলি ফিল্টার করে এবং পাইপগুলি (যেগুলি এড়ানো যায়, কারণ সম্পূর্ণ শেল কমান্ড লাইন পার্সিং যুক্তি পুনরায় তৈরি না করে সেগুলিতে কী পূর্ণ করতে হবে তা সন্ধান করা অসম্ভব)।

ব্যবহার

হয় কোডটি শেল স্ক্রিপ্ট ফাইল এবং উত্স হিসাবে সংরক্ষণ করুন যা এতে ফাংশনটি হুপি করে.bashrc (বা আপনার প্রাসঙ্গিক ডট ফাইল ) কপি করে । গুরুত্বপূর্ণ বিষয় হ'ল বাশ সমাপ্তি এবং উরফ সংজ্ঞা উভয়ই সেট আপ করার পরে ফাংশনটি কল করা (উপরের কোডটি "উত্স এবং ভুলে যাও" স্পিরিটে তার সংজ্ঞাের পরে ঠিক ফাংশনটি কল করে, তবে আপনি যদি কলটি যে কোনও জায়গায় স্রোত করতে পারেন যদি তা হয়) আপনাকে আরও ভাল মানায়)। যদি আপনি আপনার পরিবেশে এটিটি বেরিয়ে যাওয়ার পরে ফাংশনটি না চান তবে আপনি unset -f alias_completionকল করার পরে এটি যুক্ত করতে পারেন ।

নোট

আপনি যদি bash৪.১ বা তদূর্ধ্ব ব্যবহার করে থাকেন এবং গতিশীল-লোড হওয়া পরিপূর্ণতা ব্যবহার করেন তবে স্ক্রিপ্টটি আপনার সমস্ত এলিয়াসড কমান্ডের জন্য সম্পূর্ণতা লোড করার চেষ্টা করবে যাতে এটি আপনার উপস্বের জন্য মোড়কের কাজগুলি তৈরি করতে পারে।


1
আমি কীভাবে এই স্ক্রিপ্টটি ইনস্টল করব ?
ডের হচস্টাপলার

1
@ অলিভারসালজবার্গ: আপনার বাছুর সমাপ্তির পরে আপনার শেল প্রোফাইল ফাইলগুলিতে এটি প্রক্রিয়া করতে হবে - এটি সম্ভবত এটি তৈরি করবে ~/.bashrc। হয় এটিকে শেল স্ক্রিপ্ট ফাইল হিসাবে সংরক্ষণ করুন এবং এটি উত্স ( . /path/to/alias_completion.sh) করুন, বা কোডটি অনুলিপি করে পেস্ট করুন।
kopischke

1
@ অলিভারসালজবার্গ: ব্যবহারের নির্দেশাবলী যুক্ত করেছেন (এখনই আপনি লক্ষ্য করেন নি যে আপনি ওপি নন)।
কোপিশচে

1
@ Kopischke এই প্রশ্নটি দেখুন - দৃশ্যত /usr/share/bash-completion/completions/তাদের নীচে থাকা ফাইলগুলির জন্য ব্যবহারকারীরা প্রথমবার প্রথম আঘাত করার পরে লোড হয় [TAB]। সুতরাং এমনকি যদি ফাংশনটি এটি থেকে লোড করা হয় তবে ~/.bashrcএটিতে কমান্ডের জন্য উপস্বের জন্য পরিপূর্ণতা তৈরি করবে না। পরে complete -pকাজ করার জন্য নিশ্চিত হয়েছি apt-getএবং apt-cacheআমি আপনার ফাংশনটি টার্মিনালে অনুলিপি করেছি এবং এটি সঠিকভাবে কাজ করছে।
জামাদগনি

1
@ Kopischke সুতরাং আমি নিশ্চিত না যে কীভাবে সমস্ত গতিশীল লোড হওয়া সমাপ্তি ফাইলগুলি স্রোসিংকে বাধ্য করা যায়, বা এটি পরামর্শ দেওয়া হলেও হয়। এখন আমি থেকে উত্পন্ন সমাপ্তির ফাইল কপি করা /tmpথেকে ~/.bash_completionএবং ম্যানুয়ালি তার শুরু প্রাসঙ্গিক যোগ source /usr/share/bash-completion/completions/এন্ট্রি (আলাদাভাবে জন্য apt-getএবং apt-cache- apt-{cache,get}কাজ করে না)।
জামাদগনি

4

জেনারিকভাবে / প্রোগ্রামগতভাবে আমার সম্পূর্ণকরণের সমস্ত স্ক্রিপ্টগুলি আমার এলিয়াসগুলির সাথে কাজ করার উপায় আছে?

হ্যাঁ, এখানে সম্পূর্ণ-উলাম প্রকল্প রয়েছে যা আপনার সমস্যার ঠিক সমাধান করে। এটি ব্যবহার না করে জেনেরিক এবং প্রোগ্রাম্যাটিক ওরফে পরিপূর্ণতা সরবরাহ করে eval


2

যারা এটি খুঁজছেন তাদের জন্য এটি ম্যানুয়াল উপায়।

প্রথমে আসল সমাপ্তি কমান্ডটি সন্ধান করুন। উদাহরণ:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

এখন এগুলি আপনার স্টার্টআপ স্ক্রিপ্টে যুক্ত করুন (উদাঃ ~ / .bashrc):

# load dynamically loaded completion functions (may not be required)
_completion_loader git

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

উত্স: https://superuser.com/a/1004334

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.