summaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
authorMartin Bielik <mx.bielik@gmail.com>2024-03-24 12:35:59 +0100
committerMartin Bielik <mx.bielik@gmail.com>2024-03-24 12:35:59 +0100
commit6b9a0ef3771a4c873021e5cfa59a98be4030d0ee (patch)
treeef85193e45ecf553e47f8ea0dda2a691a9c1393f /autoload
parentf19d69e5cd6129eab610470f1c6469f87c36a093 (diff)
downloadvim-ai-6b9a0ef3771a4c873021e5cfa59a98be4030d0ee.tar.gz
refactoring: extracted to helper function, using guards
Diffstat (limited to '')
-rw-r--r--autoload/vim_ai.vim64
1 files changed, 35 insertions, 29 deletions
diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim
index 6baf484..114c5ad 100644
--- a/autoload/vim_ai.vim
+++ b/autoload/vim_ai.vim
@@ -186,6 +186,40 @@ function! vim_ai#AIEditRun(config, ...) range
call s:set_nopaste(l:config)
endfunction
+function! s:ReuseOrCreateChatWindow(config)
+ if &filetype != 'aichat'
+ " reuse chat in active window or tab
+ let l:chat_win_ids = win_findbuf(bufnr(s:scratch_buffer_name))
+ if !empty(l:chat_win_ids)
+ call win_gotoid(l:chat_win_ids[0])
+ return
+ endif
+
+ " reuse .aichat file on the same tab
+ let buffer_list_tab = tabpagebuflist(tabpagenr())
+ let buffer_list_tab = filter(buffer_list_tab, 'getbufvar(v:val, "&filetype") ==# "aichat"')
+ if len(buffer_list_tab) > 0
+ call win_gotoid(win_findbuf(buffer_list_tab[0])[0])
+ return
+ endif
+
+ " reuse any .aichat buffer in the session
+ let buffer_list = []
+ for i in range(tabpagenr('$'))
+ call extend(buffer_list, tabpagebuflist(i + 1))
+ endfor
+ let buffer_list = filter(buffer_list, 'getbufvar(v:val, "&filetype") ==# "aichat"')
+ if len(buffer_list) > 0
+ call win_gotoid(win_findbuf(buffer_list[0])[0])
+ return
+ endif
+
+ " open new chat window if no active buffer found
+ let l:open_conf = a:config['ui']['open_chat_command']
+ call s:OpenChatWindow(l:open_conf)
+ endif
+endfunction
+
" Start and answer the chat
" - uses_range - true if range passed
" - config - function scoped vim_ai_chat config
@@ -204,35 +238,7 @@ function! vim_ai#AIChatRun(uses_range, config, ...) range
endif
call s:set_paste(l:config)
- if &filetype != 'aichat'
- let l:chat_win_ids = win_findbuf(bufnr(s:scratch_buffer_name))
- if !empty(l:chat_win_ids)
- " reuse chat in active window or tab
- call win_gotoid(l:chat_win_ids[0])
- else
- " allow .aichat files windows to be switched to, preferably on same tab
- let buffer_list_tab = tabpagebuflist(tabpagenr())
- let buffer_list_tab = filter(buffer_list_tab, 'getbufvar(v:val, "&filetype") ==# "aichat"')
-
- if len(buffer_list_tab) > 0
- call win_gotoid(win_findbuf(buffer_list_tab[0])[0])
- else
- let buffer_list = []
- for i in range(tabpagenr('$'))
- call extend(buffer_list, tabpagebuflist(i + 1))
- endfor
- let buffer_list = filter(buffer_list, 'getbufvar(v:val, "&filetype") ==# "aichat"')
-
- if len(buffer_list) > 0
- call win_gotoid(win_findbuf(buffer_list[0])[0])
- else
- " open new chat window
- let l:open_conf = l:config['ui']['open_chat_command']
- call s:OpenChatWindow(l:open_conf)
- endif
- endif
- endif
- endif
+ call s:ReuseOrCreateChatWindow(l:config)
let l:prompt = ""
if a:0 > 0 || a:uses_range