zsh
コマンドでは、次cd
の形式の2つの引数があります。新しい完成システムを使用してzshを完了できます。 2番目の引数は、既存のディレクトリを取得するために置き換えることができるエントリに基づいて完了します。ただし、最初のパラメータは既存のディレクトリに対してのみ実行されます。cd OLD NEW
${PWD/OLD/NEW}
NEW
OLD
OLD
既存のディレクトリを完成させることに加えて、zshに可能な値の完成を提供させるにはどうすればよいですか?
たとえば、現在のディレクトリがあり/path/to/foo
、ディレクトリとがある/also/to/foo
場合、/path/to/foo/prime
完了cd p
Tabはp
です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