on master help sign in
ensure correct trigger/start completion offset
9c558fcPascal Kuthe
helix-term/src/commands.rs+10−9
@@ -4210,16 +4210,23 @@ pub fn completion(cx: &mut Context) {
4210
4210
4211 let (view, doc) = current!(cx.editor);
4211 let (view, doc) = current!(cx.editor);
4212
4212
4213+ let savepoint = if let Some(CompleteAction::Selected { savepoint }) = &cx.editor.last_completion
4214+ {
4215+ savepoint.clone()
4216+ } else {
4217+ doc.savepoint(view)
4218+ };
4219+
4213 let language_server = match doc.language_server() {
4220 let language_server = match doc.language_server() {
4214 Some(language_server) => language_server,
4221 Some(language_server) => language_server,
4215 None => return,
4222 None => return,
4216 };
4223 };
4217
4224
4218 let offset_encoding = language_server.offset_encoding();
4225 let offset_encoding = language_server.offset_encoding();
4219− let text = doc.text().slice(..);
4226+ let text = savepoint.text.clone();
4220− let cursor = doc.selection(view.id).primary().cursor(text);
4227+ let cursor = savepoint.cursor();
4221
4228
4222− let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
4229+ let pos = pos_to_lsp_pos(&text, cursor, offset_encoding);
4223
4230
4224 let future = match language_server.completion(doc.identifier(), pos, None) {
4231 let future = match language_server.completion(doc.identifier(), pos, None) {
4225 Some(future) => future,
4232 Some(future) => future,
@@ -4254,12 +4261,6 @@ pub fn completion(cx: &mut Context) {
4254 iter.reverse();
4261 iter.reverse();
4255 let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count();
4262 let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count();
4256 let start_offset = cursor.saturating_sub(offset);
4263 let start_offset = cursor.saturating_sub(offset);
4257− let savepoint = if let Some(CompleteAction::Selected { savepoint }) = &cx.editor.last_completion
4258− {
4259− savepoint.clone()
4260− } else {
4261− doc.savepoint(view)
4262− };
4263
4264
4264 let trigger_doc = doc.id();
4265 let trigger_doc = doc.id();
4265 let trigger_view = view.id;
4266 let trigger_view = view.id;
helix-view/src/document.rs+14
@@ -114,6 +114,19 @@ pub struct SavePoint {
114 /// The view this savepoint is associated with
114 /// The view this savepoint is associated with
115 pub view: ViewId,
115 pub view: ViewId,
116 revert: Mutex<Transaction>,
116 revert: Mutex<Transaction>,
117+ pub text: Rope,
118+}
119+
120+impl SavePoint {
121+ pub fn cursor(&self) -> usize {
122+ // we always create transactions with selections
123+ self.revert
124+ .lock()
125+ .selection()
126+ .unwrap()
127+ .primary()
128+ .cursor(self.text.slice(..))
129+ }
117}
130}
118
131
119pub struct Document {
132pub struct Document {
@@ -1230,6 +1243,7 @@ impl Document {
1230 let savepoint = Arc::new(SavePoint {
1243 let savepoint = Arc::new(SavePoint {
1231 view: view.id,
1244 view: view.id,
1232 revert: Mutex::new(revert),
1245 revert: Mutex::new(revert),
1246+ text: self.text.clone(),
1233 });
1247 });
1234 self.savepoints.push(Arc::downgrade(&savepoint));
1248 self.savepoints.push(Arc::downgrade(&savepoint));
1235 savepoint
1249 savepoint