bash completion을 에일리어스로 작업하려면 어떻게 해야 하나요?
적절한 예:
저는 bash v3.2.17을 사용하는 mac에서 bash_completion 변종과 함께 macports를 통해 설치된 git을 사용하고 있습니다.
「 」라고 하면,git checkout m<tab>
예를 들어, 나는 그것을 완성한다.master
.
나는 지만, 칭 to to to의 별칭을 있다.git checkout
,gco
. 라고 gco m<tab>
이치노
이상적으로는 자동 완성이 내 가명에 마법처럼 작용했으면 좋겠어.가능합니까?그렇지 않으면 에일리어스별로 수동으로 커스터마이즈하고 싶습니다.그럼 어떻게 해야 하죠?
위 댓글에서 말씀드렸듯이
complete -o default -o nospace -F _git_checkout gco
더 이상 작동하지 않습니다.'아예'라는 게 __git_complete
다음과 같은 에일리어스의 완료를 설정하기 위해 사용할 수 있는 git-tension.http:
__git_complete gco _git_checkout
저도 이 문제에 부딪쳐 이 코드 스니펫을 생각해 냈습니다.그러면 모든 별칭이 자동으로 완성됩니다.모든(또는 임의의) 에일리어스를 선언한 후 실행합니다.
# wrap_alias takes three arguments:
# $1: The name of the alias
# $2: The command used in the alias
# $3: The arguments in the alias all in one string
# Generate a wrapper completion function (completer) for an alias
# based on the command and the given arguments, if there is a
# completer for the command, and set the wrapper as the completer for
# the alias.
function wrap_alias() {
[[ "$#" == 3 ]] || return 1
local alias_name="$1"
local aliased_command="$2"
local alias_arguments="$3"
local num_alias_arguments=$(echo "$alias_arguments" | wc -w)
# The completion currently being used for the aliased command.
local completion=$(complete -p $aliased_command 2> /dev/null)
# Only a completer based on a function can be wrapped so look for -F
# in the current completion. This check will also catch commands
# with no completer for which $completion will be empty.
echo $completion | grep -q -- -F || return 0
local namespace=alias_completion::
# Extract the name of the completion function from a string that
# looks like: something -F function_name something
# First strip the beginning of the string up to the function name by
# removing "* -F " from the front.
local completion_function=${completion##* -F }
# Then strip " *" from the end, leaving only the function name.
completion_function=${completion_function%% *}
# Try to prevent an infinite loop by not wrapping a function
# generated by this function. This can happen when the user runs
# this twice for an alias like ls='ls --color=auto' or alias l='ls'
# and alias ls='l foo'
[[ "${completion_function#$namespace}" != $completion_function ]] && return 0
local wrapper_name="${namespace}${alias_name}"
eval "
function ${wrapper_name}() {
let COMP_CWORD+=$num_alias_arguments
args=( \"${alias_arguments}\" )
COMP_WORDS=( $aliased_command \${args[@]} \${COMP_WORDS[@]:1} )
$completion_function
}
"
# To create the new completion we use the old one with two
# replacements:
# 1) Replace the function with the wrapper.
local new_completion=${completion/-F * /-F $wrapper_name }
# 2) Replace the command being completed with the alias.
new_completion="${new_completion% *} $alias_name"
eval "$new_completion"
}
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"
unset wrap_alias
»git-completion.bash
다음 행이 있습니다.
complete -o default -o nospace -F _git git
행 함수, 이은 '_git 수'에 할 수 ..bash_profile
:
complete -o default -o nospace -F _git_checkout gco
이상적으로는 자동 완성이 내 가명에 마법처럼 작용했으면 좋겠어.가능합니까?
예, 완전한 별칭 프로젝트를 통해 가능합니다(Linux에서).Mac에 대한 지원은 실험적인 것이지만 사용자가 성공했다고 보고했습니다.
g='에 별칭을 붙이고 git 별칭과 결합하여 다음과 같이 입력합니다.
$ g co <branchname>
특정 사용 사례에 대한 간단한 수정은 git-completion에 한 줄을 추가하는 것이었습니다.
이 행 바로 아래:
__git_complete git _git
단일 'g' 별칭을 처리하기 위해 다음 행을 추가했습니다.
__git_complete g _git
은 ""를 사용하는 입니다.~/.bash_completion
"를 gco
입니다.git checkout
.이거 넣으세요.
_xfunc git __git_complete gco _git_checkout
ㅇㅇㅇㅇ에서~/.bashrc
요.
alias gco='git checkout'
2개의 선.바로 그겁니다.
설명:
~/bash_completion
bash_temption 스___ ___ 。는 gentoo에 ./usr/share/bash-completion/bash_completion
_xfunc git
는, 「」, 「소싱」을 합니다.git-completion
파일링에는 다른 .~/.bashrc
..git-completion.sh
의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의 '자신의'에서'~/.bashrc
제가 보기엔 재미없는 파일입니다.
git-completion
스크립트가 필요합니다.방법을 찾으면 코멘트나 편집을 부탁드립니다.
Git git git git git git git git git git git 。를 들어, 나의 가.~/.gitconfig
하다
[alias]
co = checkout
'이렇게'를 입력할 수 .git co m<TAB>
「」, 「」로 git co master
,, , 。git checkout
명령어를 입력합니다.
이 포럼 페이지에는 해결 방법이 나와 있습니다.
도 이 를 하다에 ..bashrc
★★★★★★★★★★★★★★★★★」.bash_profile
:
# Author.: Ole J
# Date...: 23.03.2008
# License: Whatever
# Wraps a completion function
# 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"
return 0
}"
eval "$function"
}
# and now the commands that are specific to this SO question
alias gco='git checkout'
# we create a _git_checkout_mine function that will do the completion for "gco"
# using the completion function "_git"
make-completion-wrapper _git _git_checkout_mine git checkout
# we tell bash to actually use _git_checkout_mine to complete "gco"
complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco
이 솔루션은 Balshetzer의 스크립트와 비슷하지만, 이 솔루션만이 실제로 효과가 있습니다.(Balshetzer의 스크립트는 제 가명에 문제가 있었습니다.)
'찾아주세요'를 돼요.complete
명령어를 사용하여 에일리어스 이름을 가진 행을 복제합니다.
있다alias d-m="docker-machine"
로...d-m
.docker-machine
(brew를 이 "Brew" Mac에 .cd `brew --prefix`/etc/bash_completion.d/
.
저 같은 경우에는 파일 편집했습니다.docker-machine
.
까지 쭉 다음과 같은것이 .
complete -F _docker_machine docker-machine
그래서 다른 행에 제 가명을 추가했습니다.
complete -F _docker_machine docker-machine
complete -F _docker_machine d-m
먼저 원래 완료 명령을 검색합니다.예:
$ complete | grep git
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git
이제 시작 스크립트에 다음 항목을 추가합니다(예: ~/.bashrc).
# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g
# load dynamically loaded completion functions (may not be required)
_completion_loader git
_completion_loader
행이 필요하지 않을 수 있습니다.에 따라서는, 해, 「Complete )」가 동적으로 .TAB
에일리어스 + 에일리어스 + 에일리어스 + 에일리어스 + 에일리어스 를 해 보세요.TAB
"기능:완료:기능 '_docker'를 찾을 수 없습니다."
이 질문에는 많은 답이 있고 나처럼 혼란스러운 독자들도 많을 것이다. Git의 여러 .도 잘 모르겠어요alias g=git
그 but but but가 있다.g
함수로 정의됩니다.
이것을 달성하기 위해서, 나는 여기 있는 다른 대답들을 하나의 해결책으로 묶어야 했다.이것은 이미 답을 반복하고 있지만, 저는 이 질문을 처음 접했을 때처럼 이 편집본이 유용하다고 느꼈습니다.
은 오래된 Git 디폴트 및 "Git" "Ubuntu" "Git" "Git" "Ubuntu" "Git" "Ubuntu" "Ubuntu" "Ubuntu" "Ubuntu" "Git" 를 전제로 합니다.brew install git
MacOS mac mac mac mac mac mac mac mac mac mac나중에 brew 설치 완료가 bash에 의해 처리되지 않은 경우(나중에 진단하겠습니다).
# Alias g to git
g() {
if [[ $# > 0 ]]; then
git "$@"
else
git status -sb
fi
}
# Preload git completion in Ubuntu which is normally lazy loaded but we need
# the __git_wrap__git_main function available for our completion.
if [[ -e /usr/share/bash-completion/completions/git ]]; then
source /usr/share/bash-completion/completions/git
elif [[ -e /usr/local/etc/bash_completion.d/git-completion.bash ]]; then
source /usr/local/etc/bash_completion.d/git-completion.bash
fi
if command_exists __git_complete; then
__git_complete g _git
elif command_exists __git_wrap__git_main; then
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g
fi
Felipe Contreras는 이미 Git 완료 기능(Git 2.30의 Zsh 완료 참조)에 대해 상당히 활성화 되어 있으며, (아마도 Git 2.31, Q1 2021의 경우) 에일리어스 자동 완성에 도움이 되는 공개 함수를 제안하고 있다.
그의 제안:
2012년에 저는 다음과 같은 에일리어스를 지정할 수 있는 도우미의 도입을 주장했습니다.
git_complete gf git_fetch
에 대한 때문에 이 있었다.
git_complete
»_git_complete
»_GIT_complete
그리고 일부 가명은 실제로 작동하지 않았습니다.2020년으로 빨리 넘어가도 공공 기능에 대한 가이드라인이 없고, 수정 사항을 보냈는데도 여전히 이러한 별칭이 작동하지 않습니다.
이것은, 커스텀 에일리어스(이 페이지)를 설정하는 데 필요한 이 기능을 사용하는 것을 막지는 않습니다.실제로 이것은 권장되는 방법입니다.
그러나 사용자가 입력해야 하는 번거로움이 있습니다.
__git_complete gf _git_fetch
또는 더 나쁜 경우:
__git_complete gk __gitk_main
8년이면 완벽한 제품이 나올 때까지 기다릴 수 있는 충분한 시간이 됩니다.실제로 사용하기 쉬운 퍼블릭 기능(같은 이름으로)을 정의합니다.
__git_complete gf git_fetch __git_complete gk gitk
이전 버전과의 호환성도 유지합니다.
논리는 다음과 같습니다.
- if
$2
it , "존재합니다"- 않은 경우는, 「」의 여부를 확인해 .
__$2_main
- 않은 경우는, 「」의 여부를 확인해 .
_$2
- 그렇지 않으면 실패한다.
바인딩할 수 있습니다.alias-expand-line
★★★★★★★★★★★★★★★★★」complete
액션) ('디폴트액션')~/.inputrc
그러기 위해서는 먼저 각 액션을 키에 바인드한 후 체인을 해야 합니다.
"\M-z":alias-expand-line
"\M-x":complete
TAB:"\M-z\M-x"
원하는 키 조합으로 사용하셔도 되고, 무료이기 때문에 메타를 사용합니다.상세한 것에 대하여는, 을 참조해 주세요.
새 터미널을 열고 별칭을 입력하면 다음과 같이 됩니다.
gco m<TAB>
라인은 다음과 같이 변환됩니다.
git checkout master
물론 가명이 없어도 정상적으로 동작합니다.
「 」를 사용하고 alias g='git'
코드 을 에 .bash_aliases
complete -o default -o nospace -F _git g
이 질문이 bash에 대한 질문인 것은 알지만 zsh를 사용하는 경우 @hesky-fisher 답변으로 변경하면 해결됩니다.
부터
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"
대상:
# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias | sd '^([^=]+)=(.+)' 'wrap_alias $1=$2')"
(이것을 대체할 수 있습니다)sed
sd
훨씬 낫다고 생각합니다)
가 없기 alias -p
★★★★★★★★★★★★★★★★★」alias
되지 않음zsh는 출력되지 않습니다.
alias <something>=<value>
bash 때처럼, 하지만 오히려
<something>=<value>
를 나, 가, 가에 ..zlogin
언급URL : https://stackoverflow.com/questions/342969/how-do-i-get-bash-completion-to-work-with-aliases
'bestsource' 카테고리의 다른 글
Swift를 사용하여 루트 보기로 팝업하려면 어떻게 해야 합니까?UI? (0) | 2023.04.19 |
---|---|
VBA를 사용하여 파일이 있는지 확인합니다. (0) | 2023.04.14 |
여러 줄 명령어 내의 Bash 스크립트에 대한 코멘트 (0) | 2023.04.14 |
코드 뒤에 있는 별 모양의 그리드 (0) | 2023.04.14 |
CMake에서 사용자 환경 변수를 가져오는 방법(Windows) (0) | 2023.04.14 |