tcsh questões de conclusão

2

Eu venho do bash e estou olhando para o recurso de conclusão de tabulação do tcsh.

1) É correto que o tcsh não possa delegar o completamento a uma função do shell (a maneira como o bash faz com 'complete -F _func cmd')?

2) Ao delegar a conclusão para um programa externo, o tcsh fornece apenas COMMAND_LINE, ao contrário do bash, que fornece COMP_LINE e COMP_POINT. Isso significa que o tcsh não pode fazer isso corretamente:

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

onde eu quero que o programa fazendo a conclusão dê uma lista de opções não mencionadas . Porque tcsh só dará COMMAND_LINE como 'cmd --foo -' enquanto bash fornecerá toda a linha, mas dará uma pista sobre a posição do cursor em COMP_POINT.

    
por Gerry Lufwansa 23.11.2014 / 10:13

1 resposta

2
  1. tcsh não tem funções; então isso é um negativo. A estratégia geral é criar um script separado e chamar isso como um programa externo (para algumas coisas, como alias , um source também funcionará).

  2. Bem, isso não é realmente uma pergunta; Posso confirmar que suas observações estão corretas :-) Adicionar COMP_POINT pode não ser difícil; na verdade, aqui está o patch (que é NÃO testado muito bem):

    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', '
    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', '%pre%' };
    +Char STRCOMP_POINT[]   = { 'C', 'O', 'M', 'P', '_', 'P', 'O', 'I', 'N', 'T',
    +                          '%pre%' };
    
     #ifdef WARP
     Char STRwarp[]         = { 'w', 'a', 'r', 'p', '%pre%' };
    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;
         }
    
    ' }; +Char STRCOMP_POINT[] = { 'C', 'O', 'M', 'P', '_', 'P', 'O', 'I', 'N', 'T', + '%pre%' }; #ifdef WARP Char STRwarp[] = { 'w', 'a', 'r', 'p', '%pre%' }; 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; }

Você provavelmente quer levar isso para a lista de discussão tcsh , no entanto.

    
por 24.11.2014 / 18:25