মোড়ক ফাংশন আর্গুমেন্ট এবং বিদ্যমান কমান্ডের জন্য কীভাবে zsh স্ব-সম্পূর্ণকে একত্রিত করবেন


40

আমি বেশিরভাগ gvim এবং অনেক টার্মিনালে কাজ করি। মূলত, আমি আমার সমস্ত ফাইল একক ভিমে উদাহরণে খুলতে পছন্দ করি। সে লক্ষ্যে আমি বর্তমান 'ভিআইএম সার্ভারে' আমার টার্মিনালগুলি থেকে ফাইলগুলি খুলতে একটি উপনাম ব্যবহার করেছি।

alias rv="gvim --remote-silent"

তবে একাধিক প্রকল্পের একাধিক প্রকল্পের একাধিক ফাইল খোলা থাকলে আমার উত্পাদনশীলতা ক্ষতিগ্রস্থ হয়, তাই আমি আমার উপন্যাসটি একটি ফাংশনে আপগ্রেড করছি।

# main function
rv() {
    local args options server

    options=$(getopt -o hils:t: -l "help,info,list,set:,target:" -- "$@")

    if [[ $? -ne 0 ]]; then
        echo "Failed to parse options."
        return 1
    fi

    # a little magic, necessary when using getopt
    eval set -- "$options"

    # go through the options with a case and use shift to analyze one option at a time.
    while true; do
        case "$1" in
            -h|--help)
                echo "Usage: $0 [-hil] [--help] [--info] [--list]";
                echo "       $0 {-s | --set} <name> [<file1 file2...>]";
                echo "       $0 {-t | --target} <name>] <file1 file2...>";
                return 0;;
            -i|--info)
                gvim_show_info;
                return 0;;
            -l|--list)
                gvim_list_servers;
                return 0;;
            -s|--set)
                gvim_set_server_name ${2:u};
                shift 2;;
            -t|--target)
                server="$2";
                shift 2;;
            --)
                shift;
                break;;
        esac
    done

    if [[ "$#" -eq 0 ]]; then
        # if no files specified...
        if [[ -n "$server" ]]; then
            # throw error if --target option was specified.
            echo "Error!  --target requires one or more filenames."
            return 1;
        fi
    else
        # if files were specified...
        if [[ -n "$server" ]]; then
            # if --target was specified
            gvim_run_remote $server "$@"
        else
            gvim_run_remote $(gvim_get_default_server) "$@"
        fi
    fi

    return 0;
}

এখন এই নতুনটির rvনিজস্ব বিকল্প রয়েছে। আমি এটি ব্যবহার করতে পারি:

  • ভিএম সার্ভার উপলব্ধ তালিকা (-l --list)
  • বর্তমান শেল (-s --set) এর জন্য ডিফল্ট ভিএম সার্ভার সেট করুন
  • ডিফল্ট ভিএম সার্ভার (-i --info) দেখান
  • একটি নির্দিষ্ট ভিএম সার্ভারে ফাইলগুলি খুলুন (-t --target)
  • ডিফল্ট ভিএম সার্ভারে ফাইলগুলি খুলুন: rv files...

তবে, যেহেতু আমি rvএকটি উলামের পরিবর্তে কোনও ফাংশন ব্যবহার করছি , তাই আমি পূর্বে উপভোগ করা zsh সমাপ্তিটি হারাব। আমি একটি সমাপ্তি ফাংশন তৈরি করে পড়েছি _rv, যা rvএর বিকল্পগুলি দেখায় , তবে আমি আমার সম্পূর্ণ করার বিকল্পগুলি বিদ্যমান ভিআইএম সমাপ্তির বিকল্পগুলির সাথে একত্রিত করতে চাই। আমি সেখানে কিছু দ্বন্দ্ব হতে পারে জানি rvএর -sএবং vimএর -s, কিন্তু আমি চিন্তা আমি এইরূপ সূচারূভাবে যে সব ব্যবস্থা করতে সক্ষম --বিভাজক।

TLDR; সুতরাং, আমি কীভাবে একটি সমাপ্তি স্ক্রিপ্ট তৈরি করব যা _argumentsউভয়ের _rvএবং উভয়ের বিকল্পগুলিকে একত্রিত করে _vim? আমি এতে _vimযুক্তি তালিকার কপি-পেস্ট করার পরিবর্তে পুনরায় ব্যবহার করতে পছন্দ করি _rv

এই আমার _rvআপডেট হয়েছে 2014/6/10 16:10

#compdef rv

_rv() {
    typeset -A opt_args
    local alternatives

    alternatives=(
        'args:rv options:_rv_options'
        'files:file:_vim_files'
    )

    _alternative $alternatives && return 0

    return 1
}

_rv_options() {
    local arguments

    arguments=(
        '(-i -l -s -t --info --list --set --target)'{-h,--help}'[Print usage info.]'
        '(-h -l -s -t --help --list --set --target)'{-i,--info}'[Print default vim server. As stored in $GVIM_SERVER.]'
        '(-i -h -s -t --info --help --set --target)'{-l,--list}'[Print list of existing vim servers.]'
        '(-i -h -l -t --info --help --list --target)'{-s,--set}'[Set default vim server for the current shell.]:vim servers:_rv_vim_servers'
        '(-i -h -l -s --info --help --list --set)'{-t,--target}'[Open files in a particular vim server.]:vim servers:_rv_vim_servers'
        )

    _arguments -s -C $arguments && return 0

    return 1
}

_rv_vim_servers() {
    local -a servers
    servers=( ${(f)"$(_call_program servers vim --serverlist 2>/dev/null)"} )
    _wanted servers expl server compadd -M 'm:{a-z}={A-Z}' -a servers && return
}

# invoke the completion command during autoload
_rv "$@"

বর্তমান আচরণ

বর্তমানে _rvসমাপ্তি ব্যবহারযোগ্য, তবে আদর্শ নয়।

  • আমি যখন টাইপ করি rv <TAB>, আমি ভিম বিকল্পগুলি দেখতে পাই না। কেবল আরভি বিকল্প এবং ফাইলের পাথ প্রদর্শিত হয়। _vimআমার জন্য ফাইলের পথগুলি সমাপ্ত করছে, তাই হুর!
  • আমি যখন টাইপ করি তখন আমি rv -s <TAB>ভিএম সার্ভারের তালিকা দেখতে পাই তবে ফাইলের পাথগুলিও প্রদর্শিত হয়। কমান্ডের এই মুহুর্তে কোনও ফাইল অনুমোদিত নয় এবং স্বতঃপূরণে উপস্থিত হওয়া উচিত নয়।

প্রত্যাশিত আচরণ

  • আমি যখন টাইপ করি rv <TAB>, তখন আমি প্রত্যাশা করি: 1) আরভি বিকল্পগুলি, 2) ভিআইএম অপশনগুলি, 3) ফাইল পাথের তালিকা
  • আমি যখন টাইপ করি rv -s <TAB>, তখন আমি প্রত্যাশা করি: 1) ভিম সার্ভারের নামগুলি (প্রদত্ত হিসাবে) _rv_vim_servers
  • আমি যখন টাইপ করি তখন আমি rv /valid/file/path/<TAB>কেবলমাত্র একটি ফাইলের পথের তালিকা দেখতে আশা করি। যেহেতু _vimইতিমধ্যে এই ক্ষমতা রয়েছে, তাই আমি এটির উপর নির্ভর করতে পছন্দ করব।


1
compdefএকটি -nবিকল্প রয়েছে যা বলে যে এটি "কমান্ড বা প্রসঙ্গের জন্য ইতিমধ্যে সংজ্ঞায়িত কোনও পরিপূর্ণতা ওভাররাইট হওয়া থেকে বাধা দেয়"। তো, আপনি কি compdef _vim rvঅনুসরণ করার চেষ্টা করেছেন compdev -n _rv rv?
Lqueryvg

3
২৮ টি উক্তি এবং কোন উত্তর নেই ... এবং এটি জেডএস সম্পর্কে একটি প্রশ্ন ... আমি আপনার জন্য @ স্টাফেনচাজেলাসকে আহ্বান করার চেষ্টা করব ^^ (আমি এটির অপব্যবহার করার চেষ্টা করব না, তবে এটি মজাদার Please এটি করুন ... এবং আমি এটি মুছে ফেলব এবং এটি আর কখনও করব না) ... এখানে যদি কেউ উত্তরটি জানতে পারে তবে তার হওয়া উচিত
অলিভিয়ার ডুলাক

1
@ অলিভিয়ারডুলাক আমি মনে করি আপনি ইতিমধ্যে থ্রেডটিতে পোস্ট করেছেন তবে আপনি কেবল বিজ্ঞপ্তিগুলি পেয়েছেন। (সদৃশ নামগুলি অনুমোদিত, তাই এটি বোঝা যায়)) যদিও আপনি সম্ভবত তাকে আড্ডায় খুঁজে পেতে পারেন।
স্পারহাক

মূল _vim ফাইলটি উত্স করা সম্ভব ছিল , তবে এটি করার আগে _argumentsএকটি কাস্টম স্থানীয় ফাংশন দিয়ে ফাংশনটি ওভাররাইট করা উচিত ? এটি করে আপনি আর্গুমেন্টগুলি থেকে পাবেন _vim। হতে পারে একটি পৃথক zsh প্রক্রিয়া সহ।
রাফেল অ্যারেনস

উত্তর:


1

আমি খুঁজে পেয়েছি / usr / শেয়ার / zsh / ফাংশন / সমাপ্তি / ইউনিক্স / _ গিট যা এর মতো অন্যান্য এলিয়াসগুলির জন্য কিছু টিপস পেয়েছিল এবং এই ফাংশনগুলি এলিয়াসগুলির জন্য সংজ্ঞা দিয়ে শেষ করেছিল:

_git-ls () {
  # Just return the _git-ls-files autocomplete function
  _git-ls-files
}

তারপরে, একটি সোজা কমপেড জি = গিট করুন। স্বতঃসম্পূর্ণ সিস্টেম দেখতে পাবে যে আপনি চলছে, উদাহরণস্বরূপ, g ls এবং _git-ls স্বতঃসিদ্ধ ফাংশনটি ব্যবহার করুন।

যেমন এখানে পাওয়া যায়


ধন্যবাদ, তবে বেশ নয় আপনার সমাধান ধরে নিচ্ছে আমি কেবল এর থেকে স্বয়ংক্রিয় সম্পূর্ণ চাই _git-ls-files। এই প্রশ্নের git-lsনিজস্ব বিকল্পগুলি সহ একটি (আপনার সম্মেলনের সাথে লেগে থাকার জন্য) রয়েছে এবং সেগুলির কয়েকটি বিকল্পের সাথে ওভারল্যাপ হয় git-ls-files। সমস্ত বিকল্পের জন্য স্বতঃপূরণ লেখার পরিবর্তে, git-lsআমি কীভাবে একটি স্বতঃপূরণ লিখব _git-ls-filesযা (যেটি 90% বলবে) থেকে স্বতঃপূরণ গ্রহণ করে এবং সেগুলিকে বাকী (10% বলুন) বিকল্পগুলির স্বতঃপূরণের সাথে সংযুক্ত করে?
জাস্টিন সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.