Autocomplete

tcsh完成問題

  • November 24, 2014

我來自 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. 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 mailinglist上處理這個問題。

引用自:https://unix.stackexchange.com/questions/169503