বাশ এবং জেডএসএইচ :: মিল বিল্ড টুলের জন্য আপনার নিজস্ব সাধারণ ট্যাব-সম্পূর্ণতা লিখছেন

বাশ এবং জেডএসএইচ :: মিল বিল্ড টুলের জন্য আপনার নিজস্ব সাধারণ ট্যাব-সম্পূর্ণতা লিখছেন

জীবনের শেষ মানের বৈশিষ্ট্যটি আমরা যুক্ত করব তা হ’ল সম্পূর্ণ শব্দের উপর ট্যাব করার সময় সমাপ্তির বিবরণগুলি দেখানোর ক্ষমতা:

উদাহরণস্বরূপ, মিল বিল্ড সরঞ্জামটি এটি করে তাই আপনি যদি কোনও পতাকা বা কমান্ড কী করেন তা নিশ্চিত না হন তবে আপনি টিপতে পারেন <TAB> এটি আরও বিশদ দেখতে:

Compleionsingledescription

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

এই আচরণটি বিরক্তিকর হতে পারে, যদি ব্যবহারকারী বিবরণটি দেখতে চান তবে তাদের প্রথমে প্রয়োজন হবে:

  • টোকেনটি একাধিক পরিপূর্ণতা ম্যাচ করার জন্য পর্যাপ্ত অক্ষর মুছুন

  • টিপুন <TAB>

  • তাদের যত্ন নেওয়া শব্দের বিবরণটি খুঁজে পেতে মুদ্রিত একাধিক সম্পূর্ণতা দৃশ্যত স্ক্যান করুন

  • সমস্ত অনুপস্থিত অক্ষরে ফিরে টাইপ করুন যাতে তারা কমান্ডটি চালাতে পারে

এটি সমাধান করার জন্য, টোকেন ইতিমধ্যে একটি সম্পূর্ণ শব্দ হলেও আমরা ট্যাব-সমাপ্তির বিবরণ মুদ্রণ করতে বাশ এবং জেডএসএইচ হ্যাক করতে পারি। আমরা টোকেনটি একটি সম্পূর্ণ শব্দ কিনা তা যাচাই করে এটি করি এবং যদি তাই হয় তবে দ্বিতীয় “ডামি” সমাপ্তি যুক্ত করা হয়: এটি ট্যাব-সমাপ্তিকে অস্পষ্ট করে তোলে, যা ব্যবহারকারীকে দেখার জন্য পরিপূর্ণতা এবং বিবরণগুলি মুদ্রণ করতে বাশ এবং জেডএসএইচ।

এটি করা _complete_foo_bash নিম্নলিখিত মত মনে হচ্ছে:

_complete_foo_bash() {
  local IFS=$'\n'
  local raw=($(_generate_foo_completions "$COMP_CWORD" "${COMP_WORDS(@)}"))
  local trimmed=()
  trimmed+=( "${raw(@)}" )

  if (( ${#raw(@)} == 1 )); then
    trimmed+=( "${raw(0)%%:*}" )
  fi

  COMPREPLY=( "${trimmed(@)}" )
}

পরিবর্তে দৈর্ঘ্য পরীক্ষা করা raw আমরা একটি ছাঁটাই করা এবং অ-ট্রিমড লাইন যুক্ত করি কিনা তা সিদ্ধান্ত নিতে trimmedআমরা এখন পরিবর্তে সর্বদা সমাপ্তির বিবরণ ধারণ করে এমন নন-ট্রিমড লাইনগুলি যুক্ত করুন এবং যেখানে কেবলমাত্র একটি লাইন রয়েছে আমরা তখন বিবরণটি ছাঁটাইয়ের সাথে একটি অতিরিক্ত শব্দ-সম্পূর্ণ সমাপ্তি যুক্ত করি।

এর অর্থ হ’ল সমস্ত পরিপূর্ণতা অস্পষ্ট এবং বিবরণটি মুদ্রণ করবে – এমনকি একক বাস্তব পছন্দ সহ সম্পূর্ণতা – তবে অতিরিক্ত ছাঁটাই করা রেখাটি যখন কেবলমাত্র 1 টি আসল পছন্দ থাকে তখন নিশ্চিত করে যে বিবরণ পাঠ্যটি কখনই ব্যবহারকারীর কমান্ডে সন্নিবেশিত হয় না

জেডএসএইচ -তে, এটি একইভাবে এর মাধ্যমে করা যেতে পারে:

_complete_foo_zsh() {
  local -a raw trimmed
  local IFS=$'\n'
  raw=($(_generate_foo_completions "$CURRENT" "${words(@)}"))

  for d in $raw; do trimmed+=( "${d%%:*}" ); done
  if (( ${#raw} == 1 )); then
    trimmed+=( "${raw(1)}" )
    raw+=( "${trimmed(1)}" )
  fi

  compadd -d raw -- $trimmed
}

এখানে পরিবর্তনটি উপরের বাশ স্নিপেটের অনুরূপ: যখন পরিপূর্ণতার সংখ্যা 1 হয়, আমরা এটিকে অস্পষ্ট করার জন্য একটি অতিরিক্ত সমাপ্তি যুক্ত করি তাই জেডএসএইচ বিবরণটি প্রিন্ট করে। তবে কারণ জেডএসএইচ বর্ণনা এবং টোকেনগুলির দুটি সমান্তরাল অ্যারে পাস করার প্রত্যাশা করে compaddআমাদের if ব্লক উভয়ের সাথে আইটেম সংযোজন করা দরকার trimmed এবং raw

এটি ব্যবহার করে, এটি এখন দেখতে দেখতে

$ foo apple<TAB>
apple                  apple: a common fruit

যদিও ইউআই বেশ নিখুঁত নয় – শব্দটি apple দু’বার সদৃশ হয়ে যায় – তবুও এটি ব্যবহারকারীদের অনুমতি দেওয়ার মূল লক্ষ্য অর্জন করে <TAB> এই শব্দের জন্য বিবরণ বা ডকুমেন্টেশন দেখতে ইতিমধ্যে সম্পূর্ণ পতাকা বা কমান্ডে।

Source link