বাশ সম্পূর্ণকরণে প্যাটার্নটি কীভাবে যুক্ত করবেন (আনজিপ করার জন্য)?


12

আমি যখন টাইপ করি

unzip <tab>

আমি শেষ হওয়া সমস্ত ফাইলের একটি তালিকা পেয়েছি .zip, যা unzipকমান্ডের জন্য ট্যাব সমাপ্তির মানক আচরণ ।

যাইহোক, আমি unzipতালিকার ফাইলগুলির জন্য ফাইলগুলি .udpছাড়াও শেষ হওয়া বাশ করতে চাই .zip। আমি কীভাবে আমার স্থানীয় ক্ষেত্রে এই আচরণটি অর্জন করতে পারি .bashrc?

উত্তর:


23

মন্তব্য করার পরিবর্তে…


complete -f -X '!*.@(zip|udp)' unzip

জন্য সম্পূর্ণ করা উচিত

-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files

অন্য কথায়: সম্পূর্ণ ফাইল এবং মুছে ফেলুন সব শেষ হওয়া না .zipবা .udp


অতিরিক্ত

আপনি যোগ তাহলে -o defaultসমাপ্তির সম্পন্ন / ম্যাচ হবে সব ফাইল ও ডিরেক্টরিগুলি আছে যদি কোন শেষ হওয়া ফাইল .zipবা .udp

আপনি যদি সংযোজন যোগ করেন -o plusdirsতবে ফাইলগুলির কোনও ম্যাচ বা শেষ হওয়া ছাড়াও কোনও ডিরেক্টরি যুক্ত করবে ।.zip.udp

বর্তমান

আপনি যখন ব্যবহার করেন complete -p unzipআপনি বর্তমান প্যাটার্ন পান।

আপনার মন্তব্যগুলি থেকে এটি বেশিরভাগই মনে হচ্ছে আপনি নিখুঁত +বা @প্যাটার্নে নিখোঁজ রয়েছেন :

# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @

যা অর্থ হবে মেলে যেকোনো ফাইল আক্ষরিক শেষ হওয়া.(zip|udp) । যেমন

touch 'file_test.(zip|udp)'

ম্যানুয়ালটির এই বিভাগটি দেখুন:

এটি সম্ভব যেমন extglobযেমন সক্ষম নয়। এর দ্বারা সক্ষম করুন:

shopt -s extglob

shoptপ্রবেশ করে সমস্ত সেটিংসের বর্তমান অবস্থা পরীক্ষা করুন :

shopt

ক্রিয়া

যদি এর -F somethingঅর্থ হয় এটি পরিপূর্ণতার তালিকা তৈরি করতে কিছু নামের একটি ফাংশন ব্যবহার করে ।

_filedir_xspecসাধারণত ডেবিয়ান ফাংশন। আপনার কাছে এরকম কিছু থাকতে পারে:

$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion

যার অর্থ /usr/share/bash-completion/bash_completionসোর্স করা। এখানে আপনি প্রশ্নে ফাংশন পাবেন । আরও কয়েক লাইন নীচে আপনি দেখতে পাবেন যে এই ফাংশন / সমাপ্তি _install_xspecউদাহরণস্বরূপ নামের একটি ফাংশন দ্বারা যুক্ত হয়েছে :

_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo

ম্যানুয়াল এন্ট্রি:


মন্তব্য 1 আপডেট করুন:

- অবৈধ সংরক্ষণাগার বা ফাইল অনুমতিগুলির কারণে কোনও মিল নেই।

এটি ফলাফল প্রভাবিত করা উচিত নয়। completeশুধুমাত্র বিধি দ্বারা প্রদত্ত ফাইলগুলির সাথে মেলে এবং ফাইলগুলির কোনও প্রসেসিং করেন না। আপনি যদি তাদের সাথে তালিকাভুক্ত করতে পারেন তবে তাদের lsমিলানো উচিত।

পার্শ্ব নোট হিসাবে একটি সম্পূর্ণ ফাংশন ব্যবহার করে এই জাতীয় কার্যকারিতা যুক্ত করতে পারে :

function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}

complete -F _unzip_validated unzip

- রঙ কেন lsপার্থক্য test.zipকরে test.upd?

এটি প্রভাবিত করে না complete। দ্বারা রঙ lsসরবরাহ করা হয় $LS_COLORS। চেষ্টা করুন:

echo "$LS_COLORS" | tr : '\n' | sort

আপনার এমন কিছু দেখতে পাওয়া উচিত *.zip=01;31যার অর্থ:

*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension

*.udp অন্যদিকে এর সাথে কোনও এন্ট্রি যুক্ত নেই, তাই রঙিন নয়।


পরবর্তী পদক্ষেপ (প্রথম হওয়া উচিত ছিল)

  1. টার্মিনাল খুলুন এবং পরীক্ষার ফাইল সহ একটি ডিরেক্টরিতে যান। .Zip এবং .udp উভয়ই
  2. প্রবেশ করান bash --norc
  3. প্রবেশ করান complete -f -X '!*.@(zip|udp)' unzip
  4. প্রবেশ করান shopt -s extglob
  5. প্রবেশ করান unzip <tab><tab>

ফলাফল?

এছাড়াও, আপনার প্রশ্নের নীচে সম্পাদনা ক্লিক করুন এবং এর আউটপুট যুক্ত করুন:

bind -V
shopt
env

সহায়ক হতে পারে।


আপনার দুর্দান্ত এবং দীর্ঘ বিবরণের জন্য আপনাকে অনেক ধন্যবাদ, তবে এখনও এটি কার্যকর হয় না। complete -p unzipফলন দেয় complete -f -X '!*.@(zip|udp)' unzipএবং unzip <tab>ফাইলটি সম্পূর্ণ করে test.zip। তবে ডিরেক্টরিতে নামের test.updমতো একটি ফাইল রয়েছে যা ট্যাব সমাপ্তির দ্বারা খুঁজে পাওয়া যায় না unzip। ফাইল অনুমতিগুলির সত্যতা বা ফাইলটির শূন্য দৈর্ঘ্য সম্ভবত এই অদ্ভুত আচরণটি ব্যাখ্যা করে?
অ্যালেক্স

@ অ্যালেক্স: খালি এবং বৈধ উভয় ফাইলের পাশাপাশি একই সাথে যেগুলির অনুমতি নেই এমন ফাইলগুলিতে সম্পূর্ণ হওয়া উচিত। আপনি যদি এটি কোনও পরীক্ষার স্ক্রিপ্টে যোগ করেন তবে কি একই আচরণ? উদাহরণস্বরূপ 1. কার্যকর পরীক্ষা সহ কিছু পরীক্ষার স্ক্রিপ্ট:, ~/bin/testing2. complete -f -X '!*.@(zip|udp)' testing, 3. testing <tab><tab>?
রানিয়াম

@ অ্যালেক্স: আপনি আউটপুট দিয়ে কিউ আপডেট করতে পারবেন shopt
রানিয়াম

extglobসচল. 'টেস্টিং' সহ উদাহরণটি কেবল zipফাইলটি আবার নির্বাচন করে । আমি লক্ষ্য করেছি যে test.zipলাল রঙে দেখানো হয়েছে, যখন test.updসাদা বর্ণের সাথে দেখানো হয়েছে ls -l, উভয় ফাইলই একই অনুমতি, খালি মালিক এবং গ্রুপ সমিতি দ্বারা খালি রয়েছে। কেন lsপার্থক্য test.zipকরে test.upd? আমার সমস্যাটি হতে পারে এটি ইঙ্গিত?
অ্যালেক্স

@ অ্যালেক্স: একটি আপডেট যুক্ত হয়েছে।
রানিয়াম

3

যে ফাইলটি /etc/bash_completionআপনি সম্ভবত কোথাও bashস্রোস করছেন, ডিফল্ট সম্পূর্ণ হওয়া কমপক্ষে আমার (v4.2.25) সংস্করণটির জন্য

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo

সম্পূর্ণ এক্সপ্রেশনটি এ পরিবর্তন করার চেষ্টা করুন

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo

এবং আপনার যোগ করুন .bash_profile


এটি আমার সমস্যার সমাধান করে না। যদি আমি এটি করি এবং এটি উত্স করি unzip <tab>তবে ফাইলগুলি বা অন্য ফাইলগুলি খুঁজে পাবে .zipনা .upd
অ্যালেক্স

ট্যাব দু'বার আঘাত করার চেষ্টা করুন , দেখুন এটি কোনও আলাদা কিনা। অন্যান্য পরিপূর্ণতা প্রত্যাশার মতো কাজ করে? উদাহরণস্বরূপ gzipসঙ্গে .gzফাইল?
বিএসডি

দু'বার ট্যাব মারলে কোনও পরিবর্তন হয় না। ব্যবহার gunzipসঙ্গে .gzফাইলগুলি কেবল শেষ হওয়া ফাইল নির্বাচন .gzকিন্তু সংজ্ঞা এছাড়াও আলাদা: complete -F _filedir_xspec gunzip
অ্যালেক্স

আপনি ফাইল সোর্স না /etc/bash_completionআপনার .bashrc?
বিএসডি

চেষ্টা করুনshopt -s extglob
এডওয়ার্ড ফ্যাল্ক

2

আপনার .bashrc এ এই লাইনটি যুক্ত করার চেষ্টা করুন:

complete -f -o default -X '!*.+(zip|udp)' unzip

এই পরামর্শের সাথে মনে হচ্ছে আমি .udpফাইলগুলি খুঁজে পাব , তবে কেবলমাত্র কোনও .zipফাইল উপস্থিত না থাকলে। বর্তমান ডিরেক্টরিতে যদি একটি test.zipএবং test.udpফাইল উপস্থিত থাকে তবে unzip <tab>কেবলমাত্র .zipফাইলটি তালিকাভুক্ত করে । আমি উভয় ফাইল দেখতে আশা করব (অর্থাত্ বাশ সম্পূর্ণতা দেবে test.)।
অ্যালেক্স

তুমি কি নিশ্চিত? আমি আমার ব্যাশে পরীক্ষা করেছিলাম এবং আমি উভয় udpএবং zipফাইল খুঁজে পেয়েছি বলে মনে হচ্ছে । আপনি .bashrcলাইন যোগ করার পরে উত্স ?
এম কে সি

আমি একটি নতুন টার্মিনালে পুনরাবৃত্তি করেছি, এবং এখন unzip <tab>সমস্ত ফাইল তালিকাভুক্ত করেছি, এমনকি একটি পৃথক বাক্যাংশে শেষ হওয়া ফাইলগুলি। এখন বেশ আমার যা প্রয়োজন।
অ্যালেক্স

অদ্ভুত .. আমি জিএনইউ ব্যাশ সংস্করণ 4.2.25 চালাচ্ছি এবং প্রত্যাশার মতো কাজ করি। আপনি বাশের কোন সংস্করণ চালু করছেন?
এমকেসি

আপনি দুটি পৃথক লাইন যুক্ত করার চেষ্টা করতে পারেন: complete -f -o default -X '!*.zip' unzipএবংcomplete -f -o default -X '!*.udp' unzip
এমকেসি

1

_filedir"কাঁচা" এর পরিবর্তে আরও ভাল ব্যবহার complete

আত্মপক্ষ সমর্থন

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • টিলডে ( ~) পাথ প্রসারিত হচ্ছে
  • ডিরেক্টরিগুলির জন্য উপসর্গগুলি মুছে ফেলা হয়, উদাহরণস্বরূপ /home/tux/Do<TAB><TAB>, আপনি যে জবাব হিসাবে পান সেই তালিকাটি '/ home / tux' মুছে ফেলে এবং আরও অনেক কমপ্যাক্ট হয়
  • কার্যকর করা আরও সহজ এবং আরও ব্যর্থতা

MWE

_unzip_completor()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    _filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.