スペースを追加したBashのオートコンプリート-なぜ、どのように修正しますか?


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がファイルまたは空のディレクトリである場合にのみ、これが理にかなっていることがわかります。2番目の場合、これは、やでrmdirはなく、mkdirなどのコマンドでのみ役立ちますtouch
l0b0

_longopt()関数の本体を投稿していただけますか?
アレクサンドルレフチュク

@MPi:補完はコマンド(コマンドラインの最初の単語)に依存する可能性があることに注意してください。また、readline設定(~/inputrcファイルをお持ちですか?)およびアイテムが実際のディレクトリまたはディレクトリへのシンボリックリンクであるという事実に依存します。
エンゾチブ

もちろん、補完は行の最初の単語に依存します。そのため、ファンタジーコマンドを使用して補完をトリックし、送信する前に実際のコマンドにのみ変更することがあります。そして、私は.inputrcもうこのシステムにはありません。(これらは、バックスペースとカーソルキーを修正する日でした…)そして、それはすべての要素、ディレクトリまたはファイル、シンボリックリンクに関係なく起こります。
MPi

1
すばらしい質問です。まったく同じ振る舞いを観察しましたが、それは私を悩ませます。ただし、理由はわかりません。
クリストフ

回答:


22

これは既知のバグです。この LPの質問とバグ1 2をご覧ください。

このコメントは修正のようです。修正が通常のチャネルを細流化するのを待つことができない場合、/etc/bash_completion行1587を編集defaultし、filenames(最初にバックアップを作成する)に変更します。


3
概要:これはバグです。/etc/bash_completion行1587を編集してパッチが届くまでローカルで修正し、に変更defaultできfilenamesます。
MPi

私の答えを編集
クリストフ

9

Ubuntu 12.04にAdobe Readerをインストールした後、同じ問題を抱えて解決しました。

_filedirブロックをコメントアウトすると、/etc/bash_completion.d/acroread.sh再び正常に機能しました。


今日の日付の時点で、これは私にとってもうまくいったことです。
ジョンモーラー

1
ここでも同じ:acroreadがトリガーし、_filedirブロックをコメントアウト(右上)して修正しました。効果を確認するには、すべてのシェルでログアウトするか「exec bash」を実行する必要があります。この質問を参照してください。
dirkjot

2

私も同じ問題を抱えていたので、/ etc / bash_completion.d /ディレクトリを削除して修正し、bash_completionを再インストールしました。古いファイルがこのディレクトリにあったと思います...うまくいけば、それもあなたの問題を解決するでしょう。


:この男のようなtimlabath.com/words/2011/05/10/...
タイプ

2
これは確かに修正されました。ただし、このメソッドは多くの完了を破棄するため、非常に過激です。パッケージを削除した後、bash-completion残っているファイルの1つが/etc/bash_completion.d/原因である必要があります。それはacroread.sh私の場合でした-再定義し_filedirます。
MPi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.