명령 별칭에 대한 bash 완료를 어떻게 얻습니까?


57

명령 줄 별칭에서 탭 완성을 얻으려고합니다. 예를 들어 다음 별칭을 정의했다고 말합니다.

alias apt-inst='sudo aptitude install'

탭 키를 눌렀을 때 적성에 의해 완성을 얻는 방법이 있습니까? 즉, 'sudo aptitude install gnumer'를 작성하고 탭을 누르면 aptitude가이를 gnumeric로 완성하거나 불확실성이 있으면 gnumer로 시작하는 모든 사용 가능한 패키지가 나열됩니다. 별명을 사용하여 작업을 수행하면 아무것도 완료되지 않습니다.


답변:


30

우분투 포럼에서 이것에 대해 좋은 스레드 . Ole J는 다음과 같은 별칭 완성 정의 함수를 제안합니다.

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

이를 사용하여 별명에 대한 완료 기능을 정의한 후 해당 기능을 별명에 대한 완료 자로 지정하십시오.

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

기존 프로그램에 항상 사용되는 인수를 추가하기 위해 별칭을 사용하는 것을 선호합니다. 예를 들어을 사용 grep하면 항상 장치와 이진 파일을 건너 뛰고 싶고에 대한 별칭을 grep만듭니다. 와 같은 새로운 명령을 추가 grepbin하기 위해 ~/bin폴더에 쉘 스크립트를 사용 합니다. 해당 폴더가 경로에 있으면 자동 완성됩니다.


2
굉장히 불가능 할까봐 두려웠습니다.
levesque

참고 이 코드는 몇 가지 문제가 있습니다. 설명과 해결 방법은 내 답변을 참조하십시오.
Tom Hale

참고 : 이 명령을 다른 명령에 사용 하고 인수를 전달 할 때 파일 이름 자동 완성과 같은 작업 을 수행하는 complete -o default -F ...대신 대신 사용해야 했습니다 complete -F ...(Bash 4.3.46).
joelittlejohn

28

이 문제를 정확하게 해결하는 complete-alias를 시도하십시오 .

설치 후 하나의 일반 함수를 사용하여 다음과 같은 많은 별명을 완료 할 수 있습니다.

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

모든 bash 인스턴스에서 complete_alias 파일을 제공 .bash_profile하거나 유사하게 할 수 있습니다.

설치

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

신청

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

container이제 원래 _docker()완료 처리기 로 자동 완성 할 수 있습니다 .

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

2
이 소프트웨어가 귀하의 것으로 보이면 이보다 더 잘할 수 있습니다. 설치 지침을 추가하십시오. 그것이 무엇을하고 어떻게 사용하는지 설명하십시오. 그렇지 않으면 스팸 일뿐입니다.
muru

@muru 여기에 일부 코드를 붙여 넣을 생각이지만 여기에 허용되는 것보다 더 깁니다. 나는 사람들이 README 파일에서 설치 섹션을 읽는 데 아무런 문제가 없다고 가정 하고,이 경우에는 몇 줄에 불과합니다.
Cyker

2
요점은 대답에서 README를 방문하는 것이 가치가 있는지 여부를 판단 할 수 있다는 것입니다.
muru December

이것은 적절한 답변이며 문제를 정확하게 해결합니다.
Ярослав Рахматуллин

1
이것은 완벽하게 작동하는 훌륭하고 매우 포괄적 인 답변입니다. 감사합니다!. @muru에 문제가 있기 때문에 아마도 업데이트되었을 것입니다.
브라이언 토핑

3

2018 년 답변

프로그램 '완료'에 별명을 추가해야합니다. 자동 완성의 종류에 따라 -c 또는 -F를 사용해야합니다.

패키지 자동 완성의 경우 :

complete -c name_of_your_alias

자동 완성 명령의 경우 :

complete -F name_of_your_alias

별명이 올바르게 추가되었는지 확인하려면 다음을 수행하십시오.

complete | grep name_of_your_alias

마지막으로 '완료'에서 별칭을 제거하려면 다음을 수행하십시오.

complete -r name_of_your_alias

귀하의 경우 :

complete -c apt-inst

1
댓글에 답을 계속하지 마십시오. 할 말이 있으면 답변으로 편집 하십시오.
G-Man

2
complete -F xxxOSX에서는 작동하지 않습니다 (사용법 만 표시 complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]). 당신은 어떤 포인터가 있습니까? 감사.
Anthony Kong

대신 이것을 사용하십시오 : unix.stackexchange.com/questions/224227/…
Rich

2

다음 은 약간 개선 된 Shawn J. Goff의 답변 코드입니다 .

  • 고정 구문 오류에 의해 강조 shell-check첫 번째 예를 들어, ""$@"사실이 종료 함수 정의 문자열을.
  • return 0기본 함수의 반환 값을 호출자에게 다시 전달할 수 있도록 제거했습니다 .

.

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

Bash 4.3.46에서 나를 위해 작동하지 않습니다. Shaun J. Goff의 답변 효과 있습니다.
joelittlejohn

1
함수 정의 문자열 "종료"는 의도적입니다. 요점은 외부 함수의 인수를 COMP_WORDS배열에 포함시키는 것입니다. 우리가 사용하는 경우 make-completion-wrapper _apt_get _apt_get_install apt-get install예를 들어, 후 shift 2, $@포함 apt-get install. apt-get install할당 할 때 함수 정의에는 (두 리터럴 단어)가 포함됩니다 COMP_WORDS.
Jeffery

0

@Giles 답변의 확장으로 다음 편의 기능은 생성 된 래퍼의 이름을 자동으로 지정하여 make-completion-wrapper한 줄에 완료를 정의 할 수 있도록합니다.

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.