私は主にgvimと多くの端末で働いています。もともと、すべてのファイルを単一のvimインスタンスで開くことを好みました。そのために、エイリアスを使用して、現在の「vimサーバー」の端末からファイルを開きました。
alias rv="gvim --remote-silent"
しかし、1つのvimインスタンスで複数のプロジェクトから多くのファイルを開くと、生産性に影響するため、エイリアスを関数にアップグレードしています。
# main function
rv() {
local args options server
options=$(getopt -o hils:t: -l "help,info,list,set:,target:" -- "$@")
if [[ $? -ne 0 ]]; then
echo "Failed to parse options."
return 1
fi
# a little magic, necessary when using getopt
eval set -- "$options"
# go through the options with a case and use shift to analyze one option at a time.
while true; do
case "$1" in
-h|--help)
echo "Usage: $0 [-hil] [--help] [--info] [--list]";
echo " $0 {-s | --set} <name> [<file1 file2...>]";
echo " $0 {-t | --target} <name>] <file1 file2...>";
return 0;;
-i|--info)
gvim_show_info;
return 0;;
-l|--list)
gvim_list_servers;
return 0;;
-s|--set)
gvim_set_server_name ${2:u};
shift 2;;
-t|--target)
server="$2";
shift 2;;
--)
shift;
break;;
esac
done
if [[ "$#" -eq 0 ]]; then
# if no files specified...
if [[ -n "$server" ]]; then
# throw error if --target option was specified.
echo "Error! --target requires one or more filenames."
return 1;
fi
else
# if files were specified...
if [[ -n "$server" ]]; then
# if --target was specified
gvim_run_remote $server "$@"
else
gvim_run_remote $(gvim_get_default_server) "$@"
fi
fi
return 0;
}
今、この新しいにrv
は独自のオプションがあります。私はそれを使用することができます:
- 使用可能なvimサーバーをリストします(-l --list)
- 現在のシェルにデフォルトのvimサーバーを設定します(-s --set)
- デフォルトのvimサーバーを表示します(-i --info)
- 特定のvimサーバーでファイルを開く(-t --target)
- デフォルトのvimサーバーでファイルを開く:
rv files...
ただし、rv
エイリアスの代わりに関数を使用しているため、以前は楽しんでいたzsh補完が失われます。のオプション_rv
を表示する補完関数の作成について説明しましたrv
が、補完オプションを既存のvim補完オプションと組み合わせたいと思います。私はといくつかの競合があるかもしれません知っているrv
の-s
とvim
の-s
、しかし私は私がエレガントなものを扱うことができる把握--
セパレーター。
TLDR; だから、どのように私は、組み合わせて完成スクリプト作成できますか_arguments
両方のオプションを_rv
して_vim
?_vim
引数リストをにコピー&ペーストする代わりに、可能であれば再利用することを好み_rv
ます。
ここに私のです_rv
。 2014/6/10 16:10に更新
#compdef rv
_rv() {
typeset -A opt_args
local alternatives
alternatives=(
'args:rv options:_rv_options'
'files:file:_vim_files'
)
_alternative $alternatives && return 0
return 1
}
_rv_options() {
local arguments
arguments=(
'(-i -l -s -t --info --list --set --target)'{-h,--help}'[Print usage info.]'
'(-h -l -s -t --help --list --set --target)'{-i,--info}'[Print default vim server. As stored in $GVIM_SERVER.]'
'(-i -h -s -t --info --help --set --target)'{-l,--list}'[Print list of existing vim servers.]'
'(-i -h -l -t --info --help --list --target)'{-s,--set}'[Set default vim server for the current shell.]:vim servers:_rv_vim_servers'
'(-i -h -l -s --info --help --list --set)'{-t,--target}'[Open files in a particular vim server.]:vim servers:_rv_vim_servers'
)
_arguments -s -C $arguments && return 0
return 1
}
_rv_vim_servers() {
local -a servers
servers=( ${(f)"$(_call_program servers vim --serverlist 2>/dev/null)"} )
_wanted servers expl server compadd -M 'm:{a-z}={A-Z}' -a servers && return
}
# invoke the completion command during autoload
_rv "$@"
現在の動作
現在、_rv
完了は使用可能ですが、理想的ではありません。
- と入力すると
rv <TAB>
、vimオプションが表示されません。rvオプションとファイルパスのみが表示されます。_vim
私のためにファイルパスを完成しています。 - を入力すると
rv -s <TAB>
、vimサーバーのリストが表示されますが、ファイルパスも表示されます。ファイルはコマンドのこの時点では許可されていないため、オートコンプリートには表示されません。
予想される行動
- と入力すると
rv <TAB>
、1)rvオプション、2)vimオプション、3)ファイルパスリストが表示されます。 - 私が入力すると
rv -s <TAB>
、私が見ることを期待:1)VIMサーバ名を(によって提供されます_rv_vim_servers
。 - と入力
rv /valid/file/path/<TAB>
すると、ファイルパスリストのみが表示されます。_vim
すでにこの機能を持っているので、私はそれに頼ることを好むでしょう。
compdef
-n
「コマンドまたはコンテキストにすでに定義されている補完が上書きされるのを防ぐ」というオプションがあります。それで、compdef _vim rv
続いてみましたcompdev -n _rv rv
か?
_vim
ファイルを入手することは可能ですが、そうする前に_arguments
関数をカスタムローカル関数で上書きしますか?そうすることで、から引数を取得できます_vim
。たぶん、別のzshプロセスで。