Class: Rufio::CommandCompletion

Inherits:
Object
  • Object
show all
Defined in:
lib/rufio/command_completion.rb

Overview

コマンド補完機能を提供するクラス

Instance Method Summary collapse

Constructor Details

#initialize(history = nil, command_mode = nil) ⇒ CommandCompletion

初期化

Parameters:

  • history (CommandHistory, nil) (defaults to: nil)

    コマンド履歴(オプション)

  • command_mode (CommandMode, nil) (defaults to: nil)

    コマンドモード(スクリプト補完に使用)



9
10
11
12
13
# File 'lib/rufio/command_completion.rb', line 9

def initialize(history = nil, command_mode = nil)
  @command_mode = command_mode || CommandMode.new
  @shell_completion = ShellCommandCompletion.new
  @history = history
end

Instance Method Details

#common_prefix(input) ⇒ String

補完候補の共通プレフィックスを取得

Parameters:

  • input (String)

    入力されたテキスト

Returns:

  • (String)

    共通プレフィックス



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rufio/command_completion.rb', line 59

def common_prefix(input)
  candidates = complete(input)

  # 候補がない場合は元の入力を返す
  return input if candidates.empty?

  # 候補が1つの場合はそのコマンド名を返す
  return candidates.first if candidates.size == 1

  # 複数の候補がある場合、共通プレフィックスを計算
  min_candidate = candidates.min
  max_candidate = candidates.max

  min_candidate.chars.zip(max_candidate.chars).each_with_index do |(char_min, char_max), index|
    return min_candidate[0...index] if char_min != char_max
  end

  # すべての文字が一致した場合は最小の候補を返す
  min_candidate
end

#complete(input) ⇒ Array<String>

コマンドの補完候補を取得

Parameters:

  • input (String)

    入力されたテキスト

Returns:

  • (Array<String>)

    補完候補のリスト



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rufio/command_completion.rb', line 18

def complete(input)
  # 入力が空の場合は内部コマンド + スクリプト + rakeタスクを返す
  if input.nil? || input.strip.empty?
    return @command_mode.available_commands.map(&:to_s) +
           script_candidates('') +
           rake_candidates('')
  end

  # シェルコマンド補完(!で始まる場合)
  if input.strip.start_with?('!')
    return complete_shell_command(input.strip)
  end

  # スクリプト補完(@で始まる場合)
  if input.strip.start_with?('@')
    return @command_mode.complete_script(input.strip)
  end

  # rakeタスク補完(rake:で始まる場合)
  if input.strip.start_with?('rake:')
    prefix = input.strip[5..-1]
    return @command_mode.complete_rake_task(prefix)
  end

  # 通常のコマンド補完(内部コマンド + rakeタスク)
  available_commands = @command_mode.available_commands.map(&:to_s)
  input_lower = input.downcase
  candidates = available_commands.select do |command|
    command.downcase.start_with?(input_lower)
  end

  # rakeタスクも候補に追加("r", "ra", "rak", "rake" 等にマッチ)
  rake_tasks = rake_candidates('')
  candidates += rake_tasks.select { |task| task.downcase.start_with?(input_lower) }

  candidates
end