Skip to content

Instantly share code, notes, and snippets.

@alirz-pixel
Last active April 8, 2023 13:42
Show Gist options
  • Save alirz-pixel/c871f65888d6b9d73debf2a58d6b2d9a to your computer and use it in GitHub Desktop.
Save alirz-pixel/c871f65888d6b9d73debf2a58d6b2d9a to your computer and use it in GitHub Desktop.
[shell] bash_completion
create_completion() {
local command=$1
local options=$2
local FILE_NAME=$3
local width=$(bind -v | sed -n 's/^set completion-display-width //p')
local func_name="_${command}_complete"
local func_body=
func_body+="if [[ $width -ne 0 ]]; then "
func_body+="bind 'set completion-display-width 0'; "
func_body+='PROMPT_COMMAND="bind'
func_body+=" 'set completion-display-width $width'"
func_body+='"; '
func_body+="fi; "
func_body+="local IFS='\@'; "
func_body+="if (( COMP_CWORD == 1 )); then "
func_body+='COMPREPLY=( $(compgen -W '
func_body+='"'
func_body+="${options}"
func_body+='"'
func_body+=' -- "$2") ); '
func_body+="return; "
func_body+="fi "
echo "function $func_name () { $func_body ; }" >> $FILE_NAME
echo "complete -F $func_name $command" >> $FILE_NAME
echo >> $FILE_NAME
}
generate_completion() {
local FILE_NAME=commands.yaml
local COMPLETION_FILE=".bash_completion"
local command="";
local options="";
if [[ -f "$FILE_NAME" ]]; then
if [[ -f "$COMPLETION_FILE" ]]; then
rm "$COMPLETION_FILE"
fi
while read line; do
if [ "$line" = "" ]; then
if [ "$command" != "" ] && [ "$options" != "" ]; then
echo `create_completion "$command" "$options" "$COMPLETION_FILE"`
command=""
options=""
fi
continue
fi
if [ -z $command ]; then
command="${line%\:}"
else
if [ "$options" != "" ]; then
options+="\@"
fi
options+="$line"
fi
done < "$FILE_NAME"
if [ "$command" != "" ] && [ "$options" != "" ]; then
echo `create_completion "$command" "$options" "$COMPLETION_FILE"`
fi
source $COMPLETION_FILE
fi
}
generate_completion

bash_completion

commands.yaml에 bash_completion 하고 싶은 목록을 적는다.
.bashrc에는 generate_completion 부분을 넣고, 재시작 또는 source .bashrc를 입력한다
(commands.yaml은 .bashrc 과 동일한 디렉토리에 있어야함)

commands.yaml

명령어1:
  자동완성1
  자동완성2
  ...
  
명령어2:
  자동완성1
  자동완성2
  ...
  

commands.yaml에는 위와 같이 completion 하고 싶은 '명령어'와 '힌트 내용'을 적어주면 된다.
주의: 마지막 줄과 명령어 사이에는 무조건 개행이 하나 이상 포함되어 있어야한다.

image

screen:
생성: screen -S <NAME>
삭제: screen -X -S <NAME> kill
git:
가져오기: git pull <upstream> <branch>
보내기 : git push <upstream> <branch>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment