কীভাবে বাশ ডিরেক্টরি নাম সম্পূর্ণ করে কনফিগার করা সম্ভব?


8

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

এটা কি আদৌ সম্ভব? আপনি কীভাবে এটি বাস্তবায়ন করবেন?

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

cp $$patern + <Tab>

এবং অটোজাম্প সম্পূর্ণ হবে

cp /home/user/CompliCatedDireCTOry/long/path/bla/bla

এবং যেখানে আপনি ফাইলটি রাখতে চান সেখানে আপনাকে যুক্ত করতে হবে। অবশ্যই আমি অটের মন্তব্যটি কয়েকটি নির্দিষ্ট আদেশে যুক্ত করতে ব্যবহার করতে পারি, তবে কারও যদি আরও ভাল ধারণা থাকে তবে আমি খুব কৃতজ্ঞ হব।


ব্যাশ ম্যান পৃষ্ঠাতে "প্রোগ্রামেবল সম্পূর্ণ" বিভাগটি দেখুন।

আপনি যদি আমার প্রশ্ন বন্ধ করতে ভোট দেন, দয়া করে কেন তা ব্যাখ্যা করুন।
পেলটিয়ার

2
আপনার সম্পূর্ণ ফাংশনটি কল করার জন্য "সম্পূর্ণ" টি আপনার সাথে মিলিত হতে "-জি প্যাটার্ন" সমর্থন করে এবং এটির জন্য এক বা একাধিক কমান্ডের নাম প্রয়োজন।

কেন শুধু পরিবেশের পরিবর্তনশীল ব্যবহার করবেন না? উদাহরণস্বরূপ: সিপি $ উপসর্গ / ফাইল / পাথ / থেকে /
গন্তব্য

@ এক্সানোএকটিভ: কারণ অটোজাম্প সম্পূর্ণ স্বয়ংক্রিয়ভাবে তৈরি, এবং একাধিক পথে কাজ করে। ম্যানুয়ালি সেট পরিবেশের ভেরিয়েবলগুলি ব্যবহার করা কোনও উপকারে আসে না। অথবা আপনার একটি শক্তিশালী ধারণা থাকতে পারে যা আমি বুঝতে পারি না?
পেলটিয়ার

উত্তর:


3

আপনি এটি ট্যাবের (^ i) জন্য ডিফল্ট বাইন্ডিংকে ওভাররাইড করে করতে পারেন। প্রথমে আপনাকে টিএবি বাইন্ডিংকে ওভাররাইড করতে হবে, তারপরে আপনাকে এমন একটি ফাংশন তৈরি করতে হবে যা আপনার কমান্ডকে ডেকে আনে, শেষ অবধি আপনাকে সেই কমান্ড থেকে আউটপুট নিতে হবে এবং বর্তমান কমান্ড লাইনযুক্ত ভেরিয়েবল আপডেট করতে হবে।

এই ফাংশনটি বর্তমান কমান্ড লাইন নেয় এবং শেষ দুটি অক্ষরকে 'হাগস' এ পরিবর্তন করে।

function my_awesome_tab_completion_function () {
  set -- $READLINE_LINE
  command="$1"
  shift
  argument="$*"
  argument_length=$(echo -n $argument | wc -c)
  if echo $argument | grep '^$$' >/dev/null 2>&1; then
    new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
  else
    new_argument=$(compgen -d $argument)
  fi
  new_argument_length=$(echo -n $new_argument | wc -c)
  READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
  READLINE_LINE="$command $new_argument"
}

আপনার উদাহরণের জন্য আপনি সম্ভবত এটি দেখতে নতুন_আরগ্রুমেন্ট লাইনটি পরিবর্তন করতে চান:

  new_argument=$(autojump $argument)

এখন b i বাইন্ডিংকে ওভাররাইড করুন:

$ bind -x '"\C-i"':'my_awesome_tab_completion_function'

এখন পরীক্ষা করুন যে এটি কাজ করে:

$ cd /ro<TAB>
changes my command to:
$ cd /root

তাই সাধারণ সমাপ্তি এখনও কাজ করে, আপনি সিডি $$ ... ইত্যাদি করে $$ অংশটি পরীক্ষা করতে পারেন

আপনি যদি সমস্যাগুলিতে চালিত হন তবে ভারবোজ মোড চালু করুন:

$ set -x

এটি ফাংশনটি যা করছে তা মুদ্রণ করবে।

আমি এটি উবুন্টু 11 এ ব্যাশ 4.2.8 (1) -রিলিজ (ডিফল্ট) ব্যবহার করে পরীক্ষা করেছি।


আমার কাছে মনে হয় এটি কেবল কমান্ডের প্রথম প্যারামিটারে কাজ করে এবং যদি ট্যাবটি অপ্রত্যাশিত উপায়ে ব্যবহার করা হয় (উদাহরণস্বরূপ $$$ এর পরে বা কমান্ডের নাম পরে), বা আমি ভুল করছি?
harrymc

ঠিক আছে এটি $ * পেরিয়ে যাচ্ছে সুতরাং এটি প্রথম প্যারামিটারের চেয়েও বেশি 'কাজ করবে' (আমি অটোজাম্প মোটেও জানি না তাই আমি নিশ্চিত নই যে এটি একাধিক যুক্তি নিতে পারে কিনা)। আপনি শেষের দিকে চলে যেতে পারেন এবং কেবল সর্বশেষটি অটোজাম্পে প্রেরণ করতে পারেন বা কমান্ড আর্গুমেন্টগুলির মধ্যে কার্সারটি কোথায় তা নির্ধারণ করতে এবং READLINE_POINT ব্যবহার করে অটোজাম্পে কেবল 'শব্দ' প্রেরণ করতে পারেন।
বহুবর্ষীয়

আপনার সমাধানটি আকর্ষণীয়, তবে আপনাকে স্বীকার করতে হবে যে ট্যাব কীটি গ্রহণ করা কিছুটা চরম। এমন কোনও উপায় নেই যা আপনি সম্ভাব্য সমস্ত ক্ষেত্রে অনুমান করতে পারেন।
harrymc

আপনার উত্তরের জন্য ধন্যবাদ, এটি একটি দুর্দান্ত বিকল্প সমাধান, এবং এটি আমার প্রশ্নের "সমস্ত আদেশের জন্য" সম্বোধন করে। আমি হ্যারিমিকের সাথে একমত যে এটি কিছুটা চরম, যদিও ... আমি অনুমান করি যে কেউ যদি আরও ভাল সমাধান না নিয়ে আসে তবে আমি এটিকে চেষ্টা করে দেখব এবং এটি ব্যবহারযোগ্য কিনা।
পেলটিয়ার

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

1

ব্যাশ সমাপ্তির রুটিন শেল স্ক্রিপ্ট হিসাবে প্রোগ্রাম করা যেতে পারে।

এখানে শেল-স্ক্রিপ্টের উদাহরণ রয়েছে যা কোনও প্যারামিটার $$[Tab]দ্বারা প্রতিস্থাপন করবে my replacement stringতবে কেবলমাত্র নির্দিষ্ট কমান্ডের জন্য mycommandএবং প্যারামিটারটি ঠিক "$$" হলে:

_mycomplete()
{
        if [ ${COMP_WORDS[COMP_CWORD]} == \$\$ ]
        then
                COMPREPLY='my replacement string'
        fi
}
complete -o default -o bashdefault -F _mycomplete mycommand

source <file-name>এটিকে কাজ শুরু করার জন্য আপনাকে অবশ্যই স্ক্রিপ্টটি উত্সাহিত করতে হবে (বা ডট কমান্ড) এর মাধ্যমে এবং তারপরে:

mycommand $$[Tab] -> mycommand my replacement string
mycommand $$$[Tab] -> mycommand $$$ (beep)
mycommand whatever[Tab] -> (will complete "whatever" in the normal bash manner)

কিছু বা সমস্ত ব্যবহারকারীর জন্য এটি সর্বদা কাজ করার জন্য এটি কোনও ব্যাশ প্রোফাইল রুটিনে অন্তর্ভুক্ত করুন

completeকমান্ডের সমস্যাটি হ'ল এটি কেবলমাত্র এক বা একাধিক কমান্ডের জন্য কাজ করবে যা পরামিতি হিসাবে নির্দিষ্ট করা হয়েছে। এটির দ্বারা কমান্ডগুলি সম্ভবত ব্যবহারকারীর দ্বারা ব্যবহৃত হতে পারে বা মরিয়া ক্ষেত্রে প্রসারিত হতে পারে এমন সমস্ত কমান্ডের তালিকা দেওয়া যেতে পারে /bin/* /usr/bin/* ~/bin/*

CentOS 5.5 এ পরীক্ষা করা হয়েছে।

এই সহজ স্ক্রিপ্টটি আমার অন্যান্য উত্তরে আমি যে উত্সগুলি তালিকাভুক্ত করেছি তার উপর ভিত্তি করে - এটি একটি যা মডারেটর স্টুডিওহ্যাক মুছে ফেলেছিল। আগ্রহী হলে, কেবল এটি মুছে ফেলতে বলুন।


আপনার উত্তরের জন্য ধন্যবাদ. আমার প্রশ্নটি সত্যই ছিল না যেহেতু আমি নতুন হওয়ায় এটি সম্ভব হয়েছিল, তবে সমস্ত কমান্ড সম্পূর্ণ করবে না। তবে আমি মনে করি যে বহুবর্ষের সমাধানটি যদি গ্রহণযোগ্য না হয় তবে আমি এরকম কিছু বাস্তবায়ন করব এবং সর্বাধিক সাধারণ কমান্ডগুলি লক্ষ্য করার চেষ্টা করব।
পেলটিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.