আমি বেশিরভাগ gvim এবং অনেক টার্মিনালে কাজ করি। মূলত, আমি আমার সমস্ত ফাইল একক ভিমে উদাহরণে খুলতে পছন্দ করি। সে লক্ষ্যে আমি বর্তমান 'ভিআইএম সার্ভারে' আমার টার্মিনালগুলি থেকে ফাইলগুলি খুলতে একটি উপনাম ব্যবহার করেছি।
alias rv="gvim --remote-silent"
তবে একাধিক প্রকল্পের একাধিক প্রকল্পের একাধিক ফাইল খোলা থাকলে আমার উত্পাদনশীলতা ক্ষতিগ্রস্থ হয়, তাই আমি আমার উপন্যাসটি একটি ফাংশনে আপগ্রেড করছি।
# 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নিজস্ব বিকল্প রয়েছে। আমি এটি ব্যবহার করতে পারি:
- ভিএম সার্ভার উপলব্ধ তালিকা (-l --list)
- বর্তমান শেল (-s --set) এর জন্য ডিফল্ট ভিএম সার্ভার সেট করুন
- ডিফল্ট ভিএম সার্ভার (-i --info) দেখান
- একটি নির্দিষ্ট ভিএম সার্ভারে ফাইলগুলি খুলুন (-t --target)
- ডিফল্ট ভিএম সার্ভারে ফাইলগুলি খুলুন:
rv files...
তবে, যেহেতু আমি rvএকটি উলামের পরিবর্তে কোনও ফাংশন ব্যবহার করছি , তাই আমি পূর্বে উপভোগ করা zsh সমাপ্তিটি হারাব। আমি একটি সমাপ্তি ফাংশন তৈরি করে পড়েছি _rv, যা rvএর বিকল্পগুলি দেখায় , তবে আমি আমার সম্পূর্ণ করার বিকল্পগুলি বিদ্যমান ভিআইএম সমাপ্তির বিকল্পগুলির সাথে একত্রিত করতে চাই। আমি সেখানে কিছু দ্বন্দ্ব হতে পারে জানি 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 -s <TAB>ভিএম সার্ভারের তালিকা দেখতে পাই তবে ফাইলের পাথগুলিও প্রদর্শিত হয়। কমান্ডের এই মুহুর্তে কোনও ফাইল অনুমোদিত নয় এবং স্বতঃপূরণে উপস্থিত হওয়া উচিত নয়।
প্রত্যাশিত আচরণ
- আমি যখন টাইপ করি
rv <TAB>, তখন আমি প্রত্যাশা করি: 1) আরভি বিকল্পগুলি, 2) ভিআইএম অপশনগুলি, 3) ফাইল পাথের তালিকা - আমি যখন টাইপ করি
rv -s <TAB>, তখন আমি প্রত্যাশা করি: 1) ভিম সার্ভারের নামগুলি (প্রদত্ত হিসাবে)_rv_vim_servers। - আমি যখন টাইপ করি তখন আমি
rv /valid/file/path/<TAB>কেবলমাত্র একটি ফাইলের পথের তালিকা দেখতে আশা করি। যেহেতু_vimইতিমধ্যে এই ক্ষমতা রয়েছে, তাই আমি এটির উপর নির্ভর করতে পছন্দ করব।
compdefএকটি -nবিকল্প রয়েছে যা বলে যে এটি "কমান্ড বা প্রসঙ্গের জন্য ইতিমধ্যে সংজ্ঞায়িত কোনও পরিপূর্ণতা ওভাররাইট হওয়া থেকে বাধা দেয়"। তো, আপনি কি compdef _vim rvঅনুসরণ করার চেষ্টা করেছেন compdev -n _rv rv?
_vim ফাইলটি উত্স করা সম্ভব ছিল , তবে এটি করার আগে _argumentsএকটি কাস্টম স্থানীয় ফাংশন দিয়ে ফাংশনটি ওভাররাইট করা উচিত ? এটি করে আপনি আর্গুমেন্টগুলি থেকে পাবেন _vim। হতে পারে একটি পৃথক zsh প্রক্রিয়া সহ।