명령이 별칭인 경우 인수에 대해 탭 완성이 작동하지 않습니다.

명령이 별칭인 경우 인수에 대해 탭 완성이 작동하지 않습니다.

내가 가장 좋아하는 편집기 mg에 대해 별칭 ee를 정의했습니다. 내가 뭔가를 할 때

mg fo

그런 다음 탭을 클릭할 때 foo 파일이 있으면 탭 완성이 표시됩니다.

mg foo

내가 사용해 본 대부분의 시스템(예: 지난 몇 년 동안의 모든 우분투 버전과 몇 가지 데비안 설치)에서

ee fo

역시 제대로 됐어

ee foo

그러나 내가 사용하고 있는 한 시스템(Debian 6.0 및 GNU bash 4.1.5(1)-릴리스 포함)에서 별칭이 있는 버전에서는 탭 완성이 실패합니다. 이는아니요별칭 자체를 완성하는 데 문제가 있습니다. - 별칭을 완성하는 데 문제가 있습니다.논쟁별칭 명령. 데비안 시스템에서 이 동작을 수정할 수 있는 방법이 있나요? Bash 4.2.x로 업그레이드하시겠습니까? 구성 파일을 조작하고 계십니까?

답변1

편집 : 알았어. 제가 상황을 잘못 판단한 것 같습니다. 프로그램 옵션이 다음과 같다고 생각하셨는데요:

$ mplayer_alias -pla<tab><tab>
-playing-msg  -playlist
$

하지만 파일 완성이라고 추측합니다. 잘 모르겠지만 한번 시도해 보세요.

빠른 수정으로 다음과 같이 작동합니다.

complete -f -o default ee

주다:

$ ee<tab><tab>
file1 file2 file3
$

~처럼내장 기능의 프로그래밍 가능한 완성. 예를 들어 -X pattern유용할 수 있습니다. 예를 들어 제외 .swp.swo파일은 다음과 같습니다.

complete -f -X '*.sw[op]' ee

만 표시 .zip, .ZIP:

complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias

shopt -s extglob일부는 구성 파일에 추가해야 할 수도 있습니다 .



이전 답변:

에서 이 작업을 수행할 수 있습니다 .bash_completion.

적어도 스타터로서.

핵심 아이디어는 complete기존의 전체 스크립트를 사용하여 별칭을 추가하는 것 입니다.진짜프로그램. 여기서는 모두 다음 형식이라고 가정합니다.

complete -F _complete_function_from_original program_name

다음 명령을 실행하여 그것이 무엇인지 알아낼 수 있습니다 complete -p program_name. 먼저 확인하는 것이 가장 좋습니다.

일부 방법의 경우, 예를 들어 apt-get별칭 + 로드만 사용할 수 있습니다.

_load_comp_hack apt-get myalias

다른 경우에는 mplayer다음과 같은 함수 래퍼가 필요합니다.

myalias() { mplayer "$@"; }
                      |
                      +--- Could be messy

이 문제를 해결하는 더 좋은 방법이 있을 수 있지만 제게는 잘 작동합니다. 나는 원래 프로그램의 기능을 확장하는 래퍼 스크립트에 주로 사용합니다. 아직 별칭에 사용하지 않았습니다.

나는 이 해킹이 안전하다고 생각하지 않지만, 작동하는지 확인할 수 있습니다.

_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

_longopt일부 프로그램은 소스 파일을 찾을 수 없는 보다 일반적인 완성 기능을 사용합니다 . 일반적으로 소스도 필요하지 않으므로 더 간단한 변형은 다음과 같습니다.

_load_comp_hack()
{
    local cc=
    if cc=$(complete -p "$1" | cut -d' ' -f3); then
            complete -F "$cc" "$2"
    fi
}

IIRC, 여기서 한 가지 문제는 일부 완료 스크립트가 첫 번째 실행과 같이 처음 실행될 때까지 로드되지 않는다는 것입니다
prog tabtab. 대안으로 else파일 소스가 실패하는 경우 추가할 수 있습니다.

답변2

문제는 bash-completion이 별칭을 이해하지 못한다는 것입니다. 따라서 별칭을 작성하면 알 수 없는 명령으로 처리되어 자동 완성되지 않습니다. 원하는 경우 기본 파일 이름 완성으로 돌아갈 수 있습니다. 또는 다음을 설치할 수 있습니다.프로그램자동 완성 전에 별칭을 확장하고 별칭 명령으로 별칭을 완성합니다.

관련 정보