Class: Doing::Completion::FishCompletions
- Defined in:
- lib/doing/completion/fish_completion.rb
Overview
Generate completions for Fish
Instance Attribute Summary collapse
-
#commands ⇒ Object
Returns the value of attribute commands.
-
#global_options ⇒ Object
Returns the value of attribute global_options.
Instance Method Summary collapse
- #generate_completions ⇒ Object
- #generate_helpers ⇒ Object
- #generate_subcommand_completions ⇒ Object
- #generate_subcommand_option_completions ⇒ Object
-
#initialize ⇒ FishCompletions
constructor
A new instance of FishCompletions.
Constructor Details
#initialize ⇒ FishCompletions
Returns a new instance of FishCompletions.
229 230 231 232 233 234 235 236 237 |
# File 'lib/doing/completion/fish_completion.rb', line 229 def initialize data = Completion.get_help_sections @global_options = Completion.(data[:global_options]) @commands = Completion.parse_commands(data[:commands]) @bar = TTY::ProgressBar.new("\033[0;0;33mGenerating Fish 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 |
Instance Attribute Details
#commands ⇒ Object
Returns the value of attribute commands.
7 8 9 |
# File 'lib/doing/completion/fish_completion.rb', line 7 def commands @commands end |
#global_options ⇒ Object
Returns the value of attribute global_options.
7 8 9 |
# File 'lib/doing/completion/fish_completion.rb', line 7 def @global_options end |
Instance Method Details
#generate_completions ⇒ Object
239 240 241 242 243 244 245 246 247 248 |
# File 'lib/doing/completion/fish_completion.rb', line 239 def generate_completions @bar.start out = [] out << generate_helpers out << generate_subcommand_completions out << generate_subcommand_option_completions @bar.advance(status: '✅') @bar.finish out.join("\n") end |
#generate_helpers ⇒ Object
9 10 11 12 13 14 15 16 17 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/doing/completion/fish_completion.rb', line 9 def generate_helpers <<~EOFUNCTIONS function __fish_doing_needs_command # Figure out if the current invocation already has a command. set -l opts color h-help config_file= f-doing_file= n-notes v-version stdout debug default x-noauto no p-pager q-quiet yes set cmd (commandline -opc) set -e cmd[1] argparse -s $opts -- $cmd 2>/dev/null or return 0 # These flags function as commands, effectively. if set -q argv[1] # Also print the command, so this can be used to figure out what it is. echo $argv[1] return 1 end return 0 end function __fish_doing_using_command set -l cmd (__fish_doing_needs_command) test -z "$cmd" and return 1 contains -- $cmd $argv and return 0 end function __fish_doing_cache_timer_expired set -l timer __fish_doing_cache_timer_$argv[1] if not set -q $timer set -g $timer (date '+%s') end if test (math (date '+%s') - $$timer) -gt $argv[2] set -g $timer (date '+%s') return 1 end return 0 end function __fish_doing_subcommands if not set -q __fish_doing_subcommands_cache or __fish_doing_cache_timer_expired subcommands 86400 set -g -a __fish_doing_subcommands_cache (doing help -c) end printf '%s\n' $__fish_doing_subcommands_cache end function __fish_doing_complete_sections if not set -q __fish_doing_sections_cache or __fish_doing_cache_timer_expired sections 3600 set -g -a __fish_doing_sections_cache (doing sections -c) end printf '%s\n' $__fish_doing_sections_cache __fish_doing_complete_show_tag end function __fish_doing_complete_views if not set -q __fish_doing_views_cache or __fish_doing_cache_timer_expired views 3600 set -g -a __fish_doing_views_cache (doing views -c) end printf '%s\n' $__fish_doing_views_cache end function __fish_doing_export_plugin if not set -q __fish_doing_export_plugin_cache or __fish_doing_cache_timer_expired export_plugins 3600 set -g -a __fish_doing_export_plugin_cache (doing plugins --type export -c) end printf '%s\n' $__fish_doing_export_plugin_cache end function __fish_doing_import_plugin if not set -q __fish_doing_import_plugin_cache or __fish_doing_cache_timer_expired import_plugins 3600 set -g -a __fish_doing_import_plugin_cache (doing plugins --type import -c) end printf '%s\n' $__fish_doing_import_plugin_cache end function __fish_doing_complete_template if not set -q __fish_doing_template_cache or __fish_doing_cache_timer_expired template 3600 set -g -a __fish_doing_template_cache (doing template -c) end printf '%s\n' $__fish_doing_template_cache end function __fish_doing_complete_tag if not set -q __fish_doing_tag_cache or __fish_doing_cache_timer_expired tags 60 set -g -a __fish_doing_tag_cache (doing tags) end printf '%s\n' $__fish_doing_tag_cache end function __fish_doing_complete_show_tag if not set -q __fish_doing_tag_cache or __fish_doing_cache_timer_expired tags 60 set -g -a __fish_doing_tag_cache (doing tags) end printf '@%s\n' $__fish_doing_tag_cache end function __fish_doing_complete_args for cmd in (doing commands_accepting -c $argv[1]) complete -x -c doing -l $argv[1] -n "__fish_doing_using_command $cmd" -a "(__fish_doing_complete_$argv[1])" end end complete -c doing -f complete -xc doing -n '__fish_doing_needs_command' -a '(__fish_doing_subcommands)' complete -f -c doing -n '__fish_doing_using_command show' -a '(__fish_doing_complete_sections)' complete -f -c doing -n '__fish_doing_using_command view' -a '(__fish_doing_complete_views)' complete -f -c doing -n '__fish_doing_using_command template' -a '(__fish_doing_complete_templates)' complete -f -c doing -s t -l type -x -n '__fish_doing_using_command import' -a '(__fish_doing_import_plugins)' complete -f -c doing -n '__fish_doing_using_command help' -a '(__fish_doing_subcommands)' # complete -xc doing -n '__fish_seen_subcommand_from help; and not __fish_seen_subcommand_from (doing help -c)' -a "(doing help -c)" function __fish_doing_complete_args for cmd in (doing commands_accepting -c $argv[1]) complete -x -c doing -l $argv[1] -n "__fish_doing_using_command $cmd" -a "(__fish_doing_complete_$argv[1])" end end __fish_doing_complete_args tag EOFUNCTIONS end |
#generate_subcommand_completions ⇒ Object
142 143 144 145 146 147 148 149 150 151 |
# File 'lib/doing/completion/fish_completion.rb', line 142 def generate_subcommand_completions out = [] @commands.each do |cmd| desc = Shellwords.escape(cmd[:description]) cmds = cmd[:commands].join(' ') out << "complete -xc doing -n '__fish_doing_needs_command' -a '#{cmds}' -d #{desc}" end out.join("\n") end |
#generate_subcommand_option_completions ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/doing/completion/fish_completion.rb', line 153 def generate_subcommand_option_completions out = [] need_export = [] need_bool = [] need_case = [] need_sort = [] need_tag_sort = [] need_tag_order = [] need_age = [] need_section = [] @commands.each_with_index do |cmd, _i| @bar.advance(status: cmd[:commands].first) data = Completion.get_help_sections(cmd[:commands].first) if data[:synopsis].join(' ').strip.split(/ /).last =~ /(path|file)/i out << "complete -c doing -F -n '__fish_doing_using_command #{cmd[:commands].join(' ')}'" end next unless data[:command_options] Completion.(data[:command_options]).each do |option| next if option.nil? arg = option[:arg] ? '-r' : '' short = option[:short] ? "-s #{option[:short]}" : '' long = option[:long] ? "-l #{option[:long]}" : '' out << "complete -c doing #{long} #{short} -f #{arg} -n '__fish_doing_using_command #{cmd[:commands].join(' ')}' -d #{Shellwords.escape(option[:description])}" need_export.concat(cmd[:commands]) if option[:long] == 'output' need_bool.concat(cmd[:commands]) if option[:long] == 'bool' need_case.concat(cmd[:commands]) if option[:long] == 'case' need_sort.concat(cmd[:commands]) if option[:long] == 'sort' need_tag_sort.concat(cmd[:commands]) if option[:long] == 'tag_sort' need_tag_order.concat(cmd[:commands]) if option[:long] == 'tag_order' need_age.concat(cmd[:commands]) if option[:long] == 'age' need_section.concat(cmd[:commands]) if option[:long] == 'section' end end unless need_export.empty? out << "complete -f -c doing -s o -l output -x -n '__fish_doing_using_command #{need_export.join(' ')}' -a '(__fish_doing_export_plugin)'" end unless need_bool.empty? out << "complete -f -c doing -s b -l bool -x -n '__fish_doing_using_command #{need_bool.join(' ')}' -a 'and or not pattern'" end unless need_case.empty? out << "complete -f -c doing -l case -x -n '__fish_doing_using_command #{need_case.join(' ')}' -a 'case-sensitive ignore smart'" end unless need_sort.empty? out << "complete -f -c doing -l sort -x -n '__fish_doing_using_command #{need_sort.join(' ')}' -a 'asc desc'" end unless need_tag_sort.empty? out << "complete -f -c doing -l tag_sort -x -n '__fish_doing_using_command #{need_tag_sort.join(' ')}' -a 'name time'" end unless need_tag_order.empty? out << "complete -f -c doing -l tag_order -x -n '__fish_doing_using_command #{need_tag_order.join(' ')}' -a 'asc desc'" end unless need_age.empty? out << "complete -f -c doing -s a -l age -x -n '__fish_doing_using_command #{need_age.join(' ')}' -a 'oldest newest'" end unless need_section.empty? out << "complete -f -c doing -s s -l section -x -n '__fish_doing_using_command #{need_section.join(' ')}' -a '(__fish_doing_complete_sections)'" end # clear out.join("\n") end |