私は主にgvimと多くの端末で働いています。最初は、単一のvimインスタンスですべてのファイルを開くことを好みました。これを行うには、別名を使用して現在の「vimサーバー」の端末でファイルを開きます。
alias rv="gvim --remote-silent"
しかし、単一の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
できるようです--
。
長すぎる。それでは、_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
私はこの能力をすでに持っているので、それに頼りたいです。
答え1
あなたはできます猿パッチ_arguments
完成者を拡張する機能_vim
:
#compdef rv
_rv_vim_servers() {
local expl
_wanted servers expl server \
compadd -- ${(f)"$( _call_program servers vim --serverlist 2>/dev/null )"}
}
_rv() {
autoload +X -Uz _arguments # Load the function body.
functions -c _arguments _rv_arguments # Make a copy.
# Replace the original function.
_arguments() {
# Call the original function with additional completions.
_rv_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'
}
{
_vim "$@"
} always {
functions -c _rv_arguments _arguments # Restore the original.
unfunction _rv_arguments # Discard our copy.
}
}
_rv "$@"
答え2
このクラス名のヒントを含む /usr/share/zsh/functions/Completion/Unix/_git を見つけ、エイリアスに対して次の関数を定義しました。
_git-ls () {
# Just return the _git-ls-files autocomplete function
_git-ls-files
}
次に、 compdef g=git を直接実行します。オートコンプリートシステムは、例えば、g ls が実行中であることを確認し、_git-ls オートコンプリート機能を使用する。
発見するここ