ubuntu 系统里设置 smug start 自动补全

我使用 ubuntu 系统,我希望在执行 smug start 命令时,按 tab 能自动列举 ~/work/config/smug/ 目录下的相关配置文件名,作为自动补全。同时去掉文件名后缀。这样做的好处是不用记录复制配置的文件名,毕竟太多单词我记不住。。。注:smug 的介绍参考:smug 一款用 go 实现的 tmux session manager

Ubuntu 默认一般是 Bash。下面以 Bash 为例,给 smug start 增加 Tab 补全:从 ~/work/config/smug/ 读取 .yml / .yaml 文件,并去掉后缀补全。

1. 创建 Bash 补全脚本

mkdir -p ~/.local/share/bash-completion/completions

cat > ~/.local/share/bash-completion/completions/smug <<'EOF'
_smug_complete() {
    local cur cmd dir f base
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    cmd="${COMP_WORDS[1]:-}"
    dir="$HOME/work/config/smug"

    # 补全 smug 的子命令
    if [[ $COMP_CWORD -eq 1 ]]; then
        COMPREPLY=( $(compgen -W "start stop list edit" -- "$cur") )
        return 0
    fi

    # 只处理:smug start 
    if [[ "$cmd" == "start" && $COMP_CWORD -eq 2 ]]; then
        [[ -d "$dir" ]] || return 0

        while IFS= read -r -d '' f; do
            base="${f##*/}"

            # 去掉 .yml / .yaml 后缀
            case "$base" in
                *.yml)  base="${base%.yml}" ;;
                *.yaml) base="${base%.yaml}" ;;
                *) continue ;;
            esac

            [[ "$base" == "$cur"* ]] && COMPREPLY+=("$base")
        done < <(find "$dir" -maxdepth 1 -type f \( -name '*.yml' -o -name '*.yaml' \) -print0)

        return 0
    fi
}

complete -F _smug_complete smug
EOF

2. 让补全生效

source ~/.local/share/bash-completion/completions/smug

如果新开终端后仍然不生效,可以把下面这行加到 ~/.bashrc:

source ~/.local/share/bash-completion/completions/smug

然后:

source ~/.bashrc

3. 测试

smug start 

如果 ~/work/config/smug/ 下有:

foo.yml
bar.yaml
my-session.yml

那么补全时显示:

foo  bar  my-session

而不是:

foo.yml  bar.yaml  my-session.yml

这样 smug start fo 就会补成 smug start foo。

zsh

如果你使用的是 Zsh,而不是 Bash,可以用这个简版:

# 加到 ~/.zshrc
_smug() {
  local dir="$HOME/work/config/smug"
  local -a sessions
  local f base

  if (( CURRENT == 3 )) && [[ $words[2] == start ]]; then
    for f in "$dir"/*.yml(N) "$dir"/*.yaml(N); do
      base="${f:t}"
      base="${base%.yml}"
      base="${base%.yaml}"
      sessions+=("$base")
    done
    _describe 'smug session' sessions
  else
    _arguments '1:command:(start stop list edit)'
  fi
}

compdef _smug smug

然后:

source ~/.zshrc
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论