From fcfe3f220d6b86208db1135db0b4d64568234119 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Tue, 28 Mar 2023 22:16:39 +0200 Subject: AIRedo command --- plugin/vim-ai.vim | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index 5105abd..c9f48e1 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -37,6 +37,11 @@ let s:plugin_root = expand(':p:h:h') let s:complete_py = s:plugin_root . "/py/complete.py" let s:chat_py = s:plugin_root . "/py/chat.py" +" remembers last command parameters to be used in AIRedoRun +let s:last_is_selection = 0 +let s:last_instruction = "" +let s:last_command = "" + function! ScratchWindow() below new setlocal buftype=nofile @@ -55,8 +60,14 @@ function! MakePrompt(is_selection, lines, instruction) endfunction function! AIRun(is_selection, ...) range + let instruction = a:0 ? a:1 : "" let lines = getline(a:firstline, a:lastline) - let prompt = MakePrompt(a:is_selection, lines, a:0 ? a:1 : "") + let prompt = MakePrompt(a:is_selection, lines, instruction) + + let s:last_command = "complete" + let s:last_instruction = instruction + let s:last_is_selection = a:is_selection + let options_default = g:vim_ai_complete_default['options'] let options = g:vim_ai_complete['options'] let cursor_on_empty_line = trim(join(lines, "\n")) == "" @@ -72,7 +83,13 @@ function! AIRun(is_selection, ...) range endfunction function! AIEditRun(is_selection, ...) range - let prompt = MakePrompt(a:is_selection, getline(a:firstline, a:lastline), a:0 ? a:1 : "") + let instruction = a:0 ? a:1 : "" + let prompt = MakePrompt(a:is_selection, getline(a:firstline, a:lastline), instruction) + + let s:last_command = "edit" + let s:last_instruction = instruction + let s:last_is_selection = a:is_selection + let options_default = g:vim_ai_edit_default['options'] let options = g:vim_ai_edit['options'] set paste @@ -82,6 +99,7 @@ function! AIEditRun(is_selection, ...) range endfunction function! AIChatRun(is_selection, ...) range + let instruction = "" let lines = getline(a:firstline, a:lastline) set paste let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 @@ -89,17 +107,36 @@ function! AIChatRun(is_selection, ...) range call ScratchWindow() let prompt = "" if a:0 || a:is_selection - let prompt = MakePrompt(a:is_selection, lines, a:0 ? a:1 : "") + let instruction = a:0 ? a:1 : "" + let prompt = MakePrompt(a:is_selection, lines, instruction) endif - execute "normal i>>> user\n\n" . prompt + execute "normal! i>>> user\n\n" . prompt endif + let s:last_command = "chat" + let s:last_instruction = instruction + let s:last_is_selection = a:is_selection + let options_default = g:vim_ai_chat_default['options'] let options = g:vim_ai_chat['options'] execute "py3file " . s:chat_py set nopaste endfunction +function! AIRedoRun() + execute "normal! u" + if s:last_command == "complete" + '<,'>call AIRun(s:last_is_selection, s:last_instruction) + endif + if s:last_command == "edit" + '<,'>call AIEditRun(s:last_is_selection, s:last_instruction) + endif + if s:last_command == "chat" + call AIChatRun(s:last_is_selection, s:last_instruction) + endif +endfunction + command! -range -nargs=? AI ,call AIRun(, ) command! -range -nargs=? AIEdit ,call AIEditRun(, ) command! -range -nargs=? AIChat ,call AIChatRun(, ) +command! AIRedo call AIRedoRun() -- cgit v1.2.3 From 2f8c9804878f3bdbea63ac78cee38a778158aa06 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Tue, 28 Mar 2023 22:54:33 +0200 Subject: fixed visual redo call --- plugin/vim-ai.vim | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index c9f48e1..501dc2c 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -126,10 +126,18 @@ endfunction function! AIRedoRun() execute "normal! u" if s:last_command == "complete" - '<,'>call AIRun(s:last_is_selection, s:last_instruction) + if s:last_is_selection + '<,'>call AIRun(s:last_is_selection, s:last_instruction) + else + call AIRun(s:last_is_selection, s:last_instruction) + endif endif if s:last_command == "edit" - '<,'>call AIEditRun(s:last_is_selection, s:last_instruction) + if s:last_is_selection + '<,'>call AIEditRun(s:last_is_selection, s:last_instruction) + else + call AIEditRun(s:last_is_selection, s:last_instruction) + endif endif if s:last_command == "chat" call AIChatRun(s:last_is_selection, s:last_instruction) -- cgit v1.2.3 From 779067beb18ddce9143a5fa9abf8608d921feeb4 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Sun, 2 Apr 2023 22:25:03 +0200 Subject: open chat command config --- plugin/vim-ai.vim | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index 501dc2c..c32fb2f 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -21,6 +21,9 @@ let g:vim_ai_chat_default = { \ "temperature": 1, \ "request_timeout": 20, \ }, +\ "ui": { +\ "open_chat_command": "below new | call vim_ai#MakeScratchWindow()" +\ }, \} if !exists('g:vim_ai_complete') let g:vim_ai_complete = {"options":{}} @@ -29,10 +32,9 @@ if !exists('g:vim_ai_edit') let g:vim_ai_edit = {"options":{}} endif if !exists('g:vim_ai_chat') - let g:vim_ai_chat = {"options":{}} + let g:vim_ai_chat = {"options":{}, "ui": {}} endif - let s:plugin_root = expand(':p:h:h') let s:complete_py = s:plugin_root . "/py/complete.py" let s:chat_py = s:plugin_root . "/py/chat.py" @@ -42,14 +44,6 @@ let s:last_is_selection = 0 let s:last_instruction = "" let s:last_command = "" -function! ScratchWindow() - below new - setlocal buftype=nofile - setlocal bufhidden=hide - setlocal noswapfile - setlocal ft=aichat -endfunction - function! MakePrompt(is_selection, lines, instruction) let lines = trim(join(a:lines, "\n")) let instruction = trim(a:instruction) @@ -104,7 +98,8 @@ function! AIChatRun(is_selection, ...) range set paste let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 if is_outside_of_chat_window - call ScratchWindow() + let ui_options = extend(copy(g:vim_ai_chat_default['ui']), g:vim_ai_chat['ui']) + execute ui_options['open_chat_command'] let prompt = "" if a:0 || a:is_selection let instruction = a:0 ? a:1 : "" -- cgit v1.2.3 From 3b04fa1b764129395f54ab1b1297a4ce45e4105e Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Sun, 2 Apr 2023 23:05:12 +0200 Subject: extending config programatically --- plugin/vim-ai.vim | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index c32fb2f..9232d47 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -25,15 +25,28 @@ let g:vim_ai_chat_default = { \ "open_chat_command": "below new | call vim_ai#MakeScratchWindow()" \ }, \} -if !exists('g:vim_ai_complete') - let g:vim_ai_complete = {"options":{}} -endif -if !exists('g:vim_ai_edit') - let g:vim_ai_edit = {"options":{}} -endif -if !exists('g:vim_ai_chat') - let g:vim_ai_chat = {"options":{}, "ui": {}} -endif + +function! s:ExtendDeep(defaults, override) abort + let l:result = a:defaults + for [l:key, l:value] in items(a:override) + if type(get(l:result, l:key)) is v:t_dict && type(l:value) is v:t_dict + call s:ExtendDeep(l:result[l:key], l:value) + else + let l:result[l:key] = l:value + endif + endfor + return l:result +endfun + +function! s:MakeConfig(config_name) abort + let l:defaults = copy(g:[a:config_name . "_default"]) + let l:override = exists("g:" . a:config_name) ? g:[a:config_name] : {} + let g:[a:config_name] = s:ExtendDeep(l:defaults, l:override) +endfun + +call s:MakeConfig("vim_ai_chat") +call s:MakeConfig("vim_ai_complete") +call s:MakeConfig("vim_ai_edit") let s:plugin_root = expand(':p:h:h') let s:complete_py = s:plugin_root . "/py/complete.py" @@ -62,7 +75,6 @@ function! AIRun(is_selection, ...) range let s:last_instruction = instruction let s:last_is_selection = a:is_selection - let options_default = g:vim_ai_complete_default['options'] let options = g:vim_ai_complete['options'] let cursor_on_empty_line = trim(join(lines, "\n")) == "" set paste @@ -84,7 +96,6 @@ function! AIEditRun(is_selection, ...) range let s:last_instruction = instruction let s:last_is_selection = a:is_selection - let options_default = g:vim_ai_edit_default['options'] let options = g:vim_ai_edit['options'] set paste execute "normal! " . a:firstline . "GV" . a:lastline . "Gc" @@ -98,8 +109,7 @@ function! AIChatRun(is_selection, ...) range set paste let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 if is_outside_of_chat_window - let ui_options = extend(copy(g:vim_ai_chat_default['ui']), g:vim_ai_chat['ui']) - execute ui_options['open_chat_command'] + execute g:vim_ai_chat['ui']['open_chat_command'] let prompt = "" if a:0 || a:is_selection let instruction = a:0 ? a:1 : "" @@ -112,7 +122,6 @@ function! AIChatRun(is_selection, ...) range let s:last_instruction = instruction let s:last_is_selection = a:is_selection - let options_default = g:vim_ai_chat_default['options'] let options = g:vim_ai_chat['options'] execute "py3file " . s:chat_py set nopaste -- cgit v1.2.3 From b209554bf26d4662d126aa664875fd91dc803f62 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Sun, 2 Apr 2023 23:18:36 +0200 Subject: restore chat support --- plugin/vim-ai.vim | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index 9232d47..6192f1d 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -109,13 +109,21 @@ function! AIChatRun(is_selection, ...) range set paste let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 if is_outside_of_chat_window + " open chat window execute g:vim_ai_chat['ui']['open_chat_command'] let prompt = "" if a:0 || a:is_selection let instruction = a:0 ? a:1 : "" let prompt = MakePrompt(a:is_selection, lines, instruction) endif - execute "normal! i>>> user\n\n" . prompt + let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 + if is_outside_of_chat_window + " write an user prompt + execute "normal! i>>> user\n\n" . prompt + else + " appending prompt into restored conversation + execute "normal! Gi" . prompt + endif endif let s:last_command = "chat" -- cgit v1.2.3 From 8b738e33887e9cf956aeb3db2fe28c7f5069a643 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Mon, 3 Apr 2023 20:14:48 +0200 Subject: handle roles in python --- plugin/vim-ai.vim | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'plugin') diff --git a/plugin/vim-ai.vim b/plugin/vim-ai.vim index 6192f1d..dba5998 100644 --- a/plugin/vim-ai.vim +++ b/plugin/vim-ai.vim @@ -116,14 +116,7 @@ function! AIChatRun(is_selection, ...) range let instruction = a:0 ? a:1 : "" let prompt = MakePrompt(a:is_selection, lines, instruction) endif - let is_outside_of_chat_window = search('^>>> user$', 'nw') == 0 - if is_outside_of_chat_window - " write an user prompt - execute "normal! i>>> user\n\n" . prompt - else - " appending prompt into restored conversation - execute "normal! Gi" . prompt - endif + execute "normal! Gi" . prompt endif let s:last_command = "chat" -- cgit v1.2.3