ソルトスタックを使用しています。salt
コマンドを呼び出すときにミニオン名をオートコンプリートしたいです。
次の行がに追加されました~/.bashrc
。
complete -o default -o nospace -W "$(sudo ls -1 /var/cache/salt/master/minions)" salt
次に→を入力すると、期待どおりに機能することがわかります。salt inTab
salt integration-Tab
$塩の統合-TabTab 統合-c統合-u統合-u2
に使用するために追加しsudo
ましたが、動作しません。complete -cf sudo
~/.bashrc
水道塩Tab
何も返されません。
bash_completion
また、次の行をインストールして追加してみました~/.bash_profile
。
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
しかし幸運はありません。
私が逃したものは何ですか?
修正する
ああ、私が最初に申し上げたいのは時々効果があるということです。
$sudo ソルト統合TabTab -integrate-c 統合-u 統合-u2
時にはそうではありません。
まず、bash_completionパッケージの機能がどれくらいになるかを見てみましょう。
どうやって確認しますか?これは私の機能です。
# a wrapper method for the next one, when the offset is unknown
_command()
{
local offset i
# find actual offset, as position of the first non-option
offset=1
for (( i=1; i <= COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" != -* ]]; then
offset=$i
break
fi
done
_command_offset $offset
}
# A meta-command completion function for commands like sudo(8), which need to
# first complete on a command, then complete according to that command's own
# completion definition - currently not quite foolproof (e.g. mount and umount
# don't work properly), but still quite useful.
#
_command_offset()
{
local cur func cline cspec noglob cmd i char_offset word_offset \
_COMMAND_FUNC _COMMAND_FUNC_ARGS
word_offset=$1
# rewrite current completion context before invoking
# actual command completion
# find new first word position, then
# rewrite COMP_LINE and adjust COMP_POINT
local first_word=${COMP_WORDS[$word_offset]}
for (( i=0; i <= ${#COMP_LINE}; i++ )); do
if [[ "${COMP_LINE:$i:${#first_word}}" == "$first_word" ]]; then
char_offset=$i
break
fi
done
COMP_LINE=${COMP_LINE:$char_offset}
COMP_POINT=$(( COMP_POINT - $char_offset ))
# shift COMP_WORDS elements and adjust COMP_CWORD
for (( i=0; i <= COMP_CWORD - $word_offset; i++ )); do
COMP_WORDS[i]=${COMP_WORDS[i+$word_offset]}
done
for (( i; i <= COMP_CWORD; i++ )); do
unset COMP_WORDS[i];
done
COMP_CWORD=$(( $COMP_CWORD - $word_offset ))
COMPREPLY=()
_get_comp_words_by_ref cur
if [[ $COMP_CWORD -eq 0 ]]; then
_compopt_o_filenames
COMPREPLY=( $( compgen -c -- "$cur" ) )
else
cmd=${COMP_WORDS[0]}
if complete -p ${cmd##*/} &>/dev/null; then
cspec=$( complete -p ${cmd##*/} )
if [ "${cspec#* -F }" != "$cspec" ]; then
# complete -F <function>
# get function name
func=${cspec#*-F }
func=${func%% *}
if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
$func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"
else
$func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"
fi
# remove any \: generated by a command that doesn't
# default to filenames or dirnames (e.g. sudo chown)
# FIXME: I'm pretty sure this does not work!
if [ "${cspec#*-o }" != "$cspec" ]; then
cspec=${cspec#*-o }
cspec=${cspec%% *}
if [[ "$cspec" != @(dir|file)names ]]; then
COMPREPLY=("${COMPREPLY[@]//\\\\:/:}")
else
_compopt_o_filenames
fi
fi
elif [ -n "$cspec" ]; then
cspec=${cspec#complete};
cspec=${cspec%%${cmd##*/}};
COMPREPLY=( $( eval compgen "$cspec" -- "$cur" ) );
fi
elif [ ${#COMPREPLY[@]} -eq 0 ]; then
_filedir
fi
fi
}
と入力すると、ディレクトリのリストが
sudo mkdir
TabTab表示されますか?
例:
$ sudo mkdir TabTab .FontForge/ .djangopypi2/ .ievms/ .ssh/ .wireshark-etc/
ベストアンサー1
set -o
可能なモードが有効になっていることを確認してくださいposix
。その場合は無効にしてください。set +o posix
「posix」モードでは、何らかの理由で「viモード」でbashのタブ補完が無効になります。なぜこのような動作が発生したのか、なぜviモードに固有の理由については説明がなかったので、あえて説明しませんでした。
PS:この回答は特定の設定ではなく、検索エンジンを介して偶然に質問を見つけた人のためのものです。
修正する:
チェットレイミ説明する:
POSIXモードでは、タブマッピングを介してvi編集モードを実行しないでください。これは、POSIX.2がvi編集モードの動作を完全に指定し、標準ではタブがデフォルトで自己挿入にマッピングされることを要求するためです。