@@ -69,14 +69,17 @@ impl menu::Item for CompletionItem {
69/// Wraps a Menu.
69/// Wraps a Menu.
70pub struct Completion {
70pub struct Completion {
71 popup: Popup<Menu<CompletionItem>>,
71 popup: Popup<Menu<CompletionItem>>,
72 trigger_offset: usize,
73 trigger_offset: usize,
73 // TODO: maintain a completioncontext with trigger kind & trigger char
74 // TODO: maintain a completioncontext with trigger kind & trigger char
76impl Completion {
77impl Completion {
77 pub fn new(
78 pub fn new(
78 items: Vec<CompletionItem>,
80 items: Vec<CompletionItem>,
79 offset_encoding: helix_lsp::OffsetEncoding,
81 offset_encoding: helix_lsp::OffsetEncoding,
80 trigger_offset: usize,
83 trigger_offset: usize,
81 ) -> Self {
84 ) -> Self {
82 // let items: Vec<CompletionItem> = Vec::new();
85 // let items: Vec<CompletionItem> = Vec::new();
@@ -175,16 +178,22 @@ impl Completion {
177 let popup = Popup::new(menu);
180 let popup = Popup::new(menu);
178− Self {
181+ let mut completion = Self {
180 trigger_offset,
184 trigger_offset,
187+ // need to recompute immediately in case start_offset != trigger_offset
188+ completion.recompute_filter(editor);
184− pub fn update(&mut self, cx: &mut commands::Context) {
193+ pub fn recompute_filter(&mut self, editor: &Editor) {
185 // recompute menu based on matches
194 // recompute menu based on matches
186 let menu = self.popup.contents_mut();
195 let menu = self.popup.contents_mut();
187− let (view, doc) = current!(cx.editor);
196+ let (view, doc) = current_ref!(editor);
189 // cx.hooks()
198 // cx.hooks()
190 // cx.add_hook(enum type, ||)
199 // cx.add_hook(enum type, ||)
@@ -200,14 +209,18 @@ impl Completion {
200 .selection(view.id)
209 .selection(view.id)
201 .primary()
210 .primary()
202 .cursor(doc.text().slice(..));
211 .cursor(doc.text().slice(..));
203− if self.trigger_offset <= cursor {
212+ if self.start_offset <= cursor {
204− let fragment = doc.text().slice(self.trigger_offset..cursor);
213+ let fragment = doc.text().slice(self.start_offset..cursor);
205 let text = Cow::from(fragment);
214 let text = Cow::from(fragment);
206 // TODO: logic is same as ui/picker
215 // TODO: logic is same as ui/picker
207 menu.score(&text);
216 menu.score(&text);
220+ pub fn update(&mut self, cx: &mut commands::Context) {
221+ self.recompute_filter(cx.editor)
211 pub fn is_empty(&self) -> bool {
224 pub fn is_empty(&self) -> bool {
212 self.popup.contents().is_empty()
225 self.popup.contents().is_empty()