เสร็จสมบูรณ์สำหรับอาร์กิวเมนต์แรกของ cd OLD NEW


22

ในzshการcdออกคำสั่งมีรูปแบบสองอาร์กิวเมนต์: การเปลี่ยนแปลงcd OLD NEW ${PWD/OLD/NEW}ด้วยระบบการทำให้สมบูรณ์สไตล์ใหม่ zsh สามารถทำให้เสร็จสมบูรณ์ได้NEW: อาร์กิวเมนต์ที่สองเสร็จสมบูรณ์ตามสิ่งที่OLDสามารถทดแทนได้เพื่อให้ได้ไดเรกทอรีที่มีอยู่ แต่อาร์กิวเมนต์แรกจะเสร็จสมบูรณ์ไปยังไดเรกทอรีที่มีอยู่เท่านั้น

ฉันจะให้ zsh เสนอความสำเร็จที่เป็นค่าที่เป็นไปได้OLDนอกเหนือจากการทำไดเรกทอรีที่มีอยู่ให้สมบูรณ์ได้อย่างไร

ตัวอย่างเช่นถ้าไดเรกทอรีปัจจุบัน/path/to/fooและยังมีไดเรกทอรี/also/to/fooและ/path/to/foo/primeแล้วcd pTabเสร็จไปp primeถ้าฉันตั้งใจจะวิ่งcd path alsoฉันก็อยากให้ zsh เสนอให้pathเหมือนกัน อย่างไร?

การใช้ค่าที่พิมพ์ไว้แล้วของอาร์กิวเมนต์ที่สองเพื่อ จำกัด ความเป็นไปได้สำหรับอาร์กิวเมนต์แรกนั้นจะเป็นค่าบวก


ตัวอย่างเสร็จ 2 ข้อโต้แย้งของคุณจะเป็น: cd p also <Tab>หรือcd p also <left arrow x 5> <Tab>?
Jeff Schaller

@JeffSchaller ตัวอย่างที่สองอาร์กิวเมนต์ที่มีความอ่อนไหวจะเป็นcd p also<Left*5><Tab>: ถ้าผมกด<Tab>ขณะที่เคอร์เซอร์อยู่alsoผมคาดว่าจะแล้วเสร็จไม่also p
Gilles 'หยุดชั่วร้าย'

หากคุณพิมพ์cd t<tab>ควรเสนอth/to/foo/primeและto/foo/prime? หรือควร จำกัด ขอบเขตของไดเรกทอรีเองเท่านั้น
Barmar

@ บาร์มาร์ฉันคิดว่าการ จำกัด ขอบเขตไดเรกทอรีจะสะดวกที่สุด
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำถามที่น่าสนใจ ...
wogsland

คำตอบ:


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เสร็จต้นน้ำ อีกทางเลือกหนึ่งคือการสร้างชื่อใหม่สำหรับฟังก์ชั่นที่จัดทำโดยสอง ARG 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.