sing-box.bash 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580
  1. # bash completion for sing-box -*- shell-script -*-
  2. __sing-box_debug()
  3. {
  4. if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then
  5. echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
  6. fi
  7. }
  8. # Homebrew on Macs have version 1.3 of bash-completion which doesn't include
  9. # _init_completion. This is a very minimal version of that function.
  10. __sing-box_init_completion()
  11. {
  12. COMPREPLY=()
  13. _get_comp_words_by_ref "$@" cur prev words cword
  14. }
  15. __sing-box_index_of_word()
  16. {
  17. local w word=$1
  18. shift
  19. index=0
  20. for w in "$@"; do
  21. [[ $w = "$word" ]] && return
  22. index=$((index+1))
  23. done
  24. index=-1
  25. }
  26. __sing-box_contains_word()
  27. {
  28. local w word=$1; shift
  29. for w in "$@"; do
  30. [[ $w = "$word" ]] && return
  31. done
  32. return 1
  33. }
  34. __sing-box_handle_go_custom_completion()
  35. {
  36. __sing-box_debug "${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}"
  37. local shellCompDirectiveError=1
  38. local shellCompDirectiveNoSpace=2
  39. local shellCompDirectiveNoFileComp=4
  40. local shellCompDirectiveFilterFileExt=8
  41. local shellCompDirectiveFilterDirs=16
  42. local out requestComp lastParam lastChar comp directive args
  43. # Prepare the command to request completions for the program.
  44. # Calling ${words[0]} instead of directly sing-box allows handling aliases
  45. args=("${words[@]:1}")
  46. # Disable ActiveHelp which is not supported for bash completion v1
  47. requestComp="SING_BOX_ACTIVE_HELP=0 ${words[0]} __completeNoDesc ${args[*]}"
  48. lastParam=${words[$((${#words[@]}-1))]}
  49. lastChar=${lastParam:$((${#lastParam}-1)):1}
  50. __sing-box_debug "${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}"
  51. if [ -z "${cur}" ] && [ "${lastChar}" != "=" ]; then
  52. # If the last parameter is complete (there is a space following it)
  53. # We add an extra empty parameter so we can indicate this to the go method.
  54. __sing-box_debug "${FUNCNAME[0]}: Adding extra empty parameter"
  55. requestComp="${requestComp} \"\""
  56. fi
  57. __sing-box_debug "${FUNCNAME[0]}: calling ${requestComp}"
  58. # Use eval to handle any environment variables and such
  59. out=$(eval "${requestComp}" 2>/dev/null)
  60. # Extract the directive integer at the very end of the output following a colon (:)
  61. directive=${out##*:}
  62. # Remove the directive
  63. out=${out%:*}
  64. if [ "${directive}" = "${out}" ]; then
  65. # There is not directive specified
  66. directive=0
  67. fi
  68. __sing-box_debug "${FUNCNAME[0]}: the completion directive is: ${directive}"
  69. __sing-box_debug "${FUNCNAME[0]}: the completions are: ${out}"
  70. if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then
  71. # Error code. No completion.
  72. __sing-box_debug "${FUNCNAME[0]}: received error from custom completion go code"
  73. return
  74. else
  75. if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then
  76. if [[ $(type -t compopt) = "builtin" ]]; then
  77. __sing-box_debug "${FUNCNAME[0]}: activating no space"
  78. compopt -o nospace
  79. fi
  80. fi
  81. if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then
  82. if [[ $(type -t compopt) = "builtin" ]]; then
  83. __sing-box_debug "${FUNCNAME[0]}: activating no file completion"
  84. compopt +o default
  85. fi
  86. fi
  87. fi
  88. if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then
  89. # File extension filtering
  90. local fullFilter filter filteringCmd
  91. # Do not use quotes around the $out variable or else newline
  92. # characters will be kept.
  93. for filter in ${out}; do
  94. fullFilter+="$filter|"
  95. done
  96. filteringCmd="_filedir $fullFilter"
  97. __sing-box_debug "File filtering command: $filteringCmd"
  98. $filteringCmd
  99. elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then
  100. # File completion for directories only
  101. local subdir
  102. # Use printf to strip any trailing newline
  103. subdir=$(printf "%s" "${out}")
  104. if [ -n "$subdir" ]; then
  105. __sing-box_debug "Listing directories in $subdir"
  106. __sing-box_handle_subdirs_in_dir_flag "$subdir"
  107. else
  108. __sing-box_debug "Listing directories in ."
  109. _filedir -d
  110. fi
  111. else
  112. while IFS='' read -r comp; do
  113. COMPREPLY+=("$comp")
  114. done < <(compgen -W "${out}" -- "$cur")
  115. fi
  116. }
  117. __sing-box_handle_reply()
  118. {
  119. __sing-box_debug "${FUNCNAME[0]}"
  120. local comp
  121. case $cur in
  122. -*)
  123. if [[ $(type -t compopt) = "builtin" ]]; then
  124. compopt -o nospace
  125. fi
  126. local allflags
  127. if [ ${#must_have_one_flag[@]} -ne 0 ]; then
  128. allflags=("${must_have_one_flag[@]}")
  129. else
  130. allflags=("${flags[*]} ${two_word_flags[*]}")
  131. fi
  132. while IFS='' read -r comp; do
  133. COMPREPLY+=("$comp")
  134. done < <(compgen -W "${allflags[*]}" -- "$cur")
  135. if [[ $(type -t compopt) = "builtin" ]]; then
  136. [[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace
  137. fi
  138. # complete after --flag=abc
  139. if [[ $cur == *=* ]]; then
  140. if [[ $(type -t compopt) = "builtin" ]]; then
  141. compopt +o nospace
  142. fi
  143. local index flag
  144. flag="${cur%=*}"
  145. __sing-box_index_of_word "${flag}" "${flags_with_completion[@]}"
  146. COMPREPLY=()
  147. if [[ ${index} -ge 0 ]]; then
  148. PREFIX=""
  149. cur="${cur#*=}"
  150. ${flags_completion[${index}]}
  151. if [ -n "${ZSH_VERSION:-}" ]; then
  152. # zsh completion needs --flag= prefix
  153. eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )"
  154. fi
  155. fi
  156. fi
  157. if [[ -z "${flag_parsing_disabled}" ]]; then
  158. # If flag parsing is enabled, we have completed the flags and can return.
  159. # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough
  160. # to possibly call handle_go_custom_completion.
  161. return 0;
  162. fi
  163. ;;
  164. esac
  165. # check if we are handling a flag with special work handling
  166. local index
  167. __sing-box_index_of_word "${prev}" "${flags_with_completion[@]}"
  168. if [[ ${index} -ge 0 ]]; then
  169. ${flags_completion[${index}]}
  170. return
  171. fi
  172. # we are parsing a flag and don't have a special handler, no completion
  173. if [[ ${cur} != "${words[cword]}" ]]; then
  174. return
  175. fi
  176. local completions
  177. completions=("${commands[@]}")
  178. if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then
  179. completions+=("${must_have_one_noun[@]}")
  180. elif [[ -n "${has_completion_function}" ]]; then
  181. # if a go completion function is provided, defer to that function
  182. __sing-box_handle_go_custom_completion
  183. fi
  184. if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then
  185. completions+=("${must_have_one_flag[@]}")
  186. fi
  187. while IFS='' read -r comp; do
  188. COMPREPLY+=("$comp")
  189. done < <(compgen -W "${completions[*]}" -- "$cur")
  190. if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then
  191. while IFS='' read -r comp; do
  192. COMPREPLY+=("$comp")
  193. done < <(compgen -W "${noun_aliases[*]}" -- "$cur")
  194. fi
  195. if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
  196. if declare -F __sing-box_custom_func >/dev/null; then
  197. # try command name qualified custom func
  198. __sing-box_custom_func
  199. else
  200. # otherwise fall back to unqualified for compatibility
  201. declare -F __custom_func >/dev/null && __custom_func
  202. fi
  203. fi
  204. # available in bash-completion >= 2, not always present on macOS
  205. if declare -F __ltrim_colon_completions >/dev/null; then
  206. __ltrim_colon_completions "$cur"
  207. fi
  208. # If there is only 1 completion and it is a flag with an = it will be completed
  209. # but we don't want a space after the =
  210. if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then
  211. compopt -o nospace
  212. fi
  213. }
  214. # The arguments should be in the form "ext1|ext2|extn"
  215. __sing-box_handle_filename_extension_flag()
  216. {
  217. local ext="$1"
  218. _filedir "@(${ext})"
  219. }
  220. __sing-box_handle_subdirs_in_dir_flag()
  221. {
  222. local dir="$1"
  223. pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return
  224. }
  225. __sing-box_handle_flag()
  226. {
  227. __sing-box_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
  228. # if a command required a flag, and we found it, unset must_have_one_flag()
  229. local flagname=${words[c]}
  230. local flagvalue=""
  231. # if the word contained an =
  232. if [[ ${words[c]} == *"="* ]]; then
  233. flagvalue=${flagname#*=} # take in as flagvalue after the =
  234. flagname=${flagname%=*} # strip everything after the =
  235. flagname="${flagname}=" # but put the = back
  236. fi
  237. __sing-box_debug "${FUNCNAME[0]}: looking for ${flagname}"
  238. if __sing-box_contains_word "${flagname}" "${must_have_one_flag[@]}"; then
  239. must_have_one_flag=()
  240. fi
  241. # if you set a flag which only applies to this command, don't show subcommands
  242. if __sing-box_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then
  243. commands=()
  244. fi
  245. # keep flag value with flagname as flaghash
  246. # flaghash variable is an associative array which is only supported in bash > 3.
  247. if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then
  248. if [ -n "${flagvalue}" ] ; then
  249. flaghash[${flagname}]=${flagvalue}
  250. elif [ -n "${words[ $((c+1)) ]}" ] ; then
  251. flaghash[${flagname}]=${words[ $((c+1)) ]}
  252. else
  253. flaghash[${flagname}]="true" # pad "true" for bool flag
  254. fi
  255. fi
  256. # skip the argument to a two word flag
  257. if [[ ${words[c]} != *"="* ]] && __sing-box_contains_word "${words[c]}" "${two_word_flags[@]}"; then
  258. __sing-box_debug "${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument"
  259. c=$((c+1))
  260. # if we are looking for a flags value, don't show commands
  261. if [[ $c -eq $cword ]]; then
  262. commands=()
  263. fi
  264. fi
  265. c=$((c+1))
  266. }
  267. __sing-box_handle_noun()
  268. {
  269. __sing-box_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
  270. if __sing-box_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then
  271. must_have_one_noun=()
  272. elif __sing-box_contains_word "${words[c]}" "${noun_aliases[@]}"; then
  273. must_have_one_noun=()
  274. fi
  275. nouns+=("${words[c]}")
  276. c=$((c+1))
  277. }
  278. __sing-box_handle_command()
  279. {
  280. __sing-box_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
  281. local next_command
  282. if [[ -n ${last_command} ]]; then
  283. next_command="_${last_command}_${words[c]//:/__}"
  284. else
  285. if [[ $c -eq 0 ]]; then
  286. next_command="_sing-box_root_command"
  287. else
  288. next_command="_${words[c]//:/__}"
  289. fi
  290. fi
  291. c=$((c+1))
  292. __sing-box_debug "${FUNCNAME[0]}: looking for ${next_command}"
  293. declare -F "$next_command" >/dev/null && $next_command
  294. }
  295. __sing-box_handle_word()
  296. {
  297. if [[ $c -ge $cword ]]; then
  298. __sing-box_handle_reply
  299. return
  300. fi
  301. __sing-box_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
  302. if [[ "${words[c]}" == -* ]]; then
  303. __sing-box_handle_flag
  304. elif __sing-box_contains_word "${words[c]}" "${commands[@]}"; then
  305. __sing-box_handle_command
  306. elif [[ $c -eq 0 ]]; then
  307. __sing-box_handle_command
  308. elif __sing-box_contains_word "${words[c]}" "${command_aliases[@]}"; then
  309. # aliashash variable is an associative array which is only supported in bash > 3.
  310. if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then
  311. words[c]=${aliashash[${words[c]}]}
  312. __sing-box_handle_command
  313. else
  314. __sing-box_handle_noun
  315. fi
  316. else
  317. __sing-box_handle_noun
  318. fi
  319. __sing-box_handle_word
  320. }
  321. _sing-box_check()
  322. {
  323. last_command="sing-box_check"
  324. command_aliases=()
  325. commands=()
  326. flags=()
  327. two_word_flags=()
  328. local_nonpersistent_flags=()
  329. flags_with_completion=()
  330. flags_completion=()
  331. flags+=("--config=")
  332. two_word_flags+=("--config")
  333. two_word_flags+=("-c")
  334. flags+=("--config-directory=")
  335. two_word_flags+=("--config-directory")
  336. two_word_flags+=("-C")
  337. flags+=("--directory=")
  338. two_word_flags+=("--directory")
  339. two_word_flags+=("-D")
  340. flags+=("--disable-color")
  341. must_have_one_flag=()
  342. must_have_one_noun=()
  343. noun_aliases=()
  344. }
  345. _sing-box_format()
  346. {
  347. last_command="sing-box_format"
  348. command_aliases=()
  349. commands=()
  350. flags=()
  351. two_word_flags=()
  352. local_nonpersistent_flags=()
  353. flags_with_completion=()
  354. flags_completion=()
  355. flags+=("--write")
  356. flags+=("-w")
  357. local_nonpersistent_flags+=("--write")
  358. local_nonpersistent_flags+=("-w")
  359. flags+=("--config=")
  360. two_word_flags+=("--config")
  361. two_word_flags+=("-c")
  362. flags+=("--config-directory=")
  363. two_word_flags+=("--config-directory")
  364. two_word_flags+=("-C")
  365. flags+=("--directory=")
  366. two_word_flags+=("--directory")
  367. two_word_flags+=("-D")
  368. flags+=("--disable-color")
  369. must_have_one_flag=()
  370. must_have_one_noun=()
  371. noun_aliases=()
  372. }
  373. _sing-box_generate_ech-keypair()
  374. {
  375. last_command="sing-box_generate_ech-keypair"
  376. command_aliases=()
  377. commands=()
  378. flags=()
  379. two_word_flags=()
  380. local_nonpersistent_flags=()
  381. flags_with_completion=()
  382. flags_completion=()
  383. flags+=("--pq-signature-schemes-enabled")
  384. local_nonpersistent_flags+=("--pq-signature-schemes-enabled")
  385. flags+=("--config=")
  386. two_word_flags+=("--config")
  387. two_word_flags+=("-c")
  388. flags+=("--config-directory=")
  389. two_word_flags+=("--config-directory")
  390. two_word_flags+=("-C")
  391. flags+=("--directory=")
  392. two_word_flags+=("--directory")
  393. two_word_flags+=("-D")
  394. flags+=("--disable-color")
  395. must_have_one_flag=()
  396. must_have_one_noun=()
  397. noun_aliases=()
  398. }
  399. _sing-box_generate_rand()
  400. {
  401. last_command="sing-box_generate_rand"
  402. command_aliases=()
  403. commands=()
  404. flags=()
  405. two_word_flags=()
  406. local_nonpersistent_flags=()
  407. flags_with_completion=()
  408. flags_completion=()
  409. flags+=("--base64")
  410. local_nonpersistent_flags+=("--base64")
  411. flags+=("--hex")
  412. local_nonpersistent_flags+=("--hex")
  413. flags+=("--config=")
  414. two_word_flags+=("--config")
  415. two_word_flags+=("-c")
  416. flags+=("--config-directory=")
  417. two_word_flags+=("--config-directory")
  418. two_word_flags+=("-C")
  419. flags+=("--directory=")
  420. two_word_flags+=("--directory")
  421. two_word_flags+=("-D")
  422. flags+=("--disable-color")
  423. must_have_one_flag=()
  424. must_have_one_noun=()
  425. noun_aliases=()
  426. }
  427. _sing-box_generate_reality-keypair()
  428. {
  429. last_command="sing-box_generate_reality-keypair"
  430. command_aliases=()
  431. commands=()
  432. flags=()
  433. two_word_flags=()
  434. local_nonpersistent_flags=()
  435. flags_with_completion=()
  436. flags_completion=()
  437. flags+=("--config=")
  438. two_word_flags+=("--config")
  439. two_word_flags+=("-c")
  440. flags+=("--config-directory=")
  441. two_word_flags+=("--config-directory")
  442. two_word_flags+=("-C")
  443. flags+=("--directory=")
  444. two_word_flags+=("--directory")
  445. two_word_flags+=("-D")
  446. flags+=("--disable-color")
  447. must_have_one_flag=()
  448. must_have_one_noun=()
  449. noun_aliases=()
  450. }
  451. _sing-box_generate_tls-keypair()
  452. {
  453. last_command="sing-box_generate_tls-keypair"
  454. command_aliases=()
  455. commands=()
  456. flags=()
  457. two_word_flags=()
  458. local_nonpersistent_flags=()
  459. flags_with_completion=()
  460. flags_completion=()
  461. flags+=("--months=")
  462. two_word_flags+=("--months")
  463. two_word_flags+=("-m")
  464. local_nonpersistent_flags+=("--months")
  465. local_nonpersistent_flags+=("--months=")
  466. local_nonpersistent_flags+=("-m")
  467. flags+=("--config=")
  468. two_word_flags+=("--config")
  469. two_word_flags+=("-c")
  470. flags+=("--config-directory=")
  471. two_word_flags+=("--config-directory")
  472. two_word_flags+=("-C")
  473. flags+=("--directory=")
  474. two_word_flags+=("--directory")
  475. two_word_flags+=("-D")
  476. flags+=("--disable-color")
  477. must_have_one_flag=()
  478. must_have_one_noun=()
  479. noun_aliases=()
  480. }
  481. _sing-box_generate_uuid()
  482. {
  483. last_command="sing-box_generate_uuid"
  484. command_aliases=()
  485. commands=()
  486. flags=()
  487. two_word_flags=()
  488. local_nonpersistent_flags=()
  489. flags_with_completion=()
  490. flags_completion=()
  491. flags+=("--config=")
  492. two_word_flags+=("--config")
  493. two_word_flags+=("-c")
  494. flags+=("--config-directory=")
  495. two_word_flags+=("--config-directory")
  496. two_word_flags+=("-C")
  497. flags+=("--directory=")
  498. two_word_flags+=("--directory")
  499. two_word_flags+=("-D")
  500. flags+=("--disable-color")
  501. must_have_one_flag=()
  502. must_have_one_noun=()
  503. noun_aliases=()
  504. }
  505. _sing-box_generate_vapid-keypair()
  506. {
  507. last_command="sing-box_generate_vapid-keypair"
  508. command_aliases=()
  509. commands=()
  510. flags=()
  511. two_word_flags=()
  512. local_nonpersistent_flags=()
  513. flags_with_completion=()
  514. flags_completion=()
  515. flags+=("--config=")
  516. two_word_flags+=("--config")
  517. two_word_flags+=("-c")
  518. flags+=("--config-directory=")
  519. two_word_flags+=("--config-directory")
  520. two_word_flags+=("-C")
  521. flags+=("--directory=")
  522. two_word_flags+=("--directory")
  523. two_word_flags+=("-D")
  524. flags+=("--disable-color")
  525. must_have_one_flag=()
  526. must_have_one_noun=()
  527. noun_aliases=()
  528. }
  529. _sing-box_generate_wg-keypair()
  530. {
  531. last_command="sing-box_generate_wg-keypair"
  532. command_aliases=()
  533. commands=()
  534. flags=()
  535. two_word_flags=()
  536. local_nonpersistent_flags=()
  537. flags_with_completion=()
  538. flags_completion=()
  539. flags+=("--config=")
  540. two_word_flags+=("--config")
  541. two_word_flags+=("-c")
  542. flags+=("--config-directory=")
  543. two_word_flags+=("--config-directory")
  544. two_word_flags+=("-C")
  545. flags+=("--directory=")
  546. two_word_flags+=("--directory")
  547. two_word_flags+=("-D")
  548. flags+=("--disable-color")
  549. must_have_one_flag=()
  550. must_have_one_noun=()
  551. noun_aliases=()
  552. }
  553. _sing-box_generate()
  554. {
  555. last_command="sing-box_generate"
  556. command_aliases=()
  557. commands=()
  558. commands+=("ech-keypair")
  559. commands+=("rand")
  560. commands+=("reality-keypair")
  561. commands+=("tls-keypair")
  562. commands+=("uuid")
  563. commands+=("vapid-keypair")
  564. commands+=("wg-keypair")
  565. flags=()
  566. two_word_flags=()
  567. local_nonpersistent_flags=()
  568. flags_with_completion=()
  569. flags_completion=()
  570. flags+=("--config=")
  571. two_word_flags+=("--config")
  572. two_word_flags+=("-c")
  573. flags+=("--config-directory=")
  574. two_word_flags+=("--config-directory")
  575. two_word_flags+=("-C")
  576. flags+=("--directory=")
  577. two_word_flags+=("--directory")
  578. two_word_flags+=("-D")
  579. flags+=("--disable-color")
  580. must_have_one_flag=()
  581. must_have_one_noun=()
  582. noun_aliases=()
  583. }
  584. _sing-box_geoip_export()
  585. {
  586. last_command="sing-box_geoip_export"
  587. command_aliases=()
  588. commands=()
  589. flags=()
  590. two_word_flags=()
  591. local_nonpersistent_flags=()
  592. flags_with_completion=()
  593. flags_completion=()
  594. flags+=("--output=")
  595. two_word_flags+=("--output")
  596. two_word_flags+=("-o")
  597. local_nonpersistent_flags+=("--output")
  598. local_nonpersistent_flags+=("--output=")
  599. local_nonpersistent_flags+=("-o")
  600. flags+=("--config=")
  601. two_word_flags+=("--config")
  602. two_word_flags+=("-c")
  603. flags+=("--config-directory=")
  604. two_word_flags+=("--config-directory")
  605. two_word_flags+=("-C")
  606. flags+=("--directory=")
  607. two_word_flags+=("--directory")
  608. two_word_flags+=("-D")
  609. flags+=("--disable-color")
  610. flags+=("--file=")
  611. two_word_flags+=("--file")
  612. two_word_flags+=("-f")
  613. must_have_one_flag=()
  614. must_have_one_noun=()
  615. noun_aliases=()
  616. }
  617. _sing-box_geoip_list()
  618. {
  619. last_command="sing-box_geoip_list"
  620. command_aliases=()
  621. commands=()
  622. flags=()
  623. two_word_flags=()
  624. local_nonpersistent_flags=()
  625. flags_with_completion=()
  626. flags_completion=()
  627. flags+=("--config=")
  628. two_word_flags+=("--config")
  629. two_word_flags+=("-c")
  630. flags+=("--config-directory=")
  631. two_word_flags+=("--config-directory")
  632. two_word_flags+=("-C")
  633. flags+=("--directory=")
  634. two_word_flags+=("--directory")
  635. two_word_flags+=("-D")
  636. flags+=("--disable-color")
  637. flags+=("--file=")
  638. two_word_flags+=("--file")
  639. two_word_flags+=("-f")
  640. must_have_one_flag=()
  641. must_have_one_noun=()
  642. noun_aliases=()
  643. }
  644. _sing-box_geoip_lookup()
  645. {
  646. last_command="sing-box_geoip_lookup"
  647. command_aliases=()
  648. commands=()
  649. flags=()
  650. two_word_flags=()
  651. local_nonpersistent_flags=()
  652. flags_with_completion=()
  653. flags_completion=()
  654. flags+=("--config=")
  655. two_word_flags+=("--config")
  656. two_word_flags+=("-c")
  657. flags+=("--config-directory=")
  658. two_word_flags+=("--config-directory")
  659. two_word_flags+=("-C")
  660. flags+=("--directory=")
  661. two_word_flags+=("--directory")
  662. two_word_flags+=("-D")
  663. flags+=("--disable-color")
  664. flags+=("--file=")
  665. two_word_flags+=("--file")
  666. two_word_flags+=("-f")
  667. must_have_one_flag=()
  668. must_have_one_noun=()
  669. noun_aliases=()
  670. }
  671. _sing-box_geoip()
  672. {
  673. last_command="sing-box_geoip"
  674. command_aliases=()
  675. commands=()
  676. commands+=("export")
  677. commands+=("list")
  678. commands+=("lookup")
  679. flags=()
  680. two_word_flags=()
  681. local_nonpersistent_flags=()
  682. flags_with_completion=()
  683. flags_completion=()
  684. flags+=("--file=")
  685. two_word_flags+=("--file")
  686. two_word_flags+=("-f")
  687. flags+=("--config=")
  688. two_word_flags+=("--config")
  689. two_word_flags+=("-c")
  690. flags+=("--config-directory=")
  691. two_word_flags+=("--config-directory")
  692. two_word_flags+=("-C")
  693. flags+=("--directory=")
  694. two_word_flags+=("--directory")
  695. two_word_flags+=("-D")
  696. flags+=("--disable-color")
  697. must_have_one_flag=()
  698. must_have_one_noun=()
  699. noun_aliases=()
  700. }
  701. _sing-box_geosite_export()
  702. {
  703. last_command="sing-box_geosite_export"
  704. command_aliases=()
  705. commands=()
  706. flags=()
  707. two_word_flags=()
  708. local_nonpersistent_flags=()
  709. flags_with_completion=()
  710. flags_completion=()
  711. flags+=("--output=")
  712. two_word_flags+=("--output")
  713. two_word_flags+=("-o")
  714. local_nonpersistent_flags+=("--output")
  715. local_nonpersistent_flags+=("--output=")
  716. local_nonpersistent_flags+=("-o")
  717. flags+=("--config=")
  718. two_word_flags+=("--config")
  719. two_word_flags+=("-c")
  720. flags+=("--config-directory=")
  721. two_word_flags+=("--config-directory")
  722. two_word_flags+=("-C")
  723. flags+=("--directory=")
  724. two_word_flags+=("--directory")
  725. two_word_flags+=("-D")
  726. flags+=("--disable-color")
  727. flags+=("--file=")
  728. two_word_flags+=("--file")
  729. two_word_flags+=("-f")
  730. must_have_one_flag=()
  731. must_have_one_noun=()
  732. noun_aliases=()
  733. }
  734. _sing-box_geosite_list()
  735. {
  736. last_command="sing-box_geosite_list"
  737. command_aliases=()
  738. commands=()
  739. flags=()
  740. two_word_flags=()
  741. local_nonpersistent_flags=()
  742. flags_with_completion=()
  743. flags_completion=()
  744. flags+=("--config=")
  745. two_word_flags+=("--config")
  746. two_word_flags+=("-c")
  747. flags+=("--config-directory=")
  748. two_word_flags+=("--config-directory")
  749. two_word_flags+=("-C")
  750. flags+=("--directory=")
  751. two_word_flags+=("--directory")
  752. two_word_flags+=("-D")
  753. flags+=("--disable-color")
  754. flags+=("--file=")
  755. two_word_flags+=("--file")
  756. two_word_flags+=("-f")
  757. must_have_one_flag=()
  758. must_have_one_noun=()
  759. noun_aliases=()
  760. }
  761. _sing-box_geosite_lookup()
  762. {
  763. last_command="sing-box_geosite_lookup"
  764. command_aliases=()
  765. commands=()
  766. flags=()
  767. two_word_flags=()
  768. local_nonpersistent_flags=()
  769. flags_with_completion=()
  770. flags_completion=()
  771. flags+=("--config=")
  772. two_word_flags+=("--config")
  773. two_word_flags+=("-c")
  774. flags+=("--config-directory=")
  775. two_word_flags+=("--config-directory")
  776. two_word_flags+=("-C")
  777. flags+=("--directory=")
  778. two_word_flags+=("--directory")
  779. two_word_flags+=("-D")
  780. flags+=("--disable-color")
  781. flags+=("--file=")
  782. two_word_flags+=("--file")
  783. two_word_flags+=("-f")
  784. must_have_one_flag=()
  785. must_have_one_noun=()
  786. noun_aliases=()
  787. }
  788. _sing-box_geosite()
  789. {
  790. last_command="sing-box_geosite"
  791. command_aliases=()
  792. commands=()
  793. commands+=("export")
  794. commands+=("list")
  795. commands+=("lookup")
  796. flags=()
  797. two_word_flags=()
  798. local_nonpersistent_flags=()
  799. flags_with_completion=()
  800. flags_completion=()
  801. flags+=("--file=")
  802. two_word_flags+=("--file")
  803. two_word_flags+=("-f")
  804. flags+=("--config=")
  805. two_word_flags+=("--config")
  806. two_word_flags+=("-c")
  807. flags+=("--config-directory=")
  808. two_word_flags+=("--config-directory")
  809. two_word_flags+=("-C")
  810. flags+=("--directory=")
  811. two_word_flags+=("--directory")
  812. two_word_flags+=("-D")
  813. flags+=("--disable-color")
  814. must_have_one_flag=()
  815. must_have_one_noun=()
  816. noun_aliases=()
  817. }
  818. _sing-box_merge()
  819. {
  820. last_command="sing-box_merge"
  821. command_aliases=()
  822. commands=()
  823. flags=()
  824. two_word_flags=()
  825. local_nonpersistent_flags=()
  826. flags_with_completion=()
  827. flags_completion=()
  828. flags+=("--config=")
  829. two_word_flags+=("--config")
  830. two_word_flags+=("-c")
  831. flags+=("--config-directory=")
  832. two_word_flags+=("--config-directory")
  833. two_word_flags+=("-C")
  834. flags+=("--directory=")
  835. two_word_flags+=("--directory")
  836. two_word_flags+=("-D")
  837. flags+=("--disable-color")
  838. must_have_one_flag=()
  839. must_have_one_noun=()
  840. noun_aliases=()
  841. }
  842. _sing-box_rule-set_compile()
  843. {
  844. last_command="sing-box_rule-set_compile"
  845. command_aliases=()
  846. commands=()
  847. flags=()
  848. two_word_flags=()
  849. local_nonpersistent_flags=()
  850. flags_with_completion=()
  851. flags_completion=()
  852. flags+=("--output=")
  853. two_word_flags+=("--output")
  854. two_word_flags+=("-o")
  855. local_nonpersistent_flags+=("--output")
  856. local_nonpersistent_flags+=("--output=")
  857. local_nonpersistent_flags+=("-o")
  858. flags+=("--config=")
  859. two_word_flags+=("--config")
  860. two_word_flags+=("-c")
  861. flags+=("--config-directory=")
  862. two_word_flags+=("--config-directory")
  863. two_word_flags+=("-C")
  864. flags+=("--directory=")
  865. two_word_flags+=("--directory")
  866. two_word_flags+=("-D")
  867. flags+=("--disable-color")
  868. must_have_one_flag=()
  869. must_have_one_noun=()
  870. noun_aliases=()
  871. }
  872. _sing-box_rule-set_convert()
  873. {
  874. last_command="sing-box_rule-set_convert"
  875. command_aliases=()
  876. commands=()
  877. flags=()
  878. two_word_flags=()
  879. local_nonpersistent_flags=()
  880. flags_with_completion=()
  881. flags_completion=()
  882. flags+=("--output=")
  883. two_word_flags+=("--output")
  884. two_word_flags+=("-o")
  885. local_nonpersistent_flags+=("--output")
  886. local_nonpersistent_flags+=("--output=")
  887. local_nonpersistent_flags+=("-o")
  888. flags+=("--type=")
  889. two_word_flags+=("--type")
  890. two_word_flags+=("-t")
  891. local_nonpersistent_flags+=("--type")
  892. local_nonpersistent_flags+=("--type=")
  893. local_nonpersistent_flags+=("-t")
  894. flags+=("--config=")
  895. two_word_flags+=("--config")
  896. two_word_flags+=("-c")
  897. flags+=("--config-directory=")
  898. two_word_flags+=("--config-directory")
  899. two_word_flags+=("-C")
  900. flags+=("--directory=")
  901. two_word_flags+=("--directory")
  902. two_word_flags+=("-D")
  903. flags+=("--disable-color")
  904. must_have_one_flag=()
  905. must_have_one_noun=()
  906. noun_aliases=()
  907. }
  908. _sing-box_rule-set_decompile()
  909. {
  910. last_command="sing-box_rule-set_decompile"
  911. command_aliases=()
  912. commands=()
  913. flags=()
  914. two_word_flags=()
  915. local_nonpersistent_flags=()
  916. flags_with_completion=()
  917. flags_completion=()
  918. flags+=("--output=")
  919. two_word_flags+=("--output")
  920. two_word_flags+=("-o")
  921. local_nonpersistent_flags+=("--output")
  922. local_nonpersistent_flags+=("--output=")
  923. local_nonpersistent_flags+=("-o")
  924. flags+=("--config=")
  925. two_word_flags+=("--config")
  926. two_word_flags+=("-c")
  927. flags+=("--config-directory=")
  928. two_word_flags+=("--config-directory")
  929. two_word_flags+=("-C")
  930. flags+=("--directory=")
  931. two_word_flags+=("--directory")
  932. two_word_flags+=("-D")
  933. flags+=("--disable-color")
  934. must_have_one_flag=()
  935. must_have_one_noun=()
  936. noun_aliases=()
  937. }
  938. _sing-box_rule-set_format()
  939. {
  940. last_command="sing-box_rule-set_format"
  941. command_aliases=()
  942. commands=()
  943. flags=()
  944. two_word_flags=()
  945. local_nonpersistent_flags=()
  946. flags_with_completion=()
  947. flags_completion=()
  948. flags+=("--write")
  949. flags+=("-w")
  950. local_nonpersistent_flags+=("--write")
  951. local_nonpersistent_flags+=("-w")
  952. flags+=("--config=")
  953. two_word_flags+=("--config")
  954. two_word_flags+=("-c")
  955. flags+=("--config-directory=")
  956. two_word_flags+=("--config-directory")
  957. two_word_flags+=("-C")
  958. flags+=("--directory=")
  959. two_word_flags+=("--directory")
  960. two_word_flags+=("-D")
  961. flags+=("--disable-color")
  962. must_have_one_flag=()
  963. must_have_one_noun=()
  964. noun_aliases=()
  965. }
  966. _sing-box_rule-set_match()
  967. {
  968. last_command="sing-box_rule-set_match"
  969. command_aliases=()
  970. commands=()
  971. flags=()
  972. two_word_flags=()
  973. local_nonpersistent_flags=()
  974. flags_with_completion=()
  975. flags_completion=()
  976. flags+=("--format=")
  977. two_word_flags+=("--format")
  978. two_word_flags+=("-f")
  979. local_nonpersistent_flags+=("--format")
  980. local_nonpersistent_flags+=("--format=")
  981. local_nonpersistent_flags+=("-f")
  982. flags+=("--config=")
  983. two_word_flags+=("--config")
  984. two_word_flags+=("-c")
  985. flags+=("--config-directory=")
  986. two_word_flags+=("--config-directory")
  987. two_word_flags+=("-C")
  988. flags+=("--directory=")
  989. two_word_flags+=("--directory")
  990. two_word_flags+=("-D")
  991. flags+=("--disable-color")
  992. must_have_one_flag=()
  993. must_have_one_noun=()
  994. noun_aliases=()
  995. }
  996. _sing-box_rule-set_merge()
  997. {
  998. last_command="sing-box_rule-set_merge"
  999. command_aliases=()
  1000. commands=()
  1001. flags=()
  1002. two_word_flags=()
  1003. local_nonpersistent_flags=()
  1004. flags_with_completion=()
  1005. flags_completion=()
  1006. flags+=("--config=")
  1007. two_word_flags+=("--config")
  1008. two_word_flags+=("-c")
  1009. flags+=("--config-directory=")
  1010. two_word_flags+=("--config-directory")
  1011. two_word_flags+=("-C")
  1012. flags+=("--directory=")
  1013. two_word_flags+=("--directory")
  1014. two_word_flags+=("-D")
  1015. flags+=("--disable-color")
  1016. must_have_one_flag=()
  1017. must_have_one_noun=()
  1018. noun_aliases=()
  1019. }
  1020. _sing-box_rule-set_upgrade()
  1021. {
  1022. last_command="sing-box_rule-set_upgrade"
  1023. command_aliases=()
  1024. commands=()
  1025. flags=()
  1026. two_word_flags=()
  1027. local_nonpersistent_flags=()
  1028. flags_with_completion=()
  1029. flags_completion=()
  1030. flags+=("--write")
  1031. flags+=("-w")
  1032. local_nonpersistent_flags+=("--write")
  1033. local_nonpersistent_flags+=("-w")
  1034. flags+=("--config=")
  1035. two_word_flags+=("--config")
  1036. two_word_flags+=("-c")
  1037. flags+=("--config-directory=")
  1038. two_word_flags+=("--config-directory")
  1039. two_word_flags+=("-C")
  1040. flags+=("--directory=")
  1041. two_word_flags+=("--directory")
  1042. two_word_flags+=("-D")
  1043. flags+=("--disable-color")
  1044. must_have_one_flag=()
  1045. must_have_one_noun=()
  1046. noun_aliases=()
  1047. }
  1048. _sing-box_rule-set()
  1049. {
  1050. last_command="sing-box_rule-set"
  1051. command_aliases=()
  1052. commands=()
  1053. commands+=("compile")
  1054. commands+=("convert")
  1055. commands+=("decompile")
  1056. commands+=("format")
  1057. commands+=("match")
  1058. commands+=("merge")
  1059. commands+=("upgrade")
  1060. flags=()
  1061. two_word_flags=()
  1062. local_nonpersistent_flags=()
  1063. flags_with_completion=()
  1064. flags_completion=()
  1065. flags+=("--config=")
  1066. two_word_flags+=("--config")
  1067. two_word_flags+=("-c")
  1068. flags+=("--config-directory=")
  1069. two_word_flags+=("--config-directory")
  1070. two_word_flags+=("-C")
  1071. flags+=("--directory=")
  1072. two_word_flags+=("--directory")
  1073. two_word_flags+=("-D")
  1074. flags+=("--disable-color")
  1075. must_have_one_flag=()
  1076. must_have_one_noun=()
  1077. noun_aliases=()
  1078. }
  1079. _sing-box_run()
  1080. {
  1081. last_command="sing-box_run"
  1082. command_aliases=()
  1083. commands=()
  1084. flags=()
  1085. two_word_flags=()
  1086. local_nonpersistent_flags=()
  1087. flags_with_completion=()
  1088. flags_completion=()
  1089. flags+=("--config=")
  1090. two_word_flags+=("--config")
  1091. two_word_flags+=("-c")
  1092. flags+=("--config-directory=")
  1093. two_word_flags+=("--config-directory")
  1094. two_word_flags+=("-C")
  1095. flags+=("--directory=")
  1096. two_word_flags+=("--directory")
  1097. two_word_flags+=("-D")
  1098. flags+=("--disable-color")
  1099. must_have_one_flag=()
  1100. must_have_one_noun=()
  1101. noun_aliases=()
  1102. }
  1103. _sing-box_tools_connect()
  1104. {
  1105. last_command="sing-box_tools_connect"
  1106. command_aliases=()
  1107. commands=()
  1108. flags=()
  1109. two_word_flags=()
  1110. local_nonpersistent_flags=()
  1111. flags_with_completion=()
  1112. flags_completion=()
  1113. flags+=("--network=")
  1114. two_word_flags+=("--network")
  1115. two_word_flags+=("-n")
  1116. local_nonpersistent_flags+=("--network")
  1117. local_nonpersistent_flags+=("--network=")
  1118. local_nonpersistent_flags+=("-n")
  1119. flags+=("--config=")
  1120. two_word_flags+=("--config")
  1121. two_word_flags+=("-c")
  1122. flags+=("--config-directory=")
  1123. two_word_flags+=("--config-directory")
  1124. two_word_flags+=("-C")
  1125. flags+=("--directory=")
  1126. two_word_flags+=("--directory")
  1127. two_word_flags+=("-D")
  1128. flags+=("--disable-color")
  1129. flags+=("--outbound=")
  1130. two_word_flags+=("--outbound")
  1131. two_word_flags+=("-o")
  1132. must_have_one_flag=()
  1133. must_have_one_noun=()
  1134. noun_aliases=()
  1135. }
  1136. _sing-box_tools_fetch()
  1137. {
  1138. last_command="sing-box_tools_fetch"
  1139. command_aliases=()
  1140. commands=()
  1141. flags=()
  1142. two_word_flags=()
  1143. local_nonpersistent_flags=()
  1144. flags_with_completion=()
  1145. flags_completion=()
  1146. flags+=("--config=")
  1147. two_word_flags+=("--config")
  1148. two_word_flags+=("-c")
  1149. flags+=("--config-directory=")
  1150. two_word_flags+=("--config-directory")
  1151. two_word_flags+=("-C")
  1152. flags+=("--directory=")
  1153. two_word_flags+=("--directory")
  1154. two_word_flags+=("-D")
  1155. flags+=("--disable-color")
  1156. flags+=("--outbound=")
  1157. two_word_flags+=("--outbound")
  1158. two_word_flags+=("-o")
  1159. must_have_one_flag=()
  1160. must_have_one_noun=()
  1161. noun_aliases=()
  1162. }
  1163. _sing-box_tools_synctime()
  1164. {
  1165. last_command="sing-box_tools_synctime"
  1166. command_aliases=()
  1167. commands=()
  1168. flags=()
  1169. two_word_flags=()
  1170. local_nonpersistent_flags=()
  1171. flags_with_completion=()
  1172. flags_completion=()
  1173. flags+=("--format=")
  1174. two_word_flags+=("--format")
  1175. two_word_flags+=("-f")
  1176. local_nonpersistent_flags+=("--format")
  1177. local_nonpersistent_flags+=("--format=")
  1178. local_nonpersistent_flags+=("-f")
  1179. flags+=("--server=")
  1180. two_word_flags+=("--server")
  1181. two_word_flags+=("-s")
  1182. local_nonpersistent_flags+=("--server")
  1183. local_nonpersistent_flags+=("--server=")
  1184. local_nonpersistent_flags+=("-s")
  1185. flags+=("--write")
  1186. flags+=("-w")
  1187. local_nonpersistent_flags+=("--write")
  1188. local_nonpersistent_flags+=("-w")
  1189. flags+=("--config=")
  1190. two_word_flags+=("--config")
  1191. two_word_flags+=("-c")
  1192. flags+=("--config-directory=")
  1193. two_word_flags+=("--config-directory")
  1194. two_word_flags+=("-C")
  1195. flags+=("--directory=")
  1196. two_word_flags+=("--directory")
  1197. two_word_flags+=("-D")
  1198. flags+=("--disable-color")
  1199. flags+=("--outbound=")
  1200. two_word_flags+=("--outbound")
  1201. two_word_flags+=("-o")
  1202. must_have_one_flag=()
  1203. must_have_one_noun=()
  1204. noun_aliases=()
  1205. }
  1206. _sing-box_tools()
  1207. {
  1208. last_command="sing-box_tools"
  1209. command_aliases=()
  1210. commands=()
  1211. commands+=("connect")
  1212. commands+=("fetch")
  1213. commands+=("synctime")
  1214. flags=()
  1215. two_word_flags=()
  1216. local_nonpersistent_flags=()
  1217. flags_with_completion=()
  1218. flags_completion=()
  1219. flags+=("--outbound=")
  1220. two_word_flags+=("--outbound")
  1221. two_word_flags+=("-o")
  1222. flags+=("--config=")
  1223. two_word_flags+=("--config")
  1224. two_word_flags+=("-c")
  1225. flags+=("--config-directory=")
  1226. two_word_flags+=("--config-directory")
  1227. two_word_flags+=("-C")
  1228. flags+=("--directory=")
  1229. two_word_flags+=("--directory")
  1230. two_word_flags+=("-D")
  1231. flags+=("--disable-color")
  1232. must_have_one_flag=()
  1233. must_have_one_noun=()
  1234. noun_aliases=()
  1235. }
  1236. _sing-box_version()
  1237. {
  1238. last_command="sing-box_version"
  1239. command_aliases=()
  1240. commands=()
  1241. flags=()
  1242. two_word_flags=()
  1243. local_nonpersistent_flags=()
  1244. flags_with_completion=()
  1245. flags_completion=()
  1246. flags+=("--name")
  1247. flags+=("-n")
  1248. local_nonpersistent_flags+=("--name")
  1249. local_nonpersistent_flags+=("-n")
  1250. flags+=("--config=")
  1251. two_word_flags+=("--config")
  1252. two_word_flags+=("-c")
  1253. flags+=("--config-directory=")
  1254. two_word_flags+=("--config-directory")
  1255. two_word_flags+=("-C")
  1256. flags+=("--directory=")
  1257. two_word_flags+=("--directory")
  1258. two_word_flags+=("-D")
  1259. flags+=("--disable-color")
  1260. must_have_one_flag=()
  1261. must_have_one_noun=()
  1262. noun_aliases=()
  1263. }
  1264. _sing-box_root_command()
  1265. {
  1266. last_command="sing-box"
  1267. command_aliases=()
  1268. commands=()
  1269. commands+=("check")
  1270. commands+=("format")
  1271. commands+=("generate")
  1272. commands+=("geoip")
  1273. commands+=("geosite")
  1274. commands+=("merge")
  1275. commands+=("rule-set")
  1276. commands+=("run")
  1277. commands+=("tools")
  1278. commands+=("version")
  1279. flags=()
  1280. two_word_flags=()
  1281. local_nonpersistent_flags=()
  1282. flags_with_completion=()
  1283. flags_completion=()
  1284. flags+=("--config=")
  1285. two_word_flags+=("--config")
  1286. two_word_flags+=("-c")
  1287. flags+=("--config-directory=")
  1288. two_word_flags+=("--config-directory")
  1289. two_word_flags+=("-C")
  1290. flags+=("--directory=")
  1291. two_word_flags+=("--directory")
  1292. two_word_flags+=("-D")
  1293. flags+=("--disable-color")
  1294. must_have_one_flag=()
  1295. must_have_one_noun=()
  1296. noun_aliases=()
  1297. }
  1298. __start_sing-box()
  1299. {
  1300. local cur prev words cword split
  1301. declare -A flaghash 2>/dev/null || :
  1302. declare -A aliashash 2>/dev/null || :
  1303. if declare -F _init_completion >/dev/null 2>&1; then
  1304. _init_completion -s || return
  1305. else
  1306. __sing-box_init_completion -n "=" || return
  1307. fi
  1308. local c=0
  1309. local flag_parsing_disabled=
  1310. local flags=()
  1311. local two_word_flags=()
  1312. local local_nonpersistent_flags=()
  1313. local flags_with_completion=()
  1314. local flags_completion=()
  1315. local commands=("sing-box")
  1316. local command_aliases=()
  1317. local must_have_one_flag=()
  1318. local must_have_one_noun=()
  1319. local has_completion_function=""
  1320. local last_command=""
  1321. local nouns=()
  1322. local noun_aliases=()
  1323. __sing-box_handle_word
  1324. }
  1325. if [[ $(type -t compopt) = "builtin" ]]; then
  1326. complete -o default -F __start_sing-box sing-box
  1327. else
  1328. complete -o default -o nospace -F __start_sing-box sing-box
  1329. fi
  1330. # ex: ts=4 sw=4 et filetype=sh