1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
call vim_ai_config#load()
let s:plugin_root = expand('<sfile>: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 = ""
" Configures ai-chat scratch window.
" - scratch_buffer_keep_open = 0
" - opens new ai-chat every time
" - scratch_buffer_keep_open = 1
" - opens last ai-chat buffer
" - keeps the buffer in the buffer list
function! vim_ai#MakeScratchWindow()
let l:keep_open = g:vim_ai_chat['ui']['scratch_buffer_keep_open']
if l:keep_open && bufexists("[AI chat]")
" reuse chat buffer
buffer \[AI chat\]
return
endif
setlocal buftype=nofile
setlocal noswapfile
setlocal ft=aichat
if l:keep_open
setlocal bufhidden=hide
else
setlocal bufhidden=wipe
endif
if bufexists("[AI chat]")
" spawn another window if chat already exist
let l:index = 2
while bufexists("[AI chat " . l:index . "]")
let l:index += 1
endwhile
execute "file [AI chat ". l:index . "]"
else
file [AI chat]
endif
endfunction
function! s:MakePrompt(is_selection, lines, instruction)
let l:lines = trim(join(a:lines, "\n"))
let l:instruction = trim(a:instruction)
let l:delimiter = l:instruction != "" && a:is_selection ? ":\n" : ""
let l:selection = a:is_selection || l:instruction == "" ? l:lines : ""
return join([l:instruction, l:delimiter, l:selection], "")
endfunction
function! vim_ai#AIRun(is_selection, ...) range
let l:instruction = a:0 ? a:1 : ""
let l:lines = getline(a:firstline, a:lastline)
let l:prompt = s:MakePrompt(a:is_selection, l:lines, l:instruction)
let s:last_command = "complete"
let s:last_instruction = l:instruction
let s:last_is_selection = a:is_selection
let l:engine = g:vim_ai_complete['engine']
let l:options = g:vim_ai_complete['options']
let l:cursor_on_empty_line = trim(join(l:lines, "\n")) == ""
set paste
if l:cursor_on_empty_line
execute "normal! " . a:lastline . "GA"
else
execute "normal! " . a:lastline . "Go"
endif
execute "py3file " . s:complete_py
execute "normal! " . a:lastline . "G"
set nopaste
endfunction
function! vim_ai#AIEditRun(is_selection, ...) range
let l:instruction = a:0 ? a:1 : ""
let l:prompt = s:MakePrompt(a:is_selection, getline(a:firstline, a:lastline), l:instruction)
let s:last_command = "edit"
let s:last_instruction = l:instruction
let s:last_is_selection = a:is_selection
let l:engine = g:vim_ai_edit['engine']
let l:options = g:vim_ai_edit['options']
set paste
execute "normal! " . a:firstline . "GV" . a:lastline . "Gc"
execute "py3file " . s:complete_py
set nopaste
endfunction
function! vim_ai#AIChatRun(is_selection, ...) range
let l:instruction = ""
let l:lines = getline(a:firstline, a:lastline)
set paste
let l:is_outside_of_chat_window = search('^>>> user$', 'nw') == 0
if l:is_outside_of_chat_window
" open chat window
execute g:vim_ai_chat['ui']['open_chat_command']
let l:prompt = ""
if a:0 || a:is_selection
let l:instruction = a:0 ? a:1 : ""
let l:prompt = s:MakePrompt(a:is_selection, l:lines, l:instruction)
endif
execute "normal! Gi" . l:prompt
endif
let s:last_command = "chat"
let s:last_instruction = l:instruction
let s:last_is_selection = a:is_selection
let l:options = g:vim_ai_chat['options']
let l:ui = g:vim_ai_chat['ui']
execute "py3file " . s:chat_py
set nopaste
endfunction
function! vim_ai#AIRedoRun()
execute "normal! u"
if s:last_command == "complete"
if s:last_is_selection
'<,'>call vim_ai#AIRun(s:last_is_selection, s:last_instruction)
else
call vim_ai#AIRun(s:last_is_selection, s:last_instruction)
endif
endif
if s:last_command == "edit"
if s:last_is_selection
'<,'>call vim_ai#AIEditRun(s:last_is_selection, s:last_instruction)
else
call vim_ai#AIEditRun(s:last_is_selection, s:last_instruction)
endif
endif
if s:last_command == "chat"
call vim_ai#AIChatRun(s:last_is_selection, s:last_instruction)
endif
endfunction
|