tcsh 完成问题

tcsh 完成问题

我来自 bash,正在研究 tcsh 的制表符补全功能。

1) tcsh 不能将完成委托给 shell 函数(bash 使用“complete -F _func cmd”的方式)是否正确?

2) 当将完成委托给外部程序时,tcsh 仅提供 COMMAND_LINE,与 bash 提供 COMP_LINE 和 COMP_POINT 不同。这意味着 tcsh 无法正确执行此操作:

% cmd --foo -<tab> --bar --baz

我希望程序完成后给出一个列表未提及的选项。因为 tcsh 只会将 COMMAND_LINE 提供为“cmd --foo -”,而 bash 会提供整行,但会提供有关 COMP_POINT 中光标位置的线索。

答案1

  1. tcsh根本没有功能;所以这是一个负面影响。一般策略是创建一个单独的脚本,并将其作为外部程序调用(对于某些事情,例如alias, asource也可以工作)。

  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 邮件列表, 尽管。

相关内容