Zfs में नकली निर्देशिकाओं को पूरा करना


37

कुछ परिस्थितियों में "नकली" फ़ाइलों को पूरा करने के लिए मैं zsh की पूर्णता प्रणाली को कैसे मोड़ सकता हूं?

अधिक सटीक रूप से, AVFS फाइल सिस्टम अभिलेखागार को प्रत्येक संग्रह के बगल में "नकली निर्देशिका" बनाकर निर्देशिकाओं के रूप में उजागर करता है। डिफ़ॉल्ट रूप से, यह संपूर्ण निर्देशिका पदानुक्रम को इसके आरोह बिंदु के नीचे दोहराता है ~/.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या _dirsनहीं, के लिए, cdकमांड। मैं का कोड नकल करने की है नहीं करना चाहते हैं _files, समारोह यदि संभव हो तो।)

Rest और बाकी सभी एक्सटेंशन


क्या ~ / .avfs में संपूर्ण फ़ाइल-सिस्टम की "कॉपी" होती है?
ctrl-alt-delor

@richard हाँ, हर /path/to/fooदिखाई दे रहा है ~/.avfs/path/to/foo
गाइल्स का SO- बुराई से दूर रहना '

इसमें आसान तय किया जा सकता है avfs। यदि यह #किसी भी फाइल के लिए डिफ़ॉल्ट निर्देशिका प्रविष्टि प्रस्तुत करता है जो उसके द्वारा समर्थित तार से मेल खाती है, या यहां तक ​​कि जादू ने एक निर्देशिका में फाइलों का परीक्षण किया है जिसके लिए एक #प्रविष्टि की आवश्यकता है, तो पूर्णता सिर्फ काम करेगी। मुझे लगता है कि कुछ के लिए एक प्रदर्शन हिट होगा जैसे 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पता लगाने से पता चल सकता है कि नाम क्या हो सकते हैं, लेकिन यह अधिक काम का होगा।) (इसके अलावा, संग्रह की स्थिति में पुनरावर्ती ग्लब्स का उपयोग करके संग्रहित फ़ाइलों को नाम नहीं दिया गया, लेकिन फिर से यह देखने के लिए 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.something और zsh 5.0.8 समस्या का प्रदर्शन करते हैं। इसलिए मुझे संदेह है कि एक पूर्ण फिक्स के लिए पैच की आवश्यकता होती है _path_files, या कुछ अलग लिखने के लिए जो अन्यथा इन नकली डेयर पर पूरा होता है। एक पूरा होने डिबगिंग का पता लगाने में टाइपिंग द्वारा उत्पन्न किया जा सकता ls /root/.avfs/root/sometar.gz\#/है और फिर उस टाइपिंग के अंत में control-xऔर फिर ?, यह मानते हुए bindkey -eऔर कहा कि _complete_debugअगर किसी को यह क्यों विफल हो रहा है के माध्यम से तल्लीन करना चाहता है, ने कहा कि keycombo के लिए बाध्य है।


0

Zsh में आप 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। आपका उत्तर बिल्कुल भी मददगार नहीं है।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स ने एक लौ युद्ध शुरू करने के लिए नहीं, और गलत तरीके से उतरने के जोखिम पर, कम से कम उसने कोशिश की ... यह 2 साल से अधिक अनुत्तरित "अटारी" में बैठा है ... प्रयास के लिए +1 टी रीसेट 0 ।
eyoung100

@ eyoung100 कृपया प्रयास के लिए +1 न दें (यह प्रयास यहाँ स्पष्ट नहीं है)। अपुष्ट उत्तर देने से साइट के लिए हानिकारक है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.