저는 bash 출신이고 tcsh의 탭 완성 기능을 작업 중입니다.
1) tcsh가 완료를 쉘 함수에 위임할 수 없다는 것이 맞습니까(bash가 "complete -F _func cmd"를 사용하는 방식)?
2) 완료를 외부 프로그램에 위임할 때 tcsh는 COMP_LINE 및 COMP_POINT를 제공하는 bash와 달리 COMMAND_LINE만 제공합니다. 이는 tcsh가 이를 올바르게 수행할 수 없음을 의미합니다:
% cmd --foo -<tab> --bar --baz
프로그램이 완료되면 목록을 제공하고 싶습니다.언급되지 않은옵션. tcsh는 COMMAND_LINE을 "cmd --foo -"로 제공하는 반면 bash는 전체 라인을 제공하지만 COMP_POINT의 커서 위치에 대한 단서를 제공합니다.
답변1
tcsh
기능이 전혀 없으므로 이는 부정적입니다. 일반적인 전략은 별도의 스크립트를 생성하고 이를 외부 프로그램으로 호출하는 것입니다(일부 경우에는alias
asource
도 작동함).글쎄, 그것은 실제로 질문이 아닙니다. 귀하의 관찰이 정확하다는 것을 확인할 수 있습니다. :-)
COMP_POINT
실제로 추가하는 것은 어렵지 않을 수 있습니다. 이는 패치입니다.아니요잘 테스트됨):diff --git i/tc.const.c w/tc.const.c index c472acc..1a69fee 100644 --- i/tc.const.c +++ w/tc.const.c @@ -469,6 +469,8 @@ Char STRPROGRAM_ENVIRONMENT[] = { 'P', 'R', 'O', 'G', 'R', 'A', 'M', #endif /* _OSD_POSIX */ Char STRCOMMAND_LINE[] = { 'C', 'O', 'M', 'M', 'A', 'N', 'D', '_', 'L', 'I', 'N', 'E', '\0' }; +Char STRCOMP_POINT[] = { 'C', 'O', 'M', 'P', '_', 'P', 'O', 'I', 'N', 'T', + '\0' }; #ifdef WARP Char STRwarp[] = { 'w', 'a', 'r', 'p', '\0' }; diff --git i/tw.comp.c w/tw.comp.c index 03da837..101962f 100644 --- i/tw.comp.c +++ w/tw.comp.c @@ -635,9 +635,12 @@ tw_complete(const Char *line, Char **word, Char **pat, int looking, eChar *suf) default: abort(); /* Cannot happen */ } + tsetenv(STRCOMMAND_LINE, line); + tsetenv(STRCOMP_POINT, str2short(xasprintf("%d", (char) CursorH))); res = tw_result(com, pat); Unsetenv(STRCOMMAND_LINE); + Unsetenv(STRCOMP_POINT); cleanup_until(buf); return res; }
당신은 원할 수도 있습니다tcsh 메일링 리스트, 하지만.