সমতুল্য চিহ্নের পরে স্বতঃপূরণ পাথগুলিতে বাশ সমাপ্তির স্ক্রিপ্ট তৈরি করবেন?


11

আমি একটি বাশ সমাপ্তি স্ক্রিপ্ট তৈরি করতে চাই যা ফর্মটি --argএবং এর আর্গুমেন্টকে স্বীকৃতি দেয় --some-arg=file

এই টিউটোরিয়ালটি এবং এর কয়েকটি উদাহরণ পড়ার পরে /usr/share/bash_completion/completions/, আমি নিম্নলিখিত স্ক্রিপ্টটি লিখেছি (ক্রোমিয়ামের সাথে কিছু পতাকা টাইপ করার সময় বাঁচাতে):

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=file
    if [[ ${cur} == "--"*"=" ]] ; then
        # Removed failures (is my logic OK?)
        return 0
    fi

    # Handle other options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _chromium chromium

আমি এটিতে সংরক্ষণ করেছিলাম ~/bash_completions/chromiumএবং ব্যবহার করে একটি সিমিলিংক তৈরি করেছি sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
তারপরে আমি এটি ব্যবহার করে লোড করেছি . /usr/share/bash_completions/completions/chromium

এখন, আমি দুটি সমস্যা অনুভব করছি:

  • chromium --u<TAB>প্রসারিত হয় chromium --user-data-dir=<SPACE>(আমি স্থান চাই না)
  • পাথ (ডিরেক্টরি এবং ফাইল) আর শেষ হয় না।

আমি কীভাবে এই সমস্যাগুলি সমাধান করতে পারি?


Zsh এ পরিবর্তন করা কোনও বিকল্প?
গিলস 23'6

উত্তর:


11

আমি উভয় সমস্যার সমাধান খুঁজে পেয়েছি!

  1. কোনও স্থান সংযুক্ত না করতে, nospaceবিকল্পটি ব্যবহার করুন । এটা দুইভাবে সম্পাদন করা যেতে পারে:

    • এটি পাস complete:
      complete -o nospace -F _chromium chromium
    • compoptঅন্তর্নির্মিতটি ব্যবহার করুন :
      compopt -o nospace(বিকল্পটি সক্ষম করতে)
      compopt +o nospace(বিকল্পটি অক্ষম করতে)

    আমি এটি gnu.org, 8.7 প্রোগ্রামেবল কমপ্লিট বিল্টিনস-এ বাশ ডকুমেন্টেশনে পেয়েছি

  2. ফাইল সমাপ্তি।
    • পিটার্ফ দিয়ে -fপতাকাটি ব্যবহার করার পরামর্শ দিয়েছিলcompgen । আমি সেই পরামর্শটি অনুসরণ করেছি এবং এটি হিসাবে বাস্তবায়ন করেছি COMPREPLY=( $(compgen -f "$cur") )। এটি দুর্দান্ত কাজ করেছে, যতক্ষণ না আমি স্পেসগুলি সম্বলিত একটি পথটি শেষ করার চেষ্টা করেছি।
      স্ট্যাক ওভারফ্লোতে, আমি এই উত্তরটি পেয়েছি যা সম্পূর্ণরূপে তালিকার ম্যানুয়াল তৈরি করার পরামর্শ দেয় (ব্যবহার না করে compgen)। এই পদ্ধতির ভাল কাজ করে।
    • filenamesরিডলাইনটি বলতে অপশনটি ব্যবহার করুন যে কম্পস্পেক ফাইল নাম উত্পন্ন করে, তাই এটি করতে পারে:
      • যে কোনও ফাইলের নাম-নির্দিষ্ট প্রক্রিয়াজাতকরণ সম্পাদন করুন (যেমন ডিরেক্টরি নামের মধ্যে একটি স্ল্যাশ যুক্ত করা, বিশেষ অক্ষর উদ্ধৃত করা, বা পিছনের স্থানগুলি দমন করা)
      • ফাইলের ধরন ( colored-statsসক্ষম সহ) নির্দেশ করতে বিভিন্ন রঙ ব্যবহার করুন

বাশের স্ট্রিং ম্যানিপুলেশনের সহায়তায় ( ~স্পেসগুলি প্রসারিত করতে এবং ডিল করার জন্য), আমি বাশ সম্পূর্ণ করার স্ক্রিপ্ট তৈরি করেছি যা প্রশ্নে বর্ণিত সমস্ত মানদণ্ড পূরণ করে।

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=
    if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
        compopt -o filenames
        COMPREPLY=(*)
        return 0
    fi
    # Handle --xxxxx=path
    if [[ ${prev} == '=' ]] ; then
        # Unescape space
        cur=${cur//\\ / }
        # Expand tilder to $HOME
        [[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
        # Show completion if path exist (and escape spaces)
        compopt -o filenames
        local files=("${cur}"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
        return 0
    fi

    # Handle other options
    COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
    if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
        # If there's only one option, without =, then allow a space
        compopt +o nospace
    fi
    return 0
}
complete -o nospace -F _chromium chromium

দুর্দান্ত উত্তর, অনেক অনেক ধন্যবাদ। আপনি আমার অনেক সময় সাশ্রয় করেছেন। আমি -fফাইলের পথ সমাপ্তির জন্য স্যুইচ ব্যবহার করেছি , তবে এটি /ডিরেক্টরি থাকলে এটি চরটি সম্পূর্ণ করে না ... যদিও এটি একটি ছোট জিনিস।
জিরি ক্রেমসার

1

সম্পূর্ণ ফাইলের নামের ক্ষণস্থায়ী চেষ্টা -fকরতে compgen

আমি আশঙ্কা করছি বিকল্পগুলির পরে আপনি ফাঁকা স্থানগুলি ছাড়তে পারবেন না, যেহেতু সমাপ্তিটি কীভাবে কাজ করে - এটি যখন একটি অনন্য ম্যাচটি সন্ধান করে এটি সম্পূর্ণরূপে এটি সম্পূর্ণ করে।


পরামর্শ দেওয়ার জন্য ধন্যবাদ -f। আমি চেষ্টা করেছিলাম, তবে এটি স্পেসগুলির সাথে সঠিকভাবে মোকাবেলা করে না: পথটি /tmp/foo barদুটি সমাপ্তি এন্ট্রি /tmp/fooএবং এর ফলাফল bar। অযাচিত সম্পর্কে --arg=<SPACE>: আমি এর সমাধান খুঁজে পেয়েছি এবং এটি নীচের উত্তরে পোস্ট করেছি ।
রব ডব্লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.