Чому 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
}

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.