Mengapa bash tab-rentangkan tilde ketika saya mengisi nama file vim?

8

Jika saya mengetik cat ~/.bashr<TAB>maka itu selesai untuk cat ~/.bashrc.

Jika saya mengetik vim ~/.bashr<TAB>maka itu selesai untuk vim /home/neil/.bashrc...

(Itu melakukan hal yang sama dengan vi, yang alias "vim".)

Bisakah saya mematikannya?

Neil
sumber

Jawaban:

5

ini dikendalikan oleh / etc / bash_completion

Anda dapat mengomentari kode ekspansi di _expand () jika Anda tidak menyukainya.

di sini adalah versi saya di fedora 17, tetapi Anda harus serupa:

# 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
sumber
1
Lokasi skrip penyelesaian sepenuhnya tergantung pada sistem Anda.
Daniel Beck
Hmm mungkin. Terima kasih. saya hanya menggunakan ubuntu / fedora / centos hari ini dan tampaknya file tersebut ada di sana. ya, jika itu adalah distro lain saya dapat membayangkan bahwa file / fungsi terletak di tempat lain, tetapi kemungkinan masih dikendalikan hanya oleh file teks.
johnshen64
4
Terima kasih, saya "memperbaiki" masalah saya dengan mendefinisikan function _expand() { :;}di ~/.bashrc.
Neil
6

bashdapat menyediakan pelengkapan otomatis yang lebih canggih untuk perintah tertentu (mis. argumen pelengkapan program otomatis selain nama file). Ada fungsi Penyelesaian yang Dapat Diprogram yang didefinisikan untuk vimperintah pada sistem Anda.

Mengetik completedi command prompt akan menunjukkan kepada Anda fungsi apa yang digunakan untuk menyediakan pelengkapan otomatis bash.

$ complete
complete -o default -F _complete_open open

Ketik type function_nameuntuk belajar tentang definisi mereka.

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

Untuk mengetahui di mana fungsi itu didefinisikan. gunakan yang berikut ini:

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