CD OLD NEW ilk argümanının tamamlanması


22

İçinde zsh, cdkomutun iki argüman formu vardır: olarak cd OLD NEWdeğişir ${PWD/OLD/NEW}. Yeni stil tamamlama sistemi ile zsh tamamlayabilir NEW: ikinci argüman OLDvar olan bir dizini elde etmek için neyin değiştirilebileceğine dayanarak tamamlanır . Ancak ilk argüman sadece mevcut dizinlere tamamlandı.

OLDMevcut dizinleri tamamlamanın yanı sıra, zsh için olası değerler olan tamamlamalar sunmayı nasıl sağlayabilirim ?

Geçerli dizin ise, örneğin, /path/to/foove dizinleri de vardır /also/to/foove /path/to/foo/primeardından cd pTabtamamlar piçin prime. Eğer koşmak cd path alsoistersem, Zsh'nin de pathbir tamamlanma teklifi sunmasını istiyorum . Nasıl?

Birinci argüman için olasılıkları sınırlandırmak için ikinci argümanın önceden yazılmış değerlerini kullanmak bir artı olacaktır, ancak ilk argümanı bağımsız olarak tamamlamak da iyi olacaktır.


Lütfen 2 argüman tamamlama örnek olacaktır: cd p also <Tab>ya cd p also <left arrow x 5> <Tab>?
Jeff Schaller

İkinci argüman duyarlı örnek olacaktır @JeffSchaller cd p also<Left*5><Tab>: Ben basarsanız <Tab>imleç ederken also, beklediğim alsodeğil, tamamlanmak üzere p.
Gilles 'SO- kötülük olmayı'

Eğer yazarsanız cd t<tab>teklif etmeli mi th/to/foo/primeve to/foo/prime? Yoksa sadece kendini dizin sınırlarıyla mı sınırlamalı?
Barmar

@Barmar Dizin sınırlarını sınırlamanın en uygun olacağını düşünüyorum.
Gilles 'SO- kötülük yapmayı bırak'

İlginç soru ...
wogsland 19:17

Yanıtlar:


1

Sana bileşenlerini eklemek sanırım $PWDiçin cdbu kurcalıyor gerektiren görünse de, tamamlama listesinden _cd; yani, _cdönce özelleştirilmiş bir sürümü görünmelidir $fpath.

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

Sonra ~/zcomp/_cdbir fonksiyon eklemek üstünde

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

ve sonra _alternativesatırdan hemen önce alternatifler listesine geri dönenleri ekleyin

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

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

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

return ret
...

bu her zaman tamamlamaları için pwdbileşenleri ekleyecektir cd:

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

Ek bir mantıkla, $PWDbileşenleri yalnızca her zaman yerine zaten ikinci bir argüman mevcutsa ekleyebilirsiniz .

Ancak! Bu her zaman cdtamamlamayı mahveder ve yukarı akış _cdtamamlamasını maymun haline getirmemizi gerektirir . Başka bir seçenek cd, belki de adlandırılan iki argüman tarafından sağlanan işlev için yeni bir ad oluşturmak cdsubve bunun için sadece PWDbileşenlerin tamamlanması görünür. Bunu ekle~/.zshrc

function cdsub { builtin cd "$@" }

Ve sonra içine bir yere yerleştirilmek üzere küstahça bir _cd tamamlama_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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.