From 9fa0dee67051d8e5d334f7f607e6bab1d6a46d1a Mon Sep 17 00:00:00 2001 From: Leonardo Mora <66377812+LeonardoMor@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:12:07 -0600 Subject: [PATCH] feat: accept next word and next line completions. (#380) * feat: accept next word and next line completions. The process of inserting suggestions is always roughly the same, so abstracted that into the `s:CompletionInserter` function. With that, refactored `codeium#Accept` and introduced `codeium#AcceptNextWord` and `codeium#AcceptNextLine`. Fixes #27 * feat: add default bindings for the new functions * refactor(AcceptNextWord): handle when completionParts is undefined --- autoload/codeium.vim | 29 ++++++++++++++++++++++++++--- plugin/codeium.vim | 6 ++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/autoload/codeium.vim b/autoload/codeium.vim index 1cf51249..c2b8d82a 100644 --- a/autoload/codeium.vim +++ b/autoload/codeium.vim @@ -39,14 +39,14 @@ function! codeium#CompletionText() abort endtry endfunction -function! codeium#Accept() abort +function! s:CompletionInserter(current_completion, insert_text) abort let default = get(g:, 'codeium_tab_fallback', pumvisible() ? "\" : "\t") if mode() !~# '^[iR]' || !exists('b:_codeium_completions') return default endif - let current_completion = s:GetCurrentCompletionItem() + let current_completion = a:current_completion if current_completion is v:null return default endif @@ -58,7 +58,7 @@ function! codeium#Accept() abort let start_offset = get(range, 'startOffset', 0) let end_offset = get(range, 'endOffset', 0) - let text = current_completion.completion.text . suffix_text + let text = a:insert_text . suffix_text if empty(text) return default endif @@ -87,6 +87,29 @@ function! codeium#Accept() abort return delete_range . insert_text . cursor_text endfunction +function! codeium#Accept() abort + let current_completion = s:GetCurrentCompletionItem() + return s:CompletionInserter(current_completion, current_completion.completion.text) +endfunction + +function! codeium#AcceptNextWord() abort + let current_completion = s:GetCurrentCompletionItem() + let completion_parts = get(current_completion, 'completionParts', []) + if len(completion_parts) == 0 + return '' + endif + let prefix_text = get(completion_parts[0], 'prefix', '') + let completion_text = get(completion_parts[0], 'text', '') + let next_word = matchstr(completion_text, '\v^\W*\k*') + return s:CompletionInserter(current_completion, prefix_text . next_word) +endfunction + +function! codeium#AcceptNextLine() abort + let current_completion = s:GetCurrentCompletionItem() + let text = substitute(current_completion.completion.text, '\v\n.*$', '', '') + return s:CompletionInserter(current_completion, text) +endfunction + function! s:HandleCompletionsResult(out, err, status) abort if exists('b:_codeium_completions') let response_text = join(a:out, '') diff --git a/plugin/codeium.vim b/plugin/codeium.vim index 1e8c0716..3294f634 100644 --- a/plugin/codeium.vim +++ b/plugin/codeium.vim @@ -58,6 +58,12 @@ if !get(g:, 'codeium_disable_bindings') if empty(mapcheck('', 'i')) imap (codeium-complete) endif + if empty(mapcheck('', 'i')) + imap