之前在使用 Tmux 时,自己写一个脚步用于快速切换会话,但是苦于没有会话名补全功能,每次都需要先查看会话名,然后才能进行切换,用起来十分麻烦,于是想实现 Shell 的自动补全功能,这样就可以不用去记会话名了。
Programmable Completion
在网上查找一番,发现 Linux 下有个 Programmable Completion 这个功能可以实现,于是尝试了一下果然可以,实现起来也很简单。假设我有一个程序 auto_comp ,我想为它添加自动补全,他包含的选项为: -a -b -c --appen --backup --compare
。其自动补全的实现如下:
新建
auto_comp.sh
,内容如下:# file: auto_comp.sh # 为 auto_comp 程序实现自动补全功能 _auto_comp() { local cur COMPREPLY=() # 用于存放可能的补全结果 cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-a -b -c --appen --backup --compare' -- $cur) ) return 0 } complete -F _auto_comp ./auto_comp
在当前路径下新建 auto_comp 的可执行文件;
- 执行
source auto_comp.sh
命令;
完成上述步骤之后,auto_comp 程序便能在输入 Tab 后给出选项提示。
Tmux 会话补全
之前为了便于管理Tmux的会话,我写了个简单的脚本 stmux 用于创建或者连接到已有的会话,使用比较简单。
usage:
stmux [session_name]
1. 当 stmux 后没有指定会话名且当前没有 Tmux 会话时,stmux 将创建一个新的会话。
2. 当 stmux 后没有指定会话名但当前有 Tmux 会话时,stmux 将连接到第一 Tmux 会话。
3. 当 stmux 后指定会话名时,stmux 将连接到指定的会话。
由于 Tmux 会话名是不确定的且可以随时发生变化,因此我们需要动态获取 Tmux 的会话信息,好在 Tmux 提供了该功能。补全的脚本如下所示。
_stmux_autocomplete ()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
opts=$(tmux ls -F "#{session_name}" 2>/dev/null)
COMPREPLY=( $(compgen -W "$opts" -- $cur) )
return 0
}
complete -F _stmux_autocomplete stmux
更多的配置可以参考我的 Tmux 配置。这种大众化的需求当然已经有人实现了,Github 上 Imomaliev 的 tmux-bash-completion 就是不错的选择。