Как я могу определить предпочтение завершения zstyle для псевдонима zsh?

Если вы видите control Q (0x11) и control S (0x13), это XON / XOFF: артефакты управления потоком. Вы должны видеть их только в том случае, если ваше соединение говорит, что полагается на программное управление потоком; драйвер терминала может отправлять их на устройство (точно так же, как пользователь может нажимать эти клавиши для управления другим направлением).

Дополнительная литература:

Комментарий о «макете» для Lynx неясен:

  • 0x11 не является пробельным символом в любом наборе символов, который приходит разум.
  • глядя на наборы символов , о которых знает Lynx, ни один из них не показывает 0x11 как непечатаемый символ.
  • набор символов дисплея можно настроить в меню опций .
  • Lynx будет использовать это только как печатный символ из-за некоторой странной комбинации настроек локали и набора символов отображения.

Отсутствие некоторых подробностей о том, почему Lynx может использовать 0x11 в качестве непечатаемого символа, звучит так, как будто драйвер терминала отправляет XON / XOFF с довольно маленьким буфером.

В ответ на комментарии ( какой терминал использует TERM = ansi ? На снимке экрана показан xterm ), lynx может писать (с использованием curses) стрелка влево, например, символ ACS_LARROW . В исходном коде это выглядит так:

    /*
     * Draw the left scrolling-indicator now, to avoid the complication of
     * overwriting part of a multicolumn character which may lie in the first
     * position.
     */
    if (IsPanned && lft_cells) {
        CTRACE_EDIT((tfp, "Draw left scroll-indicator\n"));
        TmpStyleOn(prompting ? s_prompt_edit_arr : s_aedit_arr);
        LYmove(StartY, StartX);
        LYaddch(ACS_LARROW);
        TmpStyleOff(prompting ? s_prompt_edit_arr : s_aedit_arr);
        lft_shift = 1;
    }

Теперь ... lynx сам знает только об этом определении в :

#define ACS_LARROW      NCURSES_ACS(',') /* arrow pointing left */

, в то время как описание терминала для "ansi" дает фактическое отображение в klone + acs :

acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,

К счастью (для удобства чтения), отображение, которое вас интересует, является второй записью сопоставление запятой (экранированной) с восьмеричным числом 021:

    \,\021

и это ваш DC1 (восьмеричный 021 - это шестнадцатеричный код 0x11). Но это отображение не используется в xterm . Символы рисования линий для xterm (если не используется UTF-8, где ncurses игнорирует описание терминала) не включают стрелку влево. Это отображение определено в xterm-basic , в котором, как вы видите, нет запятой (запятая в конце является разделителем):

acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,

В руководстве по xterm предлагаются полезные значения для TERM , и термин "ansi" (хотя и находится в списке) не первый. Это было некоторое время (до ncurses):

   Terminal  database (terminfo (5) or termcap (5)) entries that work with
   xterm include

          an optional platform-specific entry ("xterm-new"),
          "xterm",
          "vt102",
          "vt100",
          "ansi" and
          "dumb"

Например, я вижу это в X11R5 (1993). Но он был представлен ранее , появившись в X10R4 (1986). Я подозреваю, что значение «ansi» для эмуляторов терминала немного изменилось за 30 лет (это соответствует ANSI.SYS , который отличается от xterm и т. Д.).Используйте «xterm» (или «xterm-new» ), и вы получите лучшие результаты.

1
01.08.2018, 14:48
1 ответ

Предполагая, что табуляция стирается после stuffв обоих этих случаях

% ls
bar     foo.txt
% whence stuff
% alias stuff=less
% zstyle ':completion:*:*:stuff:*' file-patterns '*.txt:all-files'
% stuff
bar      foo.txt

соответствующий регулятор из zshoptions(1)

COMPLETE_ALIASES
    Prevents aliases on the command line from being internally sub-
    stituted before completion is attempted. The effect is to make
    the alias a distinct command for completion purposes.

так

% setopt COMPLETE_ALIASES
% stuff foo.txt

иначе псевдоним уже что-то другое.

Чтобы проверить наличие побочных эффектов, мы должны подтвердить, что это изменение не нарушает завершение псевдонимов, для которых нет завершения или настройки стиля,

% setopt COMPLETE_ALIASES
% whence foo
% unfunction _foo
unfunction: no such hash table element: _foo
% alias foo=ls
% foo (eval):1: command not found: _foo

поэтому с установленным COMPLETE_ALIASESвам может потребоваться настроить завершение для каждого псевдонима или перечислить или иным образом включить имя псевдонима (s )в соответствующем compdef, например.

% compdef _ls foo
% foo
...

С другой стороны, я нахожу оболочки execдовольно элегантными, поскольку они, в отличие от псевдонимов оболочки, могут вызываться с помощью exec(3)или system(3)без необходимости загружать довольно большую оболочку или загрязнять то, что должно быть простой системный вызов с интерактивной настройкой оболочки.

3
27.01.2020, 23:31

Теги

Похожие вопросы