2016-11-30 14 views
1

방법, bash는 자동 완성을 작성하는? 나는 그것이라인 중간에서 bash 자동 완성 작업을하는 방법은 무엇입니까?</p><code>|</code> 커서를 표시 <pre><code>mycommand first_argument|garbage </code></pre> <p>, 그것은 <code>"first_argument"</code>하지 <code>"first_argumentgarbage"</code>이 compgen을 통과해야 : 나는 경우 있도록

COMPREPLY=($(compgen -W "add remove list use current" -- "$cur")) # buggy 
+1

마찬가지로, 예제에는 아무 것도 표시되지 않습니다. 버기가 무슨 뜻이야? 완료 스크립트를 제공 했습니까? '$ cur'의 내용은 무엇입니까? 'COMPREPLY' 선언 바로 전에 echo $ {COMP_WORDS [COMP_CWORD]}가 표시되는 것은 무엇입니까? – Aserre

+0

보도 자료 공간, 왼쪽, 탭? –

+0

@Aserre :'cur = $ {COMP_WORDS [COMP_CWORD]}'. 커서에 공간이 없으므로 물론 first_argumentgarbage입니다. – pihentagy

답변

1

배쉬 완료가 lot of different variables 사용하는 잘못된 방식으로 동작이 예에서

. 그 중 일부는 입력을 처리하고 완료 할 매개 변수를 결정하는 데 사용됩니다.

다음 설명은, I는 (커서 등 |)와 함께 본 시험의 입력을 사용한다 :

./test.sh ad re|garbage 
  • ${COMP_WORDS}는 : 배열의 형태로 입력 된 모든 단어를 포함한다. ${COMP_WORDS[@]} == {"./test.sh", "ad", "regarbage"}
    • 단어 구분 문자가 $COMP_WORDBREAKS 변수
  • $COMP_CWORD에서 발견된다 : 이러한 경우에, 포함 된 커서 curently 선택되는 단어의 위치를 ​​포함한다. 이 경우에는 다음을 포함합니다 : $COMP_CWORD == 2
  • $COMP_LINE : 전체 입력을 문자열 형태로 포함합니다. 이 경우에는 다음을 포함합니다. $COMP_LINE == "./test.sh ad regarbage"
  • $COMP_POINT : 전체 행에서 커서의 위치를 ​​포함합니다. 이 경우, 포함 $COMP_POINT == 15

여전히 동일한 데이터를 사용하여 수행하는 단계를 cur=${COMP_WORDS[COMP_CWORD]}regarbage${COMP_WORD} 인 어레이에서 인덱스 2의 요소를 리턴한다.

이 동작을 피하려면 $COMP_LINE$COMP_POINT 변수로 재생해야합니다. 여기에 내가 무엇을 최대 온 것입니다 :

# we truncate our line up to the position of our cursor 
# we transform the result into an array 
cur=(${COMP_LINE:0:$COMP_POINT}) 

# we use ${cur} the same way we would use ${COMP_WORDS} 
COMPREPLY=($(compgen -W "add remove list use current" -- "${cur[$COMP_CWORD]}")) 

출력 : 기본적으로 removegarbage 사이에 공간이 없다는 것을

> ./test2.sh ad re|garbage 
# press TAB 
> ./test2.sh ad remove|garbage 

참고. 이것이 당신이 원하는 행동이라면 완성 기술자를 따라 놀아야 할 것입니다.

+0

주셔서 감사합니다. 내가 언급 한 변수의 대부분을 알았지 만, 우아한 사용 패턴을 놓쳤습니다. 당신이 마지막으로 나에게주었습니다. Btw는 어떻게'$ {cur [$ COMP_CWORD]}'와'$ cur [COMP_CWORD]} '둘 다 작동합니까? – pihentagy

+0

'$ {cur [$ COMP_CWORD]}'와'$ cur [COMP_CWORD]'가 같은 결과를 리턴한다는 것은 순수한 행운입니다.배열 역 참조에 대한 자세한 내용은 [here] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html)을 참조하십시오. – Aserre

+0

나는 그것을 순수한 운이라고 부르지 않을 것이다. 언급 된 페이지는 인덱스를'(()) '안에 넣는 것과 같다 :> INDEXNR은 양수로 평가되어야하는 산술 표현식으로 취급된다. – pihentagy