Khi tôi sử dụng chương trình thích svn
và tôi gõ vào Gnome Terminal:
svn upd
và nhấn Tabnó tự động hoàn thành:
svn update
Có thể làm một cái gì đó như thế trong kịch bản bash tùy chỉnh của tôi?
Khi tôi sử dụng chương trình thích svn
và tôi gõ vào Gnome Terminal:
svn upd
và nhấn Tabnó tự động hoàn thành:
svn update
Có thể làm một cái gì đó như thế trong kịch bản bash tùy chỉnh của tôi?
Câu trả lời:
Bạn có thể sử dụng Hoàn thành lập trình . Hãy nhìn vào /etc/bash_completion
và /etc/bash_completion.d/*
cho một số ví dụ.
/usr/share/bash-completion/completions/<program>
The provided link has that already
- nó có thể hôm nay, nhưng nó có thể không phải ngày mai. Hoặc năm tới. Hoặc trong một thập kỷ. Bất cứ điều gì bạn có thể đề xuất về tài liệu vẫn có liên quan, Stack Overflow không khuyến khích các câu trả lời chỉ liên kết vì những lý do này.
Tôi trễ sáu tháng nhưng tôi đang tìm kiếm điều tương tự và tìm thấy điều này:
Bạn sẽ phải tạo một tệp mới:
/etc/bash_completion.d/foo
Đối với tự động hoàn thành tĩnh ( --help
/ --verbose
ví dụ), hãy thêm điều này:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
là một mảng chứa tất cả các từ riêng lẻ trong dòng lệnh hiện tại.COMP_CWORD
là một chỉ mục của từ chứa vị trí con trỏ hiện tại.COMPREPLY
là một biến mảng mà Bash đọc các hoàn thành có thể.Và compgen
lệnh trả về mảng các yếu tố từ --help
, --verbose
và --version
phù hợp với từ hiện tại "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
-
và hiển thị chúng mà không phải bắt đầu nhập từ mục tiêu, chỉ cần xóa if [...] then
và fi
các dòng.
/etc/bash_completion.d/
. Tôi chỉ đến đây vì tôi muốn đăng câu trả lời ở đâu đó, nhưng hóa ra ai đó đã đi trước ba năm :) Ví dụ rõ ràng, súc tích và đầy đủ, cảm ơn bạn!
Tất cả các bash hoàn thành được lưu trữ trong /etc/bash_completion.d/
. Vì vậy, nếu bạn đang xây dựng phần mềm với bash_completion, sẽ rất đáng để deb / make install thả một tệp có tên của phần mềm trong thư mục đó. Dưới đây là một kịch bản hoàn thành bash ví dụ cho Rsync:
# bash completion for rsync
have rsync &&
_rsync()
{
# TODO: _split_longopt
local cur prev shell i userhost path
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
_expand || return 0
case "$prev" in
--@(config|password-file|include-from|exclude-from))
_filedir
return 0
;;
-@(T|-temp-dir|-compare-dest))
_filedir -d
return 0
;;
-@(e|-rsh))
COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \
-p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
-z -h -4 -6 --verbose --quiet --checksum \
--archive --recursive --relative --backup \
--backup-dir --suffix= --update --links \
--copy-links --copy-unsafe-links --safe-links \
--hard-links --perms --owner --group --devices\
--times --sparse --dry-run --whole-file \
--no-whole-file --one-file-system \
--block-size= --rsh= --rsync-path= \
--cvs-exclude --existing --ignore-existing \
--delete --delete-excluded --delete-after \
--ignore-errors --max-delete= --partial \
--force --numeric-ids --timeout= \
--ignore-times --size-only --modify-window= \
--temp-dir= --compare-dest= --compress \
--exclude= --exclude-from= --include= \
--include-from= --version --daemon --no-detach\
--address= --config= --port= --blocking-io \
--no-blocking-io --stats --progress \
--log-format= --password-file= --bwlimit= \
--write-batch= --read-batch= --help' -- "$cur" ))
;;
*:*)
# find which remote shell is used
shell=ssh
for (( i=1; i < COMP_CWORD; i++ )); do
if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
shell=${COMP_WORDS[i+1]}
break
fi
done
if [[ "$shell" == ssh ]]; then
# remove backslash escape from :
cur=${cur/\\:/:}
userhost=${cur%%?(\\):*}
path=${cur#*:}
# unescape spaces
path=${path//\\\\\\\\ / }
if [ -z "$path" ]; then
# default to home dir of specified
# user on remote host
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
fi
# escape spaces; remove executables, aliases, pipes
# and sockets; add space at end of file names
COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
command ls -aF1d "$path*" 2>/dev/null | \
sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
-e 's/[^\/]$/& /g' ) )
fi
;;
*)
_known_hosts_real -c -a "$cur"
_filedir
;;
esac
return 0
} &&
complete -F _rsync $nospace $filenames rsync
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
Rất có thể đáng để xem xét một trong các tệp hoàn thành bash trong đó phù hợp nhất với chương trình của bạn. Một trong những ví dụ đơn giản nhất là rrdtool
tệp.
source ~/.local/mycrazycompletion
vào~/.bashrc
pkg-c
onfig --variable = xongionsdir bash-xong` và thư mục đó là đề xuất được đưa ra bởi Bash Hoàn thành Câu hỏi thường gặp được liên kết ở trên.
Đây là một hướng dẫn đầy đủ.
Hãy có một ví dụ về tập lệnh được gọi là admin.sh mà bạn muốn tự động hoàn thành.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Lưu ý danh sách rút gọn tùy chọn. Gọi tập lệnh với tùy chọn này sẽ in ra tất cả các tùy chọn có thể cho tập lệnh này.
Và ở đây bạn có kịch bản tự động hoàn thành:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Lưu ý rằng đối số cuối cùng cần hoàn thành là tên của tập lệnh bạn muốn thêm tự động hoàn thành. Tất cả những gì bạn cần làm là thêm tập lệnh tự động hoàn tất vào bashrc như
source /path/to/your/autocomplete.sh
hoặc sao chép nó vào /etc/bash.completion.d
prev
biến cho là gì? Bạn dường như không sử dụng nó.
-o nospace
lựa chọn làm gì?
Nếu tất cả những gì bạn muốn là tự động hoàn thành dựa trên từ đơn giản (vì vậy không hoàn thành tiểu ban hoặc bất cứ điều gì), complete
lệnh có một -W
tùy chọn chỉ thực hiện đúng.
Ví dụ: tôi có các dòng sau .bashrc
để tự động hoàn thành một chương trình có tên là jupyter :
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Bây giờ jupyter <TAB> <TAB>
tự động hoàn thành cho tôi.
Các tài liệu tại gnu.org là hữu ích.
Nó dường như dựa vào IFS
biến được đặt chính xác, nhưng điều đó không gây ra bất kỳ vấn đề nào cho tôi.
Để thêm hoàn thành tên tệp và hoàn thành BASH mặc định, hãy sử dụng -o
tùy chọn:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Để sử dụng điều này trong zsh, hãy thêm đoạn mã sau trước khi chạy complete
lệnh trong ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
bash jupyter <TAB><TAB>
?