summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugin')
-rw-r--r--plugin/vim-ai.vim37
1 files changed, 23 insertions, 14 deletions
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('<sfile>: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