cd OLD NEW 最初のパラメータの完成

cd OLD NEW 最初のパラメータの完成

zshコマンドでは、次cdの形式の2つの引数があります。新しい完成システムを使用してzshを完了できます。 2番目の引数は、既存のディレクトリを取得するために置き換えることができるエントリに基づいて完了します。ただし、最初のパラメータは既存のディレクトリに対してのみ実行されます。cd OLD NEW${PWD/OLD/NEW}NEWOLD

OLD既存のディレクトリを完成させることに加えて、zshに可能な値の完成を提供させるにはどうすればよいですか?

たとえば、現在のディレクトリがあり/path/to/foo、ディレクトリとがある/also/to/foo場合、/path/to/foo/prime完了cd pTabpですprime。を実行するには、zshも完成したものとしてcd path also使用できることを願っています。pathどのように?

2番目のパラメータに入力された値を使用して最初のパラメータの可能性を制限することは有利ですが、最初のパラメータを独立して実行することも可能です。

答え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を常に追加するのではなく、2番目のパラメータがすでに存在する場合にのみコンポーネントを追加できます。

しかし!これにより、常にcd完了がめちゃくちゃになり、_cd上流の完了をサルパッチにする必要があります。別のオプションは、2つのパラメータ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

関連情報