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