vimファイル名を完成させるときに、bashがチルダをタブ展開するのはなぜですか?


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
Neil

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.