aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/ui/completion.rs26
1 files changed, 16 insertions, 10 deletions
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs
index 3d354bda..ac434894 100644
--- a/helix-term/src/ui/completion.rs
+++ b/helix-term/src/ui/completion.rs
@@ -453,19 +453,25 @@ impl Component for Completion {
}
Rect::new(x, y, doc_width, doc_height)
} else {
- let half = area.height / 2;
- let doc_height = 15.min(half);
- // we want to make sure the cursor is visible (not hidden behind the documentation)
- let y = if cursor_pos + area.y
- >= (cx.editor.tree.area().height - doc_height - 2/* statusline + commandline */)
- {
- 0
+ // Documentation should not cover the cursor or the completion popup
+ // Completion popup could be above or below the current line
+ let avail_height_above = cursor_pos.min(popup_area.top()).saturating_sub(1);
+ let avail_height_below = area
+ .height
+ .saturating_sub(cursor_pos.max(popup_area.bottom()) + 1 /* padding */);
+ let (y, avail_height) = if avail_height_below >= avail_height_above {
+ (
+ area.height.saturating_sub(avail_height_below),
+ avail_height_below,
+ )
} else {
- // -2 to subtract command line + statusline. a bit of a hack, because of splits.
- area.height.saturating_sub(doc_height).saturating_sub(2)
+ (0, avail_height_above)
};
+ if avail_height <= 1 {
+ return;
+ }
- Rect::new(0, y, area.width, doc_height)
+ Rect::new(0, y, area.width, avail_height.min(15))
};
// clear area