github.com/turingchain2020/turingchain@v1.1.21/cmd/cli/autocomplete/bash-completion.md (about) 1 # 命令行自动补全 2 3 目前在ubuntu下用git 等软件你会发现按tab键有提示或补全的功能, 这个功能依赖一个软件包, 叫bash-completion。bash-completion 提供的能力是bash shell 的可编程补全。而turingchain-cli 功能也越来越多,每加一步都看下帮助, 效率不高。 把这个能力加到turingchain-cli里, 应该能提高不少效率。 4 5 ## bash-completion 6 7 bash 自带命令行补全功能,但 由于 bash-completion 可编程,他可以带来更好的补全效果。 8 9 不同的版本安装位置可能不一样, 但工作原理一致。 10 11 工作原理: 12 1. 功能入口一个名为 bash_completion 的脚本, 在shell 初始化时加载。 13 1. bash_completion脚本会加载 completions 目录下补全脚本。 14 1. completions 目录也可能有不一样的名字 如 bash_completion.d 15 1. 目录下一个文件对应一个命令, 和 /etc/init.d/ /etc/rsyslog.d/ 等一样一样的 16 17 ### 熟悉下环境 18 19 先跟踪下我机器上的配置位置,熟悉下环境 20 ``` 21 # ~/.bashrc: # 在shell 初始化时加载 22 if ! shopt -oq posix; then 23 if [ -f /usr/share/bash-completion/bash_completion ]; then 24 . /usr/share/bash-completion/bash_completion 25 elif [ -f /etc/bash_completion ]; then 26 . /etc/bash_completion 27 fi 28 fi 29 30 # /usr/share/bash-completion/ # 补全脚本目录 31 $ find /usr/share/bash-completion/ 32 /usr/share/bash-completion/ # 配置和脚本独立目录 33 /usr/share/bash-completion/bash_completion # 入口脚本 34 /usr/share/bash-completion/completions # 配置脚本目录 35 /usr/share/bash-completion/completions/man # 一个个配置脚本, 我挑了几个看上去熟悉的 36 /usr/share/bash-completion/completions/git 37 /usr/share/bash-completion/completions/xhost 38 /usr/share/bash-completion/completions/route 39 /usr/share/bash-completion/completions/java 40 /usr/share/bash-completion/completions/docker-compose 41 /usr/share/bash-completion/completions/xxd 42 ``` 43 44 ### 补全命令 45 46 bash 自带补全命令, 主要有下面一个命令提供支持 (man bash 可以看到说明) 47 1. compgen: 从候选的单词列表中选出匹配的单词, 补全命令 48 1. complete: 补全参数 49 1. compopt: 修改每个名称指定的补全选项 50 51 compgen 演示 52 ``` 53 # 感觉好简单 54 $ compgen -W "z1 z2 z3 fz1 fz2 f3" z 55 z1 56 z2 57 z3 58 59 # 一下子不好了 60 compgen: 用法: compgen [-abcdefgjksuv] [-o 选项] [-A 动作] [-G 全局模式] [-W 词语列表] [-F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [词语] 61 ``` 62 63 complete 演示 64 ``` 65 # 是不是很简单 66 $ complete -W "account block trc trade token" turingchain-cli 67 linj@linj-TM1701:~$ turingchain-cli t 68 token trade 69 70 # 再次打击 71 complete: 用法: complete [-abcdefgjksuv] [-pr] [-DE] [-o 选项] [-A 动作] [-G 全局模式] [-W 词语列表] [-F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [名称 ...] 72 ``` 73 74 ### bash 支持补全相关的内置变量 75 76 用过c的应该对 __FILE__ __LINE__ 熟悉, bash 为了支持补全同样内置了相关变量 77 78 ``` 79 前缀 COMP, 看后面部分表示变量意思 80 81 补全函数的输出 82 ${COMPREPLY} 一个数组变量,bash从这个变量中读取可编程补全所调用的shell函数生成的补全条目。 83 84 补全函数的输入 85 ${COMP_WORDS} 一个数组变量,包含当前命令行的每个单词 86 ${COMP_CWORD} 光标位置的单词“${COMP_WORDS}”中的下标. 为什么是光标, 输入命令可以可以回到前面修改命令 87 88 补全函数的其他变量 89 ${COMP_LINE} 当前命令行. 切分成 WORDS前的原始命令行 90 ${COMP_POINT} 当前光标位置相对于当前命令行开头的下标。 命令行里的第N个字符 91 92 补全模式 93 ${COMP_KEY} 触发当前补全函数的键,或键序列中的最后一个键。 一直是 9 94 ${COMP_TYPE} 一个整数值,与触发调用补全函数时试图进行补全的类型相对应。 一个tab 9, 多个tab 63 95 96 分割符 97 ${COMP_WORDBREAKS} “readline”库进行单词补全时用作单词分隔的字符,如果没有设置这个变量,即使以后进行重置,它也会失去特殊作用。 98 ``` 99 100 ``` 101 linj@linj-TM1701:~$ turingchain-cli account 102 103 declare -a COMP_WORDS='([0]="turingchain-cli" [1]="account" [2]="")' 104 declare -- COMP_CWORD="2" 105 declare -- COMP_LINE="turingchain-cli account " 106 declare -- COMP_WORDBREAKS=" 107 \"'><=;|&(:" 108 declare -- COMP_KEY="9" 109 declare -- COMP_POINT="20" 110 declare -- COMP_TYPE="9" 111 ``` 112 113 ### 演示程序1 子命令补全 114 115 turingchain-cli 参数补全 116 ``` 117 #!/bin/bash 118 # 通过turingchain-cli 的help 找到一级的子命令 119 subcmd_list=("account" "block" "trc" "close" "coins" "config" "evm" "exec" "hashlock" "help" "mempool" "net" "privacy" "relay" "retrieve" "seed" "send" "stat" "ticket" "token" "trade" "tx" "version" "wallet") 120 # 121 function _subcmd() { 122 local cur 123 COMPREPLY=() 124 cur="${COMP_WORDS[COMP_CWORD]}" 125 COMPREPLY=( $(compgen -W "${subcmd_list[*]}" -- ${cur}) ) 126 return 0 127 } 128 129 # 用 _subcmd 补全 turingchain-cli 130 # _subcmd 通过当前光标所在的输入参数过滤可选的子命令 131 complete -F _subcmd turingchain-cli 132 ``` 133 134 试用一下 135 ``` 136 linj@linj-TM1701:~$ . subcmd.bash 137 linj@linj-TM1701:~$ ./turingchain/turingchain-cli 138 account trc coins evm hashlock mempool privacy retrieve send ticket trade version 139 block close config exec help net relay seed stat token tx wallet 140 linj@linj-TM1701:~$ ./turingchain/turingchain-cli t 141 ticket token trade tx 142 ``` 143 144 ### 生效 145 146 ``` 147 linj@linj-TM1701:~$ sudo install subcmd.bash /usr/share/bash-completion/completions/turingchain-cli 148 # 重新开个窗口就有用了 149 linj@linj-TM1701:~$ ./turingchain/turingchain-cli 150 account trc coins evm hashlock mempool privacy retrieve send ticket trade version 151 block close config exec help net relay seed stat token tx wallet 152 ``` 153 154 ### 给turingchain-cli 做个 bash-completion 155 156 157 地址: https://gitlab.__officeSite__/linj/turingchain-cli-completion 158 159 演示 160 ``` 161 linj@linj-TM1701:~$ ./turingchain/turingchain-cli 162 account trc coins evm hashlock mempool privacy retrieve send ticket trade version 163 block close config exec help net relay seed stat token tx wallet 164 linj@linj-TM1701:~$ ./turingchain/turingchain-cli b 165 block trc 166 linj@linj-TM1701:~$ ./turingchain/turingchain-cli trc 167 priv2priv priv2pub pub2priv send transfer txgroup withdraw 168 linj@linj-TM1701:~$ ./turingchain/turingchain-cli trc t 169 transfer txgroup 170 linj@linj-TM1701:~$ ./turingchain/turingchain-cli trc transfer - 171 -a --amount -h --help -n --note --para --rpc -t --to 172 ```