Bash tự động hoàn thành với các khoảng trắng được thêm vào - tại sao và cách khắc phục?


29

Tôi sử dụng tab hoàn thành nhiều hơn gõ chữ. Tôi đã từng gõ rm ~/De<TAB>và nó sẽ được hoàn thành để rm ~/Desktop/tôi có thể tiếp tục ở cấp độ tiếp theo.

Gần đây, hành vi đó đã thay đổi. Việc hoàn thành bây giờ mang lại rm ~/Desktop<SPACE>, có nghĩa là tôi phải lùi lại và gõ dấu gạch chéo nếu tôi muốn tiếp tục. Điều này làm tôi khóc.

Các thay đổi dường như nằm trong hàm _longopt()trong /etc/bash_completion, tuy nhiên đó là xa nhất mà tôi có thể làm theo. Là sự thay đổi này có chủ ý, và nếu vậy, nó tốt cho cái gì? Tôi có thể lấy lại hành vi cũ hay không, tốt nhất là bằng tùy chọn cấu hình thay vì chỉ sao chép mã cũ từ một số hệ thống khác?

Chỉnh sửa: Các chức năng để tham khảo.

_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
}

Cách duy nhất tôi có thể thấy rằng điều này sẽ có ý nghĩa là nếu ~ / Desktop là một tệp hoặc một thư mục trống . Và trong trường hợp thứ hai, điều đó chỉ hữu ích cho các lệnh như rmdir, không phải cho mkdirhoặc touch.
l0b0

Bạn có thể gửi cơ thể của _longopt()chức năng của bạn ?
Alexanderr Levchuk

@MPi: lưu ý rằng việc hoàn thành có thể phụ thuộc vào lệnh (từ đầu tiên của dòng lệnh). Ngoài ra, nó có thể phụ thuộc vào readlinecài đặt (bạn có ~/inputrctập tin không?) Và trên thực tế rằng mục đó là một thư mục thực hoặc một liên kết tượng trưng đến một thư mục.
enzotib

Tất nhiên việc hoàn thành phụ thuộc vào từ đầu tiên của dòng. Đó là lý do tại sao đôi khi tôi sử dụng một lệnh tưởng tượng để lừa hoàn thành và chỉ thay đổi nó thành lệnh thực trước khi tôi gửi nó. Và tôi không có .inputrctrên hệ thống này nữa. (Đó là những ngày, sửa lỗi backspace và phím con trỏ) Và nó xảy ra cho tất cả các thành phần, thư mục hoặc tệp, symlink hay không.
MPi

1
Câu hỏi tuyệt vời, tôi đã quan sát chính xác hành vi tương tự, và nó làm tôi khó chịu. Không có ý tưởng về lý do, mặc dù.
Christoph

Câu trả lời:


22

Đây là một lỗi đã biết. Xem câu hỏi LP này và các lỗi 1 2 .

Nhận xét này dường như là sửa chữa. Nếu bạn không thể đợi bản sửa lỗi nhỏ giọt xuống các kênh thông thường, hãy chỉnh sửa /etc/bash_completiondòng 1587, thay đổi defaultthành filenames(tạo bản sao lưu trước).


3
Tóm tắt: Đây là một lỗi, bạn có thể sửa nó cục bộ cho đến khi bản vá đến bằng cách chỉnh sửa /etc/bash_completiondòng 1587, đổi defaultthành filenames.
MPi

chỉnh sửa anwer của tôi
Christoph

9

Tôi đã và đã giải quyết vấn đề tương tự sau khi cài đặt Adobe Reader trên Ubuntu 12.04.

Tôi nhận xét _filedirkhối trong /etc/bash_completion.d/acroread.shvà nó hoạt động bình thường trở lại.


Cho đến ngày hôm nay, đây là những gì làm việc cho tôi là tốt.
John Moeller

1
Tương tự ở đây: acroread kích hoạt nó và nhận xét _filedirkhối (bên phải trên cùng) đã sửa nó. Bạn phải đăng xuất hoặc chạy 'exec bash' trong tất cả các shell của bạn để xem hiệu ứng, xem câu hỏi này .
dirkjot

2

Tôi gặp vấn đề tương tự và tôi đã khắc phục bằng cách xóa thư mục /etc/bash_completion.d/, sau đó cài đặt lại bash_completion. Tôi đoán một tập tin cũ đã có trong thư mục này ... Hy vọng nó cũng sẽ giải quyết vấn đề của bạn.


thích anh chàng này: timlabath.com/words/2011/05/10/ trên

2
Điều này - thực sự - đã sửa nó. Tuy nhiên, phương pháp đó quá triệt để, vì nó ném đi nhiều sự hoàn thành. Sau khi xóa gói bash-completion, một trong các tệp còn lại /etc/bash_completion.d/phải là thủ phạm. Đó là acroread.shtrong trường hợp của tôi - nó xác định lại _filedir.
MPi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.