فهرست منبع

create working file completion

Isaac 2 سال پیش
والد
کامیت
639e88262e
1فایلهای تغییر یافته به همراه40 افزوده شده و 16 حذف شده
  1. 40 16
      borgmatic/commands/completion.py

+ 40 - 16
borgmatic/commands/completion.py

@@ -76,11 +76,17 @@ def conditionally_emit_file_completion(action: Action):
     '''
     if not action.metavar:
         return ''
-    
+
     args = ' '.join(action.option_strings)
-    
-    return dedent(f'''
-    complete -c borgmatic -a {args} -Fr -n "__borgmatic_last_arg {args}"''')
+
+    return dedent(
+        f'''
+    complete -c borgmatic -a '{args}' -Fr -n "__borgmatic_last_arg {args}"'''
+    )
+
+
+def dedent_strip_as_tuple(string: str):
+    return (dedent(string).strip("\n"),)
 
 
 def fish_completion():
@@ -94,22 +100,40 @@ def fish_completion():
 
     # Avert your eyes.
     return '\n'.join(
-        (
-            'function __borgmatic_check_version',
-            '    set this_filename (status current-filename)',
-            '    set this_script (cat $this_filename 2> /dev/null)',
-            '    set installed_script (borgmatic --fish-completion 2> /dev/null)',
-            '    if [ "$this_script" != "$installed_script" ] && [ "$installed_script" != "" ]',
-            f'''        echo "{upgrade_message(
+        dedent_strip_as_tuple(
+            f'''
+            function __borgmatic_check_version
+                set this_filename (status current-filename)
+                set this_script (cat $this_filename 2> /dev/null)
+                set installed_script (borgmatic --fish-completion 2> /dev/null)
+                if [ "$this_script" != "$installed_script" ] && [ "$installed_script" != "" ]
+                    echo "{upgrade_message(
                     'fish',
                     'borgmatic --fish-completion | sudo tee $this_filename',
                     '$this_filename',
-                )}"''',
-            '    end',
-            'end',
-            '__borgmatic_check_version &',
+                )}"
+                end
+            end
+            __borgmatic_check_version &
+
+            function __borgmatic_last_arg --description 'Check if any of the given arguments are the last on the command line'
+                set -l all_args (commandline -poc)
+                # premature optimization to avoid iterating all args if there aren't enough
+                # to have a last arg beyond borgmatic
+                if [ (count $all_args) -lt 2 ]
+                    return 1
+                end
+                for arg in $argv
+                    if [ "$arg" = "$all_args[-1]" ]
+                        return 0
+                    end
+                end
+                return 1
+            end
+
+            set --local subparser_condition "not __fish_seen_subcommand_from {all_subparsers}"
+            '''
         )
-        + (f'''set --local subparser_condition "not __fish_seen_subcommand_from {all_subparsers}"''',)
         + ('\n# subparser completions',)
         + tuple(
             f'''complete -c borgmatic -f -n "$subparser_condition" -a '{action_name}' -d {shlex.quote(subparser.description)}'''