Bash pelengkapan otomatis dengan ruang tambahan - mengapa, dan bagaimana cara memperbaikinya?

29

Saya menggunakan pelengkap tab lebih dari mengetik huruf. Saya biasa mengetik rm ~/De<TAB>dan itu akan selesai rm ~/Desktop/sehingga saya bisa melanjutkan ke tingkat berikutnya.

Baru-baru ini, perilaku itu berubah. Penyelesaian sekarang menghasilkan rm ~/Desktop<SPACE>, yang berarti saya harus mundur dan mengetik garis miring jika saya ingin melanjutkan. Ini membuatku menangis.

Perubahan tampaknya berada dalam fungsi _longopt()di /etc/bash_completion, namun yang sejauh yang saya bisa mengikuti. Apakah perubahan ini disengaja, dan jika demikian, apa gunanya hal itu? Bisakah saya mengembalikan perilaku lama, lebih disukai dengan opsi konfigurasi daripada hanya menyalin kode lama dari beberapa sistem lain?

Sunting: Fungsi untuk referensi.

_longopt()
{
    local cur prev split=false
    _get_comp_words_by_ref -n = cur prev

    _split_longopt && split=true

    case "$prev" in
        --*[Dd][Ii][Rr]*)
            _filedir -d
            return 0
            ;;
        --*[Ff][Ii][Ll][Ee]*|--*[Pp][Aa][Tt][Hh]*)
            _filedir
            return 0
            ;;
    esac

    $split && return 0

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u )" \
            -- "$cur" ) )
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}
MPi
sumber
Satu-satunya cara saya bisa melihat bahwa ini masuk akal adalah jika ~ / Desktop adalah file atau direktori kosong . Dan dalam kasus kedua, itu hanya berguna untuk perintah seperti rmdir, bukan untuk mkdiratau touch.
l0b0
Bisakah Anda memposting fungsi tubuh Anda _longopt()?
Aleksandr Levchuk
@MPi: ketahuilah bahwa penyelesaian dapat bergantung pada perintah (kata pertama dari baris perintah). Juga dapat tergantung pada readlinepengaturan (apakah Anda memiliki ~/inputrcfile?) Dan pada kenyataan bahwa item tersebut adalah direktori nyata atau symlink ke direktori.
enzotib
Tentu saja penyelesaiannya tergantung pada kata pertama dari baris tersebut. Itulah sebabnya saya terkadang menggunakan perintah fantasi untuk mengelabui penyelesaian, dan hanya mengubahnya ke perintah yang sebenarnya sebelum saya mengirimnya. Dan saya tidak punya .inputrcsistem ini lagi. (Itu adalah hari-hari, memperbaiki backspace dan tombol kursor ...) Dan itu terjadi untuk semua elemen, direktori atau file, symlink atau tidak.
MPi
1
Pertanyaan yang sangat bagus, saya telah mengamati perilaku yang sama persis, dan itu mengganggu saya. Tapi tidak tahu alasannya.
Christoph

Jawaban:

22

Ini adalah bug yang dikenal. Lihat pertanyaan LP ini dan bug ini 1 2 .

Komentar ini tampaknya sudah diperbaiki. Jika Anda tidak bisa menunggu perbaikan untuk menetes ke saluran normal, edit /etc/bash_completionbaris 1587, ubah defaultke filenames(buat cadangan terlebih dahulu).

Christoph
sumber
3
Rangkuman: Ini adalah bug, Anda dapat memperbaikinya secara lokal hingga tambalan tiba dengan mengedit /etc/bash_completionbaris 1587, ubah defaultke filenames.
MPi
mengedit jawaban saya
Christoph
9

Saya mengalami, dan menyelesaikan, masalah yang sama setelah menginstal Adobe Reader di Ubuntu 12.04.

Saya berkomentar _filedirblok /etc/bash_completion.d/acroread.shdan bekerja normal lagi.

hiteshradia
sumber
Pada tanggal hari ini, inilah yang bekerja untuk saya juga.
John Moeller
1
Sama di sini: acroread memicu dan mengomentari _filedirblok (tepat di atas) memperbaikinya. Anda harus keluar atau menjalankan 'exec bash' di semua shell Anda untuk melihat efeknya, lihat pertanyaan ini .
dirkjot
2

Saya memiliki masalah yang sama dan saya memperbaikinya dengan menghapus direktori /etc/bash_completion.d/, lalu instal ulang bash_completion. Saya kira file lama ada di direktori ini ... Semoga ini akan menyelesaikan masalah Anda juga.

PatrickM
sumber
seperti orang ini: timlabath.com/words/2011/05/10/…
ketik
2
Ini - memang - memperbaikinya. Namun, metode itu terlalu radikal, karena membuang banyak penyelesaian. Setelah menghapus paket bash-completion, salah satu file yang tersisa /etc/bash_completion.d/harus menjadi biang keladinya. Itu acroread.shdalam kasus saya - itu mendefinisikan ulang _filedir.
MPi