Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

fix: Wrong completion context for chained commands in zsh

Đang mở
#139 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
82/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
dart, zsh
Lĩnh vực
cli

Hướng nghiên cứu

Start with lib/src/installer/shell_completion_configuration.dart and CompletionState.fromEnvironment, which the issue identifies as passing and reading the completion context. Check the existing completion tests and how the words passed after completion -- relate to COMP_CWORD. Done means commands after |, && or ; suggest the current command’s options, while existing bash completion still works.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

bug
Description

Thank you for this cool lib! I'm facing a minor bug when used with zsh.

In zsh, completing a command that isn't at the start of the command line (after |, && or ;) uses the wrong context. The zsh script passes COMP_LINE="$BUFFER", which is zsh's whole edit buffer, and CompletionState.fromEnvironment reads the arguments from COMP_LINE. So everything typed before the current command is treated as CLI arguments.

Steps To Reproduce

Take a CLI my_cli built on CompletionCommandRunner, with commands foo and bar that have different options, and install its completion in zsh with my_cli install-completion-files.

  1. my_cli foo | my_cli bar <TAB> suggests foo's options. The request is parsed as foo | my_cli bar '', so foo is taken as the command being completed.
  2. cd somewhere && my_cli bar <TAB> suggests nothing, so zsh falls back to file names.

Without a shell, this is the request zsh sends for step 1:

ZSH_NAME=zsh COMP_LINE='my_cli foo | my_cli bar ' COMP_POINT=24 COMP_CWORD=2 \
  my_cli completion -- my_cli bar ''

It prints foo's options.

Expected Behavior

A command after |, && or ; completes the same way as at the start of the line. Both my_cli foo | my_cli bar <TAB> and cd somewhere && my_cli bar <TAB> suggest bar's options, just like my_cli bar <TAB>. Bash already behaves this way.

Additional Context

Cause

  • The zsh template in lib/src/installer/shell_completion_configuration.dart runs COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" … completion -- "${words[@]}". $BUFFER is the whole edit buffer, while $words and $CURRENT cover only the current command.
  • CompletionState.fromEnvironment takes the arguments from COMP_LINE (line.trimLeft().split(' ').skip(1)) and ignores the words passed after completion --.
  • Bash isn't affected, because bash itself limits COMP_LINE to the current command. With bash 3.2, echo x | mycmd a <TAB> sets COMP_LINE to mycmd a.

Suggested fix

Build the arguments from the words the scripts already pass after completion --, up to COMP_CWORD, instead of from COMP_LINE. Both scripts pass only the current command's words there, so this fixes zsh without changing the scripts or making users reinstall them.

Workaround

Until this is fixed, a CLI can narrow COMP_LINE itself before the request is handled, in its CompletionCommandRunner subclass:

@override
Future<int?> runCommand(ArgResults topLevelResults) {
  final command = topLevelResults.command;
  if (command?.name == HandleCompletionRequestCommand.commandName) {
    final words = command!.rest; // the words after `completion --`
    final environment = Platform.environment;
    final cword = int.tryParse(environment['COMP_CWORD'] ?? '');
    if (cword != null && cword >= 0 && cword < words.length) {
      final line = words.take(cword + 1).join(' ');
      environmentOverride = {...environment, 'COMP_LINE': line, 'COMP_POINT': '${line.length}'};
    }
  }
  return super.runCommand(topLevelResults);
}

Environment

  • cli_completion 0.6.0
  • Dart 3.13.3
  • zsh 5.9, macOS (arm64)
Ngôn ngữ chính
Dart
Star
54
Fork
6
Merge trung bình
24 phút
Pull request đã merge (30 ngày)
1

Chuẩn bị môi trường

  • Không có Dockerfile hay tệp Docker Compose
  • Có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của VeryGoodOpenSource/cli_completion

Tất cả issue của VeryGoodOpenSource/cli_completion

Issue tương tự

Thêm issue về Dart

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.