Skip to content

Commit 1cb1120

Browse files
authored
Merge pull request #5975 from unisonweb/cp/completion-edge-cases
2 parents 7a04846 + 73da5df commit 1cb1120

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

unison-cli/src/Unison/CommandLine/Completion.hs

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -75,34 +75,47 @@ haskelineTabComplete ::
7575
haskelineTabComplete 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

Comments
 (0)