@@ -75,34 +75,47 @@ haskelineTabComplete ::
7575haskelineTabComplete patterns codebase authedHTTPClient ppCtx = \ (beforeCursorRev, _afterCursor) ->
7676 fmap (fromMaybe (beforeCursorRev, [] )) $ runMaybeT $ do
7777 args <- hoistMaybe $ IP. parseArgs (reverse beforeCursorRev)
78- (prefixArgs, lastArg) <- hoistMaybe $ unsnoc args
79- let prefix =
80- prefixArgs
81- <&> IP. renderCliArg
82- & unwords
83- & reverse
84- & (" " <> )
78+ let trailingSpace = take 1 beforeCursorRev == " "
79+ (prefixArgs, lastArg) <-
80+ (hoistMaybe $ unsnoc args)
81+ <&> \ (prefixArgs', lastArg') ->
82+ -- If there's a trailing space, we want to complete against an argument _after_ the last actual one.
83+ if trailingSpace
84+ then (prefixArgs' <> [lastArg'], UnquotedArg " " )
85+ else (prefixArgs', lastArg')
86+ let prefix
87+ | null prefixArgs = " "
88+ | otherwise =
89+ prefixArgs
90+ <&> IP. renderCliArg
91+ & unwords
92+ & reverse
93+ & (" " <> )
94+
95+ let finalize completion =
96+ let newReplacement = case lastArg of
97+ QuotedArg _ _
98+ | completion. isFinished -> " \" " <> completion. replacement <> " \" "
99+ QuotedArg _ False -> " \" " <> completion. replacement <> " \" "
100+ QuotedArg _ True -> " \" " <> completion. replacement
101+ UnquotedArg _ -> completion. replacement
102+ NumberedArg _ -> completion. replacement
103+ in completion {Line. replacement = newReplacement}
85104 case (prefixArgs, lastArg) of
86105 -- No completions for numbered args
87106 (_, NumberedArg {}) -> pure (beforeCursorRev, [] )
88107 ([] , cmdPrefix) -> do
89- let completions = exactComplete (IP. renderCliArgUnquoted cmdPrefix) $ Map. keys patterns
108+ let completions =
109+ (exactComplete (IP. renderCliArgUnquoted cmdPrefix) $ Map. keys patterns)
110+ <&> finalize
90111 pure (prefix, completions)
91112 ((cmd : midArgs), lastArg) -> do
92- let requote completion =
93- let newReplacement = case lastArg of
94- QuotedArg _ _
95- | completion. isFinished -> " \" " <> completion. replacement <> " \" "
96- QuotedArg _ False -> " \" " <> completion. replacement <> " \" "
97- QuotedArg _ True -> " \" " <> completion. replacement
98- UnquotedArg _ -> completion. replacement
99- in completion {Line. replacement = newReplacement}
100113 p <- hoistMaybe $ Map. lookup (IP. renderCliArgUnquoted cmd) patterns
101114 paramType <- hoistMaybe $ IP. paramType (IP. params p) (length midArgs)
102115 completions <-
103116 lift $
104117 IP. suggestions paramType (IP. renderCliArgUnquoted lastArg) codebase authedHTTPClient ppCtx
105- <&> fmap requote
118+ <&> fmap finalize
106119 pure (prefix, completions)
107120
108121-- | Things which we may want to complete for.
0 commit comments