为什么当我完成 vim 文件名时,bash 会按 Tab 键扩展波浪符号?

为什么当我完成 vim 文件名时,bash 会按 Tab 键扩展波浪符号?

如果我输入cat ~/.bashr<TAB>那么它就会完成到cat ~/.bashrc

如果我输入vim ~/.bashr<TAB>那么它就会完成到vim /home/neil/.bashrc......

(它对 执行相同操作vi,其别名为"vim"。)

我可以把它关掉吗?

答案1

这由 /etc/bash_completion 控制

如果您不喜欢,可以注释掉 _expand() 中的扩展代码。

这是我在 Fedora 17 中的版本,但您的版本应该类似:

# This function expands tildes in pathnames
#
_expand()
{
    # FIXME: Why was this here?
    #[ "$cur" != "${cur%\\}" ] && cur="$cur\\"

    # Expand ~username type directory specifications.  We want to expand
    # ~foo/... to /home/foo/... to avoid problems when $cur starting with
    # a tilde is fed to commands and ending up quoted instead of expanded.

    if [[ "$cur" == \~*/* ]]; then
        eval cur=$cur
    elif [[ "$cur" == \~* ]]; then
        cur=${cur#\~}
        COMPREPLY=( $( compgen -P '~' -u "$cur" ) )
        [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]}
        return ${#COMPREPLY[@]}
    fi
}

答案2

bash可以为某些命令提供更复杂的自动完成功能(例如,自动完成文件名以外的程序参数)。有这样一个可编程完成vim为系统上的命令定义的函数。

在命令提示符下键入complete将显示使用哪些函数来提供自动完成功能bash

$ complete
complete -o default -F _complete_open open

输入type function_name以了解它们的定义。

$ type _complete_open
_complete_open is a function
_complete_open () 
{ 
   # function definition
}

要找出函数的定义位置,请使用以下命令:

$ shopt -s extdebug
$ declare -F _complete_open
_complete_open 70 /Users/danielbeck/.bash_profile

相关内容