ทุบตีการเติมข้อมูลอัตโนมัติด้วยช่องว่างเพิ่มเติม - ทำไมและวิธีแก้ไข


29

ฉันใช้ความสมบูรณ์ของแท็บมากกว่าการพิมพ์ตัวอักษร ฉันเคยพิมพ์rm ~/De<TAB>และมันจะเสร็จสมบูรณ์เพื่อrm ~/Desktop/ให้ฉันสามารถดำเนินการต่อในระดับต่อไป

เมื่อเร็ว ๆ นี้พฤติกรรมนั้นเปลี่ยนไป ตอนนี้การเสร็จสมบูรณ์ให้ผลrm ~/Desktop<SPACE>ซึ่งหมายความว่าฉันต้องถอยกลับและพิมพ์เครื่องหมายทับหากฉันต้องการดำเนินการต่อ นี่ทำให้ฉันร้องไห้

การเปลี่ยนแปลงดูเหมือนจะอยู่ในฟังก์ชั่น_longopt()ใน/etc/bash_completionแต่ก็เท่าที่ฉันสามารถติดตาม การเปลี่ยนแปลงนี้ตั้งใจหรือไม่และหากเป็นเช่นนั้นจะมีผลดีกับอะไร? ฉันสามารถใช้พฤติกรรมเก่า ๆ ได้หรือไม่โดยเลือกใช้ตัวเลือกปรับแต่งแทนการคัดลอกรหัสเก่ามาจากระบบอื่นหรือไม่?

แก้ไข: ฟังก์ชั่นสำหรับการอ้างอิง

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

วิธีเดียวที่ฉันจะเห็นว่านี่จะสมเหตุสมผลถ้า ~ / Desktop เป็นไฟล์หรือไดเรกทอรีว่างเปล่า และในกรณีที่สองที่มีประโยชน์เฉพาะสำหรับคำสั่งที่ชอบrmdirไม่ได้สำหรับการหรือmkdir touch
l0b0

คุณช่วยโพสต์เนื้อหาของ_longopt()หน้าที่คุณได้ไหม?
Aleksandr Levchuk

@MPi: โปรดทราบว่าความสมบูรณ์อาจขึ้นอยู่กับคำสั่ง (คำแรกของบรรทัดคำสั่ง) นอกจากนี้ยังสามารถขึ้นอยู่กับreadlineการตั้งค่า (คุณมี~/inputrcไฟล์หรือไม่) และความจริงที่ว่ารายการนั้นเป็นไดเรกทอรีจริงหรือ symlink ไปยังไดเรกทอรี
enzotib

แน่นอนว่าความสำเร็จขึ้นอยู่กับคำแรกของบรรทัด นี่คือเหตุผลที่บางครั้งฉันใช้คำสั่งแฟนตาซีเพื่อหลอกให้เสร็จและเปลี่ยนเป็นคำสั่งจริงก่อนที่จะส่ง และฉันก็ไม่มี.inputrcระบบนี้อีกต่อไป (สิ่งเหล่านี้คือวันที่แก้ไขแบ็คสเปซและปุ่มเคอร์เซอร์…) และมันเกิดขึ้นกับองค์ประกอบไดเรกทอรีหรือไฟล์ symlink ทั้งหมดหรือไม่
MPi

1
คำถามที่ยอดเยี่ยมฉันได้สังเกตเห็นพฤติกรรมเดียวกันที่แน่นอน ไม่มีความคิดเกี่ยวกับเหตุผลแม้ว่า
Christoph

คำตอบ:


22

นี่เป็นข้อผิดพลาดที่รู้จัก ดูนี้คำถาม LP และข้อบกพร่องเหล่านี้1 2

ความคิดเห็นนี้ดูเหมือนจะเป็นการแก้ไข หากคุณไม่สามารถรอให้ตัวแก้ไขสามารถใช้งานช่องสัญญาณปกติให้แก้ไข/etc/bash_completionบรรทัด 1587 เปลี่ยนdefaultเป็นfilenames(ทำการสำรองข้อมูลก่อน)


3
สรุป: มันเป็นข้อผิดพลาดคุณสามารถแก้ไขได้ในระดับท้องถิ่นจนถึงแพทช์มาถึงโดยการแก้ไข/etc/bash_completionบรรทัด 1587 เปลี่ยนแปลงไปdefault filenames
MPi

แก้ไข anwer ของฉัน
Christoph

9

ฉันมีและแก้ไขปัญหาเดียวกันหลังจากติดตั้ง Adobe Reader บน Ubuntu 12.04

ฉันใส่ความคิดเห็นใน_filedirบล็อก/etc/bash_completion.d/acroread.shและมันทำงานได้ตามปกติอีกครั้ง


ณ วันนี้วันนี้เป็นสิ่งที่ทำงานให้ฉันเช่นกัน
John Moeller

1
เหมือนกันที่นี่: acroread เรียกมันและแสดงความคิดเห็นออก_filedirบล็อก (ด้านบนขวา) แก้ไขมัน คุณต้องออกจากระบบหรือเรียกใช้ 'exec bash' ในเชลล์ทั้งหมดของคุณเพื่อดูผลกระทบดูคำถามนี้
dirkjot

2

ฉันมีปัญหาเดียวกันและฉันแก้ไขได้โดยลบไดเรกทอรี /etc/bash_completion.d/ จากนั้นติดตั้ง bash_completion ใหม่ ฉันเดาไฟล์เก่าอยู่ในไดเรกทอรีนี้ ... หวังว่ามันจะแก้ปัญหาของคุณได้เช่นกัน


ชอบผู้ชายคนนี้: timlabath.com/words/2011/05/10/…
พิมพ์

2
นี่ - แน่นอน - แก้ไขมัน อย่างไรก็ตามวิธีการนี้นั้นรุนแรงเกินไปเพราะมันทำให้ความสำเร็จออกไปมากมาย หลังจากลบแพคเกจbash-completionหนึ่งในไฟล์ที่เหลือ/etc/bash_completion.d/จะต้องเป็นผู้ร้าย มันเป็นacroread.shในกรณีของฉัน - _filedirมันนิยามใหม่
MPi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.