Почему bash tab-раскрывает тильду, когда я заканчиваю имя файла vim?

8

Если я наберу, cat ~/.bashr<TAB>то это завершает cat ~/.bashrc.

Если я наберу, vim ~/.bashr<TAB>то это завершится vim /home/neil/.bashrc...

(Это то же самое vi, что и псевдоним "vim".)

Могу ли я выключить это?

Нил
источник

Ответы:

5

это контролируется / 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
}
johnshen64
источник
1
Расположение сценариев завершения полностью зависит от вашей системы.
Даниэль Бек
хм, может быть. Спасибо. Я использую только Ubuntu / Fedora / Centos в эти дни, и кажется, что файл там. да, если это еще один дистрибутив, я могу представить, что файл / функция находится в другом месте, но, тем не менее, он все еще контролируется только текстовым файлом.
johnshen64
4
Спасибо, я "исправил" мою проблему, определив function _expand() { :;}в моем ~/.bashrc.
Нил
6

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
Даниэль Бек
источник