![为什么当我完成 vim 文件名时,bash 会按 Tab 键扩展波浪符号?](https://linux22.com/image/1320174/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BD%93%E6%88%91%E5%AE%8C%E6%88%90%20vim%20%E6%96%87%E4%BB%B6%E5%90%8D%E6%97%B6%EF%BC%8Cbash%20%E4%BC%9A%E6%8C%89%20Tab%20%E9%94%AE%E6%89%A9%E5%B1%95%E6%B3%A2%E6%B5%AA%E7%AC%A6%E5%8F%B7%EF%BC%9F.png)
如果我输入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