首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“标签顺序”样式中的值'-‘(连字符)会阻止“可执行文件”标记的匹配,即使该标记是显式指定的?

为什么“标签顺序”样式中的值'-‘(连字符)会阻止“可执行文件”标记的匹配,即使该标记是显式指定的?
EN

Unix & Linux用户
提问于 2018-05-09 19:12:15
回答 1查看 400关注 0票数 3

在下面的代码中,一切都如预期的那样工作:

  • 当我编写c并按下TAB键时,我会按照正确的顺序得到适当的完成。
  • 当我编写./并按下TAB键时,就会得到executables标记的完成。
代码语言:javascript
复制
# Always use menu selection when using unambiguous completions.
zstyle ':completion:*:*:*:*:*' menu 'select'

# Show only completions.
zstyle ':completion:*:*:*:*:*' completer _complete

# Group name becomes the name of the matching tag.
zstyle ':completion:*:*:*:*:*' group-name ''

# Configure the order of tag matching as well as their descriptions.
zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
          )
'

# Configure the order in which completion groups will be shown.
zstyle ':completion:*:*:-command-:*:*' group-order 'Executables' 'Builtins' 'Commands' 'Aliases' 'Functions' 'Variables' 'Keywords'

# Configure the format for each group/tag description.
zstyle ':completion:*:*:*:*:descriptions' format 但是,如果我指定的标记没有生成任何完成,那么其他标记也将被尝试。证明这一点的最简单方法是将functions标记从tag-order样式中排除在外:zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
          )
'然后创建两个具有唯一前缀的函数:function unique_prefix_A() { }
function unique_prefix_B() { }现在,当我编写unique_prefix_并按下TAB键时,我不希望看到任何东西,因为functions标记已经从tag-order中删除了。但是,由于Executables、Builtins、Commands、Aliases、Variables和Keywords没有提供任何完成,zsh默认情况下将尝试匹配其他标记,即排除的functions标记,以尝试提供任何完成。因此,将建议使用unique_prefix_A和unique_prefix_B函数:我不喜欢这种行为,只想将搜索限制在我已经显式指定的标记上。标签顺序风格的手册给出了一个简单的解决方案:如果任何值仅由连字符组成,则只生成在其他值中指定的标记。通常,如果指定的标记无法生成任何匹配项,则所有未显式选中的标记都将最后一次尝试。这意味着,仅由单个连字符组成的单个值将关闭完成。应用该解决方案:# Configure the order of tag matching as well as their descriptions.
zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
           "-"
          )
'目前的行为是:当我编写c并按下TAB键时,我会按照正确的顺序得到适当的完成。)当我编写./并按下TAB键时,我什么也得不到。为什么现在只有executables标记不起作用?我怎样才能修复它并得到期望的行为呢?%{\e[0;38;2;0;0;0;48;2;200;150;0m%} %d %{\e[0;38;2;200;150;0;48;2;0;0;0m%}%{\e[0m%}'

# Initialize completion system.
autoload -Uz compinit && compinit

但是,如果我指定的标记没有生成任何完成,那么其他标记也将被尝试。

证明这一点的最简单方法是将functions标记从tag-order样式中排除在外:

A18

然后创建两个具有唯一前缀的函数:

A19

现在,当我编写unique_prefix_并按下TAB键时,我不希望看到任何东西,因为functions标记已经从tag-order中删除了。

K124K225

但是,由于ExecutablesBuiltinsCommandsAliasesVariablesKeywords没有提供任何完成,zsh默认情况下将尝试匹配其他标记,即排除的functions标记,以尝试提供任何完成。

因此,将建议使用unique_prefix_Aunique_prefix_B函数:

B36

我不喜欢这种行为,只想将搜索限制在我已经显式指定的标记上。

标签顺序风格的手册给出了一个简单的解决方案:

J138F139H140

如果任何值仅由连字符组成,则只生成在其他值中指定的标记。通常,如果指定的标记无法生成任何匹配项,则所有未显式选中的标记都将最后一次尝试。这意味着,仅由单个连字符组成的单个值将关闭完成。

H241F242J243

应用该解决方案:

A44

目前的行为是:

F145H146

当我编写c并按下TAB键时,我会按照正确的顺序得到适当的完成。

H249F250B51

)

F152H153

当我编写./并按下TAB键时,我什么也得不到。

H256F257B58

为什么现在只有executables标记不起作用?

我怎样才能修复它并得到期望的行为呢?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-05-18 23:08:27

在本例中,executable标记调用_files -g '*(-*)。然后_files调用更多的_tags,因此也有必要在完成函数中指定这些隐式指定的标记。

代码语言:javascript
复制
zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            globbed-files directories"
           "-"
          )
'

在本例中添加globbed-filesdirectories是有用的:

代码语言:javascript
复制
% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 16 root root 69632 May 18 15:27 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
directory/        executable-file*

但是在上面的设置中,目录和本地可执行文件将进入相同的“可执行”组。如果我们想让“目录”进入其他组,我们可以直接指定file-patterns并像这样使用它:

代码语言:javascript
复制
zstyle ':completion:*:*:-command-:*:*' file-patterns \
 '*(#q-*):executables:Executables *(-/):directories:Directories'

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            directories:Directories"
            -
          )
'

在下面的示例中,“目录”和“可执行文件”位于分隔的组中:

代码语言:javascript
复制
% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 15 root root 69632 May 18 15:24 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
executable-file*
Directories
directory/

下面是得到的最小的.zshrc示例:

代码语言:javascript
复制
autoload -Uz compinit && compinit
zstyle ':completion:*:*:*:*:*' group-name ''
zstyle ':completion:*:descriptions' format '%B%F{black}%d%f%b'
zstyle ':completion:*:*:*:*:*' menu 'select'

# This comment out block is just for a reminder of my answer's first half.
# zstyle -e ':completion:*:*:-command-:*:*' tag-order '
#       reply=(
#                    "executables:Executables:Executables
#                       builtins:Builtins:Builtins
#                       commands:Commands:Commands
#                       aliases:Aliases:Aliases
#                       functions:Functions:Functions
#                       parameters:Variables:Variables
#                       reserved-words:Keywords:Keywords
#                       globbed-files directories"
#                    "-"
#                   )
# '

zstyle ':completion:*:*:-command-:*:*' file-patterns \
 '*(#q-*):executables:Executables *(-/):directories:Directories'

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            directories:Directories"
            -
          )
'

更新:注释掉不可缺少的块。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/442846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档