সিডি ওল্ড নিউ এর প্রথম যুক্তির জন্য সমাপ্তি


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তবে আমি zsh চাই সম্পূর্ণরূপে অফারও করব path। কিভাবে?

প্রথম যুক্তিটির সম্ভাব্যতা সীমাবদ্ধ করার জন্য দ্বিতীয় যুক্তির ইতিমধ্যে টাইপ করা মানগুলি ব্যবহার করা একটি উপকার হবে, তবে প্রথম যুক্তিটি স্বাধীনভাবে সম্পন্ন করাও ভাল।


আপনার দ্বি-যুক্তির সমাপ্তির উদাহরণটি কি: cd p also <Tab>বা cd p also <left arrow x 5> <Tab>?
জেফ শ্যাচলার

@ জেফশালার দ্বিতীয়-যুক্তি-সংবেদনশীল উদাহরণটি হ'ল cd p also<Left*5><Tab>: আমি যদি <Tab>কার্সারটি থাকা অবস্থায় চাপতাম তবে alsoআমি আশা করি alsoএটি সম্পন্ন হবে না p
গিলস 'অশুভ হওয়া বন্ধ করুন'

আপনি টাইপ cd t<tab>যদি এটি অফার করা উচিত th/to/foo/primeএবং to/foo/prime? অথবা এটি কেবল নিজের ডিরেক্টরি সীমানায় সীমাবদ্ধ করা উচিত?
বর্মার

@ বারমার আমি মনে করি ডিরেক্টরি সীমানা সীমাবদ্ধ করা সবচেয়ে সুবিধাজনক হবে।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন' 11:58

আগ্রহজনক প্রশ্ন ...
ওয়াগসল্যান্ড 15

উত্তর:


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.