class Doing::Completion::ZshCompletions

Generate completions for zsh

Attributes

commands[RW]
global_options[RW]

Public Class Methods

new() click to toggle source
# File lib/doing/completion/zsh_completion.rb, line 92
def initialize
  data = Completion.get_help_sections
  @global_options = Completion.parse_options(data[:global_options])
  @commands = Completion.parse_commands(data[:commands])
  @bar = TTY::ProgressBar.new(" \033[0;0;33mGenerating Zsh completions: \033[0;35;40m[:bar] :status\033[0m", total: @commands.count + 1, bar_format: :square, hide_cursor: true, status: 'processing subcommands')
  width = TTY::Screen.columns - 45
  @bar.resize(width)
end

Public Instance Methods

generate_completions() click to toggle source
# File lib/doing/completion/zsh_completion.rb, line 101
def generate_completions
  @bar.start
  generate_helpers
end
generate_helpers() click to toggle source
# File lib/doing/completion/zsh_completion.rb, line 15
      def generate_helpers
        out=<<~EOFUNCTIONS
          compdef _doing doing

          function _doing() {
              local line state

              function _commands {
                  local -a commands

                  commands=(
                            #{generate_subcommand_completions.join("\n                  ")}
                  )
                  _describe 'command' commands
              }

              _arguments -C \
                      "1: :_commands" \
                      "*::arg:->args"



              case $line[1] in
                  #{generate_subcommand_option_completions(indent: '            ').join("\n            ")}
              esac

              _arguments -s $args
          }

        EOFUNCTIONS
        @bar.advance(status: '✅')
        @bar.finish
        out
      end
generate_subcommand_completions() click to toggle source
# File lib/doing/completion/zsh_completion.rb, line 50
def generate_subcommand_completions
  out = []
  @commands.each_with_index do |cmd, i|
    cmd[:commands].each do |c|
      out << "'#{c}:#{cmd[:description].gsub(/'/, '\\\'')}'"
    end
  end
  out
end
generate_subcommand_option_completions(indent: ' ') click to toggle source
# File lib/doing/completion/zsh_completion.rb, line 60
def generate_subcommand_option_completions(indent: '        ')

  out = []

  @commands.each_with_index do |cmd, i|
    @bar.advance(status: cmd[:commands].first)

    data = Completion.get_help_sections(cmd[:commands].first)
    option_arr = []

    if data[:command_options]
      Completion.parse_options(data[:command_options]).each do |option|
        next if option.nil?

        arg = option[:arg] ? ":#{option[:arg]}:" : ''

        option_arr << if option[:short]
                        %({'(--#{option[:long]})-#{option[:short]}','(-#{option[:short]})--#{option[:long]}'}"[#{option[:description].sanitize}]#{arg}")
                      else
                        %("--#{option[:long]}[#{option[:description].sanitize}]#{arg}")
                      end
      end
    end

    cmd[:commands].each do |c|
      out << "#{c}) \n#{indent}    args=( #{option_arr.join(' ')} )\n#{indent};;"
    end
  end

  out
end