如何创建保留制表符补全功能的别名或函数?

如何创建保留制表符补全功能的别名或函数?

我创建了一个别名来保存使用 systemd 时的一些击键:

$ alias sctl='systemctl'

但是,这会破坏子命令的制表符补全。是否可以在不破坏制表符完成的情况下为命令添加别名?

答案1

首先找出该systemctl命令使用了哪个完整功能:

complete | grep " systemctl$"

输出如下所示:

complete -F _functionname systemctl

然后使用:

complete -F _functionname sctl

来注册该函数来完成你的别名。

现在,当您键入 时,将会出现sctl <tab><tab>与键入时相同的建议。systemctl

答案2

安装后这个工具,你可以这样做:

  • ~/.bash_profile

    alias sctl='systemctl'
    
  • ~/.bash_completion

    complete -F _complete_alias sctl
    
  • 键入sctl <tab>以显示systemctl命令:

    $ sctl <Tab>
    add-requires
    add-wants
    cancel
    cat
    condreload
    ...
    

答案3

我破解了这个,让完成也适用于 systemctl+args。我复制了 bash-completion 源代码的某些部分以供 systemctl 来管理(/usr/share/bash-completion/completions/systemctl)。

alias ssr='sudo systemctl restart'
alias sss='sudo systemctl status'
alias ssp='sudo systemctl stop'

# Load necessary functions in bash-completion's source code for systemctl (get_*_units)
source /usr/share/bash-completion/completions/systemctl
# Manually recreate some functions
_systemctl_status()
{
        comps=$( __get_non_template_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_restart()
{
        comps=$( __get_restartable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_stop()
{
        comps=$( __get_stoppable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

complete -F _systemctl_restart ssr
complete -F _systemctl_status sss
complete -F _systemctl_stop ssp

这可以轻松地扩展到其他 systemctl 命令,只需在源文件中查找正确的 get_*_units 命令并复制我的示例即可。

我还尝试修改 $COMP_WORDS 数组以获得适用于所有命令的通用解决方案,但无济于事。

相关内容