2013-07-12 2 views
3

다른 키 조합으로 트리거되는 여러 탭 완성 루틴을 사용할 수 있습니까?Bash 터미널의 다중 탭 완성 루틴

예를 들어, myprog -help의 출력을 탭 완성 옵션으로 구문 분석하는 사용자 정의 탭 완성 기능이 있습니다. 에서 탭을 그대로두고 내 맞춤 완성을 과 같은 것으로 바인딩 할 수있는 방법이 있습니까? Shift + ?

+0

나는 당신이 ['bind'] (http://linux.about.com/library/cmd/blcmdl1_bind.htm)를 사용하여 그것을 얻을 수 있다고 생각합니다 ... – anishsane

답변

2

키 바인딩 자체가 작성한 Readline의 일부, 그리고 .bashrc (등)에 ~/.inputrc 변경 또는 bind 명령을 사용 할 수 있지만 간접적으로, 사용자 정의 함수에 직접을 결합하지 않는다 이러한 함수를 호출 할 수있는 매크로

"\C-xhf": dump-functions  # for ~/.inputrc 
bind '"\C-xhf":dump-functions' # in .bashrc (etc.) 

bind -l 당신에게 당신 바인드에 내장 기능을 보여줍니다. 이 방법으로 매크로를 추가 할 수 있습니다. 완료 컨텍스트가 아니더라도 원하는 bash 함수를 실행하여 결과가 명령 줄에 다시 채워지지 않도록 할 수 있습니다. 예 :

"\C-xc": "echo hi\n"  # note it's a just macro, not a direct binding. 

난 당신이 이미 명령 줄의 왼쪽에서 명령에 대한 complete 내장과 완료를 대체 할 수 있습니다 알고 같은데요. 일반적으로 나는 그냥 그런 식으로 자신의 완료 루틴을 만들고 대신 대체 세트를 호출하는 방법을 사용하여 그들을 사용하는 것이 좋습니다. 예 : 나는 universal-argument 바인딩 실험

_complete_ssh() 
{ 
    local ssharg="${COMP_WORDS[COMP_CWORD]}" 
    local filter=cat 
    case "$ssharg" in *@*) filter="sed s/^/${ssharg%@*}@/" ;; esac 
    local host=${ssharg##*@} 
    COMPREPLY=($(compgen -W "` 
     sed 's/[, ].*//' ~/.ssh*/known_hosts{,2} | sort | uniq 
    `" $host | $filter)) 
    return 0 
} 
complete -F _complete_ssh ssh   # for any command starting with "ssh "... 

은 (UA 후, "C-XF"기능을 실행하는 접두사 "C-쑤") 매크로를 통해 실행하는 기능에 영향을 줄 수 있는지,하지만 난 할 수 기능이 UA를 검출 할 수 있다는 것을 나타 내기 위해 아무것도 발견하지 못했습니다. bind에는 이전 명령에 대한 UA의 기능을 되돌릴 수있는 옵션이 있거나 사용자 정의 완성 기 하위 기능이 complete 내부에서 UA를 감지 할 수 있도록 허용하는 $ -s something이 있다고 생각할 수 있습니다. 하지만 readline 소스 코드에서 그 아이디어에 대한 어떤 징조도 보이지 않습니다. 어떤 키 바인딩이 함수 나 매크로를 불러 일으켰는지를 알 수있는 확실한 방법은 없습니다. 두 키 바인딩을 동일한 기본 키 (complete)로 매핑 한 다음 다시 역 추적하여 어떤 키 바인딩이 트리거되었는지 확인하는 것이 좋습니다.

Shift-Tab은 구속하기가 어려우므로 구식 터미널에서 입력하는 것은 불가능합니다. bash는 X 라이브러리를 사용하지 않으며 Shift 키를 수정 자로 직접 볼 수 없으며, 대신 적용 가능한 개념의 수식어가없는 일부 문자 집합의 터미널 또는 터미널 에뮬레이터에 따라 달라집니다.