Chỉnh sửa: OK. Có vẻ như tôi có thể đã đọc sai tình huống. Nghĩ rằng bạn có nghĩa là tùy chọn chương trình như trong:
$ mplayer_alias -pla<tab><tab>
-playing-msg -playlist
$
nhưng đoán nó là hoàn thành tập tin. Tôi không biết, nhưng hãy thử đi.
Là một sửa chữa nhanh chóng, điều này sẽ làm việc:
complete -f -o default ee
Tặng:
$ ee<tab><tab>
file1 file2 file3
$
kể từ khi lập trình hoàn thành lập trình . Ví dụ, -X pattern
có thể hữu ích. Ví dụ: để loại trừ .swp
và .swo
các tệp:
complete -f -X '*.sw[op]' ee
chỉ hiển thị .zip
, .ZIP
:
complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias
một số có thể cần bạn thêm shopt -s extglob
vào tập tin cấu hình.
Trả lời:
Bạn có thể thử một cái gì đó như thế này trong của bạn .bash_completion
.
Ít nhất là như một khởi đầu.
Ý tưởng cốt lõi là chỉ cần thêm complete
cho bí danh bằng cách sử dụng tập lệnh hoàn chỉnh hiện có cho chương trình thực . Ở đây tôi giả sử rằng tất cả chúng đều ở định dạng:
complete -F _complete_function_from_original program_name
Bạn có thể có được những gì nó bằng cách thực hiện : complete -p program_name
. Tốt nhất để kiểm tra đầu tiên.
Đối với một số phương thức như apt-get
người ta chỉ có thể sử dụng bí danh + tải:
_load_comp_hack apt-get myalias
Đối với những người khác như người mplayer
ta cần một trình bao bọc hàm, như trong ví dụ:
myalias() { mplayer "$@"; }
|
+--- Could be messy
Hoàn toàn có thể có một cách tốt hơn để giải quyết vấn đề này, nhưng đã hoạt động tốt cho việc sử dụng của tôi. Tôi chủ yếu sử dụng nó cho các kịch bản lệnh bao bọc, nơi tôi mở rộng chức năng của chương trình gốc. Chưa sử dụng nó trên bí danh.
Tôi không cảm thấy an toàn với vụ hack này, nhưng bạn có thể thấy nếu nó hoạt động.
_load_comp_hack()
{
local cc=
# Make sure completion scripts are sourced.
# Report error if source fail.
if . "/usr/share/bash-completion/completions/$1" >/dev/null 2>&1; then
# Extract the completion function used by the "real" program.
if cc="$(complete -p "$1" | cut -d' ' -f3)"; then
# Add it to the alias
complete -F "$cc" "$2"
return 0
fi
fi
echo "bash-completion '$1' for '$2' not found."
}
_load_comp_hack mplayer mplad
_load_comp_hack apt-get z
| |
| +----- Alias, script or function
+------------- Real function
Một số chương trình sử dụng hoàn thành chung hơn như _longopt
, trong đó tệp nguồn sẽ không được định vị. Thông thường, nó cũng không cần nguồn, vì vậy một biến thể đơn giản hơn có thể là:
_load_comp_hack()
{
local cc=
if cc=$(complete -p "$1" | cut -d' ' -f3); then
complete -F "$cc" "$2"
fi
}
Một vấn đề ở đây, IIRC, là một số tập lệnh hoàn thành không được tải cho đến lần chạy đầu tiên, như trong lần đầu tiên :
prog
tabtab. Như một sự thay thế có lẽ thêm nó như là một else
nguồn cung cấp tập tin thất bại.
/etc/bash_completion
?