From d6d73d8714bdf93b23a92568ef8a22cf3c0876e1 Mon Sep 17 00:00:00 2001 From: Konfekt Date: Sun, 10 Mar 2024 22:43:46 +0100 Subject: detect chat window in other tabs as well diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim: - - let l:chat_win_ids = win_findbuf(bufnr(s:scratch_buffer_name)) - if !empty(l:chat_win_ids) - " TODO: look for first active chat buffer. If .aichat file is used, - " then reuse chat in active window - call win_gotoid(l:chat_win_ids[0]) + let l:chat_win_id = bufwinid(s:scratch_buffer_name) + if l:chat_win_id != -1 + " TODO: look for first active chat buffer, in case .aichat file is used + " reuse chat in active window + call win_gotoid(l:chat_win_id) --- autoload/vim_ai.vim | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim index 74515d4..a9bac80 100644 --- a/autoload/vim_ai.vim +++ b/autoload/vim_ai.vim @@ -203,12 +203,13 @@ function! vim_ai#AIChatRun(uses_range, config, ...) range let l:selection = '' endif call s:set_paste(l:config) + if &filetype != 'aichat' - let l:chat_win_id = bufwinid(s:scratch_buffer_name) - if l:chat_win_id != -1 - " TODO: look for first active chat buffer, in case .aichat file is used - " reuse chat in active window - call win_gotoid(l:chat_win_id) + let l:chat_win_ids = win_findbuf(bufnr(s:scratch_buffer_name)) + if !empty(l:chat_win_ids) + " TODO: look for first active chat buffer. If .aichat file is used, + " then reuse chat in active window + call win_gotoid(l:chat_win_ids[0]) else " open new chat window let l:open_conf = l:config['ui']['open_chat_command'] -- cgit v1.2.3 From 1bbfb606b96ae2d7e3c4a89ef08b928a9dae6c51 Mon Sep 17 00:00:00 2001 From: Konfekt Date: Mon, 11 Mar 2024 14:50:43 +0100 Subject: Implement smarter AI chat window detection to reuse existing AI chat windows. First search for AI chat windows within the same tab and then within other tabs if none are found in the current tab. It now prioritizes the reusing of an existing chat window that matches the '.aichat' filetype before considering opening a new one. If there are no existing AI chat windows, the plugin will open a new chat window as a last resort. diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim: - " reuse chat in active window or tab + " TODO: look for first active chat buffer. If .aichat file is used, + " then reuse chat in active window - " 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"') - - 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_tab) > 0 - call win_gotoid(win_findbuf(buffer_list_tab[0])[0]) - elseif 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 + " open new chat window + let l:open_conf = l:config['ui']['open_chat_command'] + call s:OpenChatWindow(l:open_conf) --- autoload/vim_ai.vim | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim index a9bac80..3be3caf 100644 --- a/autoload/vim_ai.vim +++ b/autoload/vim_ai.vim @@ -207,13 +207,30 @@ function! vim_ai#AIChatRun(uses_range, config, ...) range if &filetype != 'aichat' let l:chat_win_ids = win_findbuf(bufnr(s:scratch_buffer_name)) if !empty(l:chat_win_ids) - " TODO: look for first active chat buffer. If .aichat file is used, - " then reuse chat in active window + " reuse chat in active window or tab call win_gotoid(l:chat_win_ids[0]) else - " open new chat window - let l:open_conf = l:config['ui']['open_chat_command'] - call s:OpenChatWindow(l:open_conf) + " 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 -- cgit v1.2.3 From f19d69e5cd6129eab610470f1c6469f87c36a093 Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Sun, 24 Mar 2024 11:58:42 +0100 Subject: retab --- autoload/vim_ai.vim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/autoload/vim_ai.vim b/autoload/vim_ai.vim index 3be3caf..6baf484 100644 --- a/autoload/vim_ai.vim +++ b/autoload/vim_ai.vim @@ -211,16 +211,16 @@ function! vim_ai#AIChatRun(uses_range, config, ...) range 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 = 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 = [] + 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 -- cgit v1.2.3 From 6b9a0ef3771a4c873021e5cfa59a98be4030d0ee Mon Sep 17 00:00:00 2001 From: Martin Bielik Date: Sun, 24 Mar 2024 12:35:59 +0100 Subject: refactoring: extracted to helper function, using guards --- autoload/vim_ai.vim | 64 +++++++++++++++++++++++++++++------------------------ 1 file 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 -- cgit v1.2.3