it-swarm-ko.tech

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

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

alias apt-inst='Sudo aptitude install'

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

69
levesque

우분투 포럼에서 이것에 대한 훌륭한 스레드 가 있습니다. 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=( "[email protected]" \${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 폴더. 해당 폴더가 경로에 있으면 자동 완성됩니다.

35
Shawn J. Goff

이 문제를 정확하게 해결하려면 complete-alias 를 시도하십시오. ( 면책 조항 : 저는 complete_alias의 저자입니다.)

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

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

complete_alias 등을 통해 모든 bash 인스턴스에서 .bash_profile 파일을 소스 할 수 있습니다.

installation

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
     > ~/.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   
37
Cyker

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
6
Adrian Lopez

다음은 Shawn J. Goff 's answer 의 코드입니다.

  • Shell-check 로 강조 표시된 구문 오류를 수정했습니다. 예를 들어 "의 첫 번째 "[email protected]"는 실제로 ended 함수 정의 문자열.
  • 기본 함수의 반환 값을 호출자에게 다시 전달할 수 있도록 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=( \"\[email protected]\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper
2
Tom Hale

이 문제를 인터넷으로 검색하여 여기에 도착했기 때문에 다른 답변의 접근 방식을 시도했습니다. 내가 실제로 이해하지 못하는 여러 가지 이유로 내 우분투 16.04에서 제대로 작동하지 않았습니다.

결국 나를 위해 일한 것은 예상보다 훨씬 사소했습니다. rsync에 대해 mycommand와 동일한 자동 완성을 사용하고 싶었습니다. 따라서 자동 완성 기능을 찾은 다음 그에 따라 complete이라고했습니다.

# Lookup of name of autocompletion function used for rsync
complete -p rsync
# Returns: complete -o nospace -F _rsync rsync

# Sourcing the rsync functions before, then using the same function for 'mycommand'
. /usr/share/bash-completion/completions/rsync
complete -o nospace -F _rsync mycommand

면책 조항 : 내 접근 방식의 단점이 다른 방법과 비교하여 확실하지 않습니다. 나는이 사소한 접근이 충분할 수있는 사람들을 도울 수 있기 때문에 주로 이것을 썼습니다.

2
M.Ermatinger

@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}
}
1
user84207