tcsh 完了の問題

tcsh 完了の問題

私は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

  1. tcsh機能がまったくないので、これは否定的です。一般的な戦略は、別のスクリプトを生成し、それを外部プログラムとして呼び出すことです(一部の場合はaliasasourceも機能します)。

  2. まあ、それは実際に質問ではありません。あなたの観察が正しいことを確認できます。 :-)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 メーリングリスト、しかし。

関連情報