"토큰 순서" 스타일의 "-"(하이픈) 값이 명시적으로 지정되었음에도 "실행 가능" 태그 일치를 방지하는 이유는 무엇입니까? [폐쇄]

"토큰 순서" 스타일의 "-"(하이픈) 값이 명시적으로 지정되었음에도 "실행 가능" 태그 일치를 방지하는 이유는 무엇입니까? [폐쇄]

아래 코드를 사용하면 모든 것이 예상대로 작동합니다.

  • 글을 쓰고 키를 c누르면 TAB올바른 순서로 적절한 완성이 이루어집니다.

    영상

  • 키를 쓰고 ./누르면 TAB레이블이 완성됩니다 executables.

    영상


# 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 $'%{\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

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때문에 아무 것도 표시되지 않을 것으로 예상됩니다 . 그러나 , , , 및 는 완성 기능을 제공하지 않으므로 기본적으로 다른 태그와 일치하려고 시도합니다. (즉, 태그 제외 ) 완성을 시도합니다. functionstag-order
ExecutablesBuiltinsCommandsAliasesVariablesKeywordszshfunctions

따라서 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?

어떻게 수정하고 원하는 동작을 얻을 수 있나요?

답변1

이 경우 태그가 executable호출됩니다. _files -g '*(-*)그런 다음 _filesmore 가 호출되므로 _tags다음을 지정해야 합니다.함수에 암시적으로 지정된 레이블 완성, 또한.

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-files하고 유용할 수 있습니다 .directories

% 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직접 다음과 같이 사용하십시오.

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"
            -
          )
'

다음 예에서는 "Directory"와 "Executable"이 별도의 그룹에 있습니다.

% 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의 예입니다.

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"
            -
          )
'

업데이트: 불필요한 블록을 주석 처리했습니다.

관련 정보