Zsh এ avfs জাল ডিরেক্টরি সম্পূর্ণ করা le


37

কিছু পরিস্থিতিতে "জাল" ফাইলগুলি সম্পূর্ণ করার জন্য আমি কীভাবে zsh এর সমাপ্তির সিস্টেমটি টুইঙ্ক করতে পারি?

আরও সুনির্দিষ্টভাবে বলা যায় যে, এভিএফএস ফাইল সিস্টেম প্রতিটি সংরক্ষণাগারের পাশে একটি "জাল ডিরেক্টরি" তৈরি করে সংরক্ষণাগারগুলি ডিরেক্টরি হিসাবে প্রকাশ করে exp ডিফল্টরূপে, এটি সম্পূর্ণ ডিরেক্টরি হায়ারার্কিকে এর মাউন্ট পয়েন্টের নীচে প্রতিলিপি করে ~/.avfs। এছাড়াও ~/.avfsআর্কাইভ ফাইলের /tmp/foo.zipপাশাপাশি প্রতিটি সংরক্ষণাগার ফাইলের আওতায় , ~/.avfs/tmp/foo.zipএকটি ডিরেক্টরি রয়েছে ~/.avfs/tmp/foo.zip#যা আর্কাইভের সামগ্রীটি প্রকাশ করে। তবে এই অতিরিক্ত ডিরেক্টরিটি তালিকায় উপস্থিত হয় না ~/.avfs/tmp: এটি কেবল তখনই উপস্থিত থাকে যখন স্পষ্টভাবে অনুরোধ করা হয়। (এটি কিছু অটোমোন্টারগুলি কীভাবে কাজ করে তার সমান))

mountavfs
cd ~/.avfs/tmp/foo.zip\#

যখন আমি উপরের মত একটি কমান্ড টাইপ করি তখন foo.zip#সম্পূর্ণরূপে উপস্থিত হয় না ~/.avfs/tmp/কারণ যেহেতু কোনও ডিরেক্টরি নেই। আমি কীভাবে zsh কে বলতে পারি যে যখনই কোনও ফাইল রয়েছে যার পুরো পথটি $arcমেলে ~/.avfs/**/*.(tgz|zip)?, এমন ভান করা উচিত যে সেখানে একটি ডিরেক্টরি আছে ${arc}#?

(নোট করুন যে আমি কেবল কমান্ডের জন্য নয়, প্রতিটি কল _filesবা তার সাথে কাজ করতে সম্পূর্ণ করতে চাই I'd আমি যদি সম্ভব হয় তবে ফাংশনের কোডটি নকল করতে পছন্দ করব না ))_dirscd_files

¹ এবং বাকি সমস্ত এক্সটেনশন


File / .avfs- এ পুরো ফাইল-সিস্টেমের একটি "অনুলিপি" রয়েছে?
ctrl-alt-delor

@richard হ্যাঁ, যে /path/to/fooযেমন দৃশ্যমান ~/.avfs/path/to/foo
গিলস

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

উত্তর:


1

এই জাল প্রশ্নের জন্য একটি জাল উত্তর অপর্যাপ্ত বলে মনে হচ্ছে; zsh বিল্টিন সমর্থন স্বতঃপরিচালিত ডিরেক্টরি ডিরেক্টরি ( fake-files dir:names) উপর চালিত হয় , এবং এতে ফাইলের ধরণগুলিতে নয়। এই ডিরেক্টরির, যা অনুসারে হতে পারে নির্দিষ্ট নামে ফাইলগুলি যোগ করতে সুবিধাজনক automountবা sshfsবা NetApp .snapshotটাইপ স্থাপনার যেখানে ডিরেক্টরির টু হতে-মাউন্ট করা একটি পরিচিত স্ট্যাটিক নাম, ALAS

autoload -U compinit
compinit
zstyle ':completion:*' fake-files $HOME/.avfs:'ALAS POOR YORICK'

zshall(1)বলে যে "নামগুলি" স্ট্রিং, এবং পরীক্ষাগুলি মেটাচার্যাক্টরগুলি (যেমন #বা \#বা '*(e:"echo hi":)') বিভিন্নভাবে "কাজ করে না" নির্দেশ করে, তাই fake-filesবিবৃতিটির নামের অংশে কোনও গ্লোব ছোটাছুটি করার কোনও উপায় আমার জানা নেই । (এর মাধ্যমে ডিভেলিং Src/Zle/computil.cকরলে নামগুলি কী হতে পারে ঠিক তা প্রকাশ করতে পারে তবে এটি আরও কাজ হবে)) (এছাড়াও, সংরক্ষণাগার ফাইলগুলির নামকরণের জন্য ডিরেক্টরি অবস্থানে পুনরাবৃত্ত গ্লোবগুলি ব্যবহার করা হয়নি, তবে আবার কতটা fake-filesঅনুমতি দেয় তা দেখতে সি ডাইভিং লাগবে আপনি সাথে পালাতে হবে।)

এর সাথে compdef, .avfsডিরেক্টরিটি সম্পূর্ণ করার তালিকা তৈরি করতে পারে :

compdef '_files -g $HOME/.avfs/\*' -p \^
function andthehash {
  reply=($REPLY $REPLY\#)
}
compdef "_files -g $HOME/.avfs/'*(+andthehash)'" -p \^

ব্যর্থতা ব্যতীত, এটি কেবল #তখনই ফাইলগুলি দেখায় যখন তা বিবেচনা করে না এবং এইভাবে সেগুলি সম্পূর্ণ করতে পারে না। (এই ফর্মটির জন্য উত্পাদনশীল ব্যবহার রয়েছে, যদিও এই ক্ষেত্রে নয়))

ব্যবহারের সাহায্যে zstyleআপনি নীচের সাথে আরও ঘনিষ্ঠ হন .zshrc:

autoload -U compinit
compinit

function UnderAVFS {
  local pdir
  [[ -z $1 ]] && return 1
  pdir=$1:a
  [[ ! -d $pdir ]] && pdir=$pdir:h
  [[ ! -d $pdir || $pdir == . ]] && return 1
  while [[ $pdir != / ]]; do
    [[ $pdir == $HOME/.avfs ]] && return 0
    pdir=$pdir:h
  done
  return 1
}

function AVFSExtras {
  if UnderAVFS $REPLY; then
    reply=($REPLY)
    # TODO embiggen list of archive suffixes
    [[ $REPLY == *.(bz2|tbz2) ]] && reply+=($REPLY\#)
  fi
}

# Try to match avfs, otherwise the default pattern. Probably could greatly
# benefit from caching, to avoid hits on UnderAVFS function.
zstyle ':completion:*' file-patterns '*(+AVFSExtras):avfs-files' '%p:all-files'

যাইহোক, এটি কেবলমাত্র \#/বিট (ডিফল্ট অ্যাফএস সেটআপের সাহায্যে ডেবিয়ান স্কুইজ গুণে) সম্পূর্ণ করতে পারে তবে কোনও সংরক্ষণাগার জন্য ভার্চুয়াল ফাইল সিস্টেমে নয়, সুতরাং সংরক্ষণাগারটিতে সম্পূর্ণ ট্যাব সম্পূর্ণ প্রয়োজন হবে। আমি বিট _call_program ... lsপরিপূরক জন্য এই লাইন বরাবর বা কিছু অনুমান করছি \#, যদি না zshবিশ্বাস আছে যে আরও অলস উপায় আছে যে ডিরেক্টরি যে অস্তিত্ব নেই না করতে পারে।

খারাপ সংবাদ! সম্পূর্ণরূপে _path_filesএটি জাল ডিরেক্টরিগুলি তৈরি করে না ; আমি সন্দেহ করি এটি সম্পর্কিত zsh গ্লোববিং সম্পর্কিত। উভয় zsh 4. কিছু চালু এবং 5.0.8 zsh সমস্যাটি প্রদর্শন করে। সুতরাং আমি সন্দেহ করি যে সম্পূর্ণ ফিক্সের জন্য প্যাচগুলির প্রয়োজন হবে _path_filesবা অন্যরকম কিছু লিখতে হবে যা অন্যথায় এই জাল ডায়ারগুলিতে সম্পূর্ণ হয়। টাইপিংয়ের ls /root/.avfs/root/sometar.gz\#/শেষে control-xএবং তারপরে সেই টাইপিংয়ের শেষে এবং তারপরে ?, একটি সমাপ্তির ডিবাগিং ট্রেস তৈরি করা যেতে পারে এবং ধরে নেওয়া bindkey -eএবং এটি _complete_debugকী কম্বো বলতে বাধ্য, যদি কেউ কেন এটি ব্যর্থ হচ্ছে তার মাধ্যমে আবিষ্কার করতে চায়।


0

জেডএসে আপনি compctl -Kনিজের ফাংশনটি প্রজন্মের সমাপ্তির বিকল্পগুলিতে নিবন্ধিত করতে ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

compctl -f -c -u -r -K myAVFScompletion "*" -tn

তারপরে আপনাকে নিজের ফাংশনটি সংজ্ঞায়িত করতে হবে:

myAVFScompletion () {
    read -c COMMAND ARGS

    # Decide what paths you want to suggest completion for
    # by looking inside the ~/.avfs folder.

    # Place your suggestions into an array:
    reply=( a_path b_path ... )
}

স্পষ্টতই উপরেরগুলির আরও কিছু কাজ প্রয়োজন, তবে এটি দিয়েই শুরু করার দরকার।

একটি অনুরূপ (তবে ভিন্ন) কাস্টম সমাপ্তির ফাংশন বাশের জন্য নিবন্ধীকৃত হতে পারে।

এখানে বাশ এবং zsh এর বাস্তবায়ন সহ একটি উদাহরণ । (এটি কমান্ডের ম্যান পৃষ্ঠা থেকে অপশনগুলি ধরে কমান্ড-লাইন বিকল্পগুলির সমাপ্তির প্রস্তাব দেয়))

এবং এমন কিছু জিনিসগুলির জন্য এখানে কিছু দ্রুত অনুমান করা যেতে পারে যা আপনার সমাপ্তির ফাংশনের অভ্যন্তরে কাজ করতে পারে:

if [[ -d "$ARGS#" ]]
then reply=( "$ARGS#" )
else reply=
fi

অথবা সম্ভবত এটি:

reply=( $(find ~/.avfs -type f -name "*.tgz" -or -name "*.zip" | sed 's+$+#+') )

শুভকামনা!


আমি একটি সমাপ্তি ফাংশন লিখতে জানি, আপনাকে অনেক ধন্যবাদ। সমস্যাটি কীভাবে ফাইলগুলির জন্য বিদ্যমান সমাপ্তি প্রক্রিয়াটি পরিবর্তন করতে হয়। নোট করুন যে আমি "নতুন" সমাপ্তির প্রক্রিয়াটি ব্যবহার করি, না compctl, অর্থাৎ আমি যা করতে চাই তা পরিবর্তন করতে চাই _files। আপনার উত্তরটি মোটেই সহায়ক নয়।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

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

@ eyoung100 দয়া করে প্রয়াসের জন্য +1 দেবেন না (সেই প্রচেষ্টাটি এখানে দৃশ্যমান নয়)। অপ্রত্যাশিত জবাব দেওয়া সাইটটির জন্য ক্ষতিকারক।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.