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  ```