सीडी ओएलडी न्यू के पहले तर्क के लिए समापन


22

में zsh, cdकमांड का दो-तर्क रूप है: इसमें cd OLD NEWपरिवर्तन होता है ${PWD/OLD/NEW}। नई-शैली के पूरा होने की प्रणाली के साथ, zsh पूरा करने में सक्षम है NEW: OLDएक मौजूदा निर्देशिका प्राप्त करने के लिए जो प्रतिस्थापित किया जा सकता है, उसके आधार पर दूसरा तर्क पूरा हो गया है। लेकिन पहला तर्क केवल मौजूदा निर्देशिकाओं के लिए पूरा किया गया है।

OLDमौजूदा निर्देशिकाओं को पूरा करने के अलावा, मैं कैसे पूर्णता प्रदान करने के लिए zsh प्राप्त कर सकता हूं ?

उदाहरण के लिए, यदि वर्तमान निर्देशिका है /path/to/fooऔर निर्देशिका भी हैं /also/to/fooऔर /path/to/foo/primeफिर cd pTabपूर्ण pहो जाती है prime। अगर मैं दौड़ने का इरादा रखता हूं cd path alsoतो मैं pathएक पूरा होने के रूप में zsh भी देना चाहता हूं । कैसे?

पहले तर्क के लिए संभावनाओं को सीमित करने के लिए दूसरे तर्क के पहले से ही टाइप किए गए मूल्यों का उपयोग करना एक प्लस होगा, लेकिन स्वतंत्र रूप से पहले तर्क को पूरा करना भी ठीक होगा।


क्या आपका 2-तर्क पूर्ण होने का उदाहरण होगा: cd p also <Tab>या cd p also <left arrow x 5> <Tab>?
जेफ स्कालर

@JeffSchaller दूसरा-तर्क-संवेदनशील उदाहरण होगा cd p also<Left*5><Tab>: यदि मैं <Tab>कर्सर में रहते हुए दबाता alsoहूं, तो मुझे alsoपूरा होने की उम्मीद है, नहीं p
गिलेस एसओ- बुराई को रोकना

आप लिखते हैं, तो cd t<tab>यह पेशकश करनी चाहिए th/to/foo/primeऔर to/foo/prime? या यह सिर्फ निर्देशिका सीमाओं तक ही सीमित होना चाहिए?
बामर

@ बरमार मुझे लगता है कि निर्देशिका सीमाओं को सीमित करना सबसे सुविधाजनक होगा।
गाइल्स का SO- बुराई पर रोक

सवाल करने वाला ...
वोग्सलैंड

जवाबों:


1

मैं तुम्हें के घटक जोड़ सकते हैं लगता है कि $PWDकरने के लिए cdइस के साथ नगण्य की आवश्यकता प्रतीत होता है, हालांकि पूरा होने सूची, _cd; यह है, एक अनुकूलित संस्करण _cdपहले में दिखाई देना चाहिए $fpath

% cd && mkdir zcomp
% cp $fpath[-1]/_cd zcomp
% fpath=(~/zcomp $fapth)

फिर ~/zcomp/_cdएक फ़ंक्शन जोड़ने के शीर्ष पर

_our_pwd() {
  _values ourpwd ${(ps:/:)PWD}
}

और फिर _alternativeलाइन जोड़ने से पहले जो विकल्प की सूची में लौटता है

  ...
  alt=("$service-options:$service option:_cd_options" "$alt[@]")
fi

alt=(ourpwd:pwd:_our_pwd "$alt[@]")

_alternative "$alt[@]" && ret=0

return ret
...

हालांकि यह pwdघटकों को हमेशा cdपूर्णता में जोड़ेगा :

% cd
Users    jdoe    Applications/  Desktop/  Documents/  Downloads/  Library/
...

अतिरिक्त तर्क के साथ आप $PWDघटकों को तभी जोड़ सकते हैं जब हमेशा की बजाय पहले से मौजूद दूसरा तर्क मौजूद हो।

तथापि! यह हमेशा cdपूरा होने में गड़बड़ी करता है और इसके लिए आवश्यक है कि हम अपस्ट्रीम _cdपूर्णता को बंदर करें । एक अन्य विकल्प दो-अर्ग द्वारा प्रदान किए गए फ़ंक्शन के लिए एक नया नाम बनाना होगा cd, शायद कहा जाता है cdsub, और केवल PWDघटकों के पूरा होने के बाद दिखाई देते हैं। इसमें जोड़ें~/.zshrc

function cdsub { builtin cd "$@" }

और फिर कहीं पर रखा जाने वाला एक _cd पूरा होने का_cdsub रास्ता $fpath:

#compdef cdsub
#
# Modified version of _cd from ZSH 5.3.1 with specific support for the
# `cd old new` form whereby PWD elements are provided for completion.

_cd_options() {
  _arguments -s \
  '-q[quiet, no output or use of hooks]' \
  '-s[refuse to use paths with symlinks]' \
  '(-P)-L[retain symbolic links ignoring CHASE_LINKS]' \
  '(-L)-P[resolve symbolic links as CHASE_LINKS]'
}

setopt localoptions nonomatch

local expl ret=1 curarg
integer argstart=2 noopts

if (( CURRENT > 1 )); then
  # if not in command position, may have options.
  # Careful: -<-> is not an option.
  while [[ $words[$argstart] = -* && argstart -lt CURRENT ]]; do
    curarg=$words[$argstart]
    [[ $curarg = -<-> ]] && break
    (( argstart++ ))
    [[ $curarg = -- ]] && noopts=1 && break
  done
fi

if [[ CURRENT -eq $((argstart+1)) ]]; then
  # cd old new: look for old in $PWD and see what can replace it
  local rep
  # Get possible completions using word in position 2
  rep=(${~PWD/$words[$argstart]/*}~$PWD(-/))
  # Now remove all the common parts of $PWD and the completions from this
  rep=(${${rep#${PWD%%$words[$argstart]*}}%${PWD#*$words[$argstart]}})
  (( $#rep )) && _wanted -C replacement strings expl replacement compadd -a rep
else
  _values ourpwd ${(ps:/:)PWD} && ret=0
  return ret
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.