2

作成したユーティリティスクリプトのbash補完を設定しようとしているので、次のスクリプトを/etc/bash_completion.dに追加しました。

_mcd()
{
    local cur words
    COMPREPLY=()

    cur="${COMP_WORDS[COMP_CWORD]}"
    words=`mcd-completion-words`
    COMPREPLY=( $(compgen -W "${words}" -- "$cur") )
    return 0
}
complete -F _mcd mcd

スクリプトはmcd-completion-words、コマンドで使用可能な演算子をプログラムで検索します。bashを再起動する(またはスクリプトをソースする)と、タブを正常に完了できますが、そうすると、完了した文字を超えてバックスペースキーを押すことができなくなります。

また、すべてのオプションを一覧表示しようとすると(たとえば、単語がない状態でタブを完成させようとすると)、bashはコマンドにタブを追加しますが、これもバックスペースできません。

bashに通常のファイル完了動作を模倣させるにはどうすればよいですか?どんな助けでも大歓迎です。ありがとう!


これは、同じ動作を示すmcd-completion-wordsの縮小テストケースです。不思議なことに、デニスのケースは私にも有効です(たとえば、words = "one two three"に置き換える場合)。

#!/usr/bin/env php
<?php

print "one two three four five six seven eight nine";
4

1 に答える 1

1

これが縮小されたテストケースです。空の`php'コマンドでさえ、誤った完了動作を引き起こします。

$ _mcd() { php -r ""; COMPREPLY=( one ); }
$ complete -F _mcd mcd
$ mcd <TAB>            # Becomes 'mcd one' all right
$ mcd one <BACKSPACE>  # ERROR: doesn't work

これは、bash-3.2.48 /bash-4.0.33とphp-5.2.6-3ubuntu4の両方を備えたマシン(Ubuntu)にあります。bash-3.2.39&php-5.2.6-1 + lenny9を搭載した別のマシン(Debian)では、完了とバックスペースは問題ありません。

perl -e ""代わりに使用してphp -r ""も大丈夫です。

何が起こっているのかわからない、phpがreadlineと競合している?多分あなたはバグバッシュメーリングリストを試すことができますか?

于 2010-09-13T21:26:29.893 に答える