Este complemento agrega capacidades de inteligencia artificial (IA) a su VIM y Neovim. Puede generar código, editar texto o tener una conversación interactiva con los modelos GPT, todo impulsado por la API de OpenAI.
Para tener una idea de lo que es posible ver con los comandos de IA, vea las indicaciones sobre la wiki de la comunidad
Este complemento utiliza la API de OpenAI para generar respuestas. Deberá configurar una cuenta y obtener una clave API. El uso de la API no es gratuito, pero el costo es razonable y depende de cuántos tokens use, en términos simples, cuánto texto envía y recibe (ver precios). Tenga en cuenta que el complemento no envía ninguno de su código detrás de escena. Solo comparte y paga por lo que selecciona específicamente, por las indicaciones y el contenido de chat.
# save api key to `~/.config/openai.token` file
echo " YOUR_OPENAI_API_KEY " > ~ /.config/openai.token
# alternatively set it as an environment variable
export OPENAI_API_KEY= " YOUR_OPENAI_API_KEY "
# or configure it with your organization id
echo " YOUR_OPENAI_API_KEY,YOUR_OPENAI_ORG_ID " > ~ /.config/openai.token
export OPENAI_API_KEY= " YOUR_OPENAI_API_KEY,YOUR_OPENAI_ORG_ID "
La ubicación de archivo de clave API predeterminada es ~/.config/openai.token
, pero puede cambiarla configurando el g:vim_ai_token_file_path
en su archivo .vimrc
:
let g: vim_ai_token_file_path = ' ~/.config/openai.token '
vim-plug
Plug ' madox2/vim-ai '
Uso de paquetes VIM incorporados :help packages
# vim
mkdir -p ~ /.vim/pack/plugins/start
git clone https://github.com/madox2/vim-ai.git ~ /.vim/pack/plugins/start/vim-ai
# neovim
mkdir -p ~ /.local/share/nvim/site/pack/plugins/start
git clone https://github.com/madox2/vim-ai.git ~ /.local/share/nvim/site/pack/plugins/start/vim-ai
Para usar un comando AI, escriba el comando seguido de un mensaje de instrucción. También puede combinarlo con una selección visual. Aquí hay una breve descripción general de los comandos disponibles:
========= Basic AI commands =========
:AI complete text
:AIEdit edit text
:AIChat continue or open new chat
============= Utilities =============
:AIRedo repeat last AI command
:AINewChat open new chat
:help vim-ai
Consejo: presione Ctrl-c
en cualquier momento para cancelar la finalización
Consejo: Configure sus propios enlaces de clave o use los atajos de comando - :AIE
, :AIC
, :AIR
Consejo: un rol personalizado {rol} se puede pasar a los comandos anteriores mediante un parámetro inicial /{rol}, por ejemplo :AIEdit /grammar
.
Consejo: Combine los comandos con un rango :help range
, por ejemplo, para seleccionar todo el búfer - :%AIE fix grammar
Si está interesado en más consejos o desea subir de nivel su VIM con más comandos como :GitCommitMessage
: sugerir un mensaje de confirmación GIT, visite el wiki de la comunidad.
En la documentación a continuación, <selection>
denota una selección visual o cualquier otro rango, {instruction}
un mensaje de instrucción, {role}
un papel personalizado y ?
Simbolo un parámetro opcional.
:AI
:AI
- complete el texto en la línea actual
:AI {prompt}
- complete el aviso
<selection> :AI
- Completa la selección
<selection> :AI {instruction}
: complete la selección usando la instrucción
<selection>? :AI /{role} {instruction}?
- Use el rol para completar
:AIEdit
<selection>? :AIEdit
: edite la línea actual o la selección
<selection>? :AIEdit {instruction}
: edite la línea actual o la selección utilizando la instrucción
<selection>? :AIEdit /{role} {instruction}?
- Use rol para editar
:AIChat
:AIChat
: continúa o comienza una nueva conversación.
<selection>? :AIChat {instruction}?
- Comience una nueva conversación dada la selección, la instrucción o ambos
<selection>? :AIChat /{role} {instruction}?
- Use el rol para completar
Cuando la IA termina de responder, puede continuar la conversación ingresando el modo de inserción, agregando su solicitud y luego usando el comando :AIChat
una vez más.
.aichat
Puede editar y guardar la conversación de chat en un archivo .aichat
y restaurarlo más tarde. Esto le permite crear indicaciones personalizadas reutilizables, por ejemplo:
# ./refactoring-prompt.aichat
>>> system
You are a Clean Code expert, I have the following code, please refactor it in a more clean and concise way so that my colleagues can maintain the code more easily. Also, explain why you want to refactor the code so that I can add the explanation to the Pull Request.
>>> user
[attach code]
Para incluir archivos en el chat se utiliza un rol include
especial:
>>> user
Generate documentation for the following files
>>> include
/home/user/myproject/requirements.txt
/home/user/myproject/**/*.py
El contenido de cada archivo se agregará a un mensaje de rol user
adicional con los archivos separados por ==> {path} <==
, donde la ruta es la ruta al archivo. Globbing se expande a través de glob.gob
y rutas relativas al directorio de trabajo actual (según lo determinado por getcwd()
) se resolverán a rutas absolutas.
Los roles de chat compatibles son >>> system
, >>> user
, >>> include
y <<< assistant
:AINewChat
:AINewChat {preset shortname}?
- Comience una nueva conversación
Este comando se usa cuando necesita generar un nuevo chat de una manera específica o en una situación cuando :AIChat
normalmente continuaría conversando en su lugar.
Como parámetro, coloca un atajo preset de comando de chat abierto: below
, tab
o right
. Por ejemplo :: :AINewChat right
.
:AIRedo
:AIRedo
- Repita el último comando AI
Use esto inmediatamente después del comando AI
/ AIEdit
/ AIChat
para volver a compensar o obtener una finalización alternativa. Tenga en cuenta que la aleatoriedad de las respuestas depende en gran medida del parámetro temperature
.
En el contexto de este complemento, un rol significa una instrucción y/o configuración reutilizables de IA. Los roles se definen en el archivo .ini
de configuración. Por ejemplo, definiendo un papel grammar
:
let g: vim_ai_roles_config_file = ' /path/to/my/roles.ini '
# /path/to/my/roles.ini
[grammar]
prompt = fix spelling and grammar
[grammar.options]
temperature = 0.4
Ahora puede seleccionar texto y ejecutarlo con el comando :AIEdit /grammar
.
Vea roles-example.ini para más ejemplos.
Este complemento no establece ningún enlace de clave. Cree sus propios enlaces en el .vimrc
para activar los comandos AI, por ejemplo:
" complete text on the current line or in visual selection
nnoremap <leader> a :AI <CR>
xnoremap <leader> a :AI <CR>
" edit text with a custom prompt
xnoremap <leader> s :AIEdit fix grammar and spelling <CR>
nnoremap <leader> s :AIEdit fix grammar and spelling <CR>
" trigger chat
xnoremap <leader> c :AIChat <CR>
nnoremap <leader> c :AIChat <CR>
" redo last AI command
nnoremap <leader> r :AIRedo <CR>
Cada comando está configurado con una variable de configuración correspondiente. Para personalizar la configuración predeterminada, inicialice la variable de configuración con una selección de opciones, por ejemplo, coloque esto en su archivo .vimrc
:
let g: vim_ai_chat = {
" options " : {
" model " : " gpt-4 " ,
" temperature " : 0.2 ,
},
}
Una vez que se establece lo anterior, puede modificar las opciones directamente durante la sesión VIM:
let g: vim_ai_chat [ ' options ' ][ ' model ' ] = ' gpt-4 '
let g: vim_ai_chat [ ' options ' ][ ' temperature ' ] = 0.2
O personalice las opciones directamente en el búfer de chat:
[chat-options]
model =gpt-4
temperature =0.2
>>> user
generate a paragraph of lorem ipsum
A continuación se enumeran todas las opciones de configuración disponibles, junto con sus valores predeterminados. Tenga en cuenta que no hay ningún límite de token impuesto en el modelo de chat.
" :AI
" - engine: complete | chat - see how to configure chat engine in the section below
" - options: openai config (see https://platform.openai.com/docs/api-reference/completions)
" - options.request_timeout: request timeout in seconds
" - options.enable_auth: enable authorization using openai key
" - options.selection_boundary: selection prompt wrapper (eliminates empty responses, see #20)
" - ui.paste_mode: use paste mode (see more info in the Notes below)
let g: vim_ai_complete = {
" engine " : " complete " ,
" options " : {
" model " : " gpt-3.5-turbo-instruct " ,
" endpoint_url " : " https://api.openai.com/v1/completions " ,
" max_tokens " : 1000 ,
" temperature " : 0.1 ,
" request_timeout " : 20 ,
" enable_auth " : 1 ,
" selection_boundary " : " ##### " ,
},
" ui " : {
" paste_mode " : 1 ,
},
}
" :AIEdit
" - engine: complete | chat - see how to configure chat engine in the section below
" - options: openai config (see https://platform.openai.com/docs/api-reference/completions)
" - options.request_timeout: request timeout in seconds
" - options.enable_auth: enable authorization using openai key
" - options.selection_boundary: selection prompt wrapper (eliminates empty responses, see #20)
" - ui.paste_mode: use paste mode (see more info in the Notes below)
let g: vim_ai_edit = {
" engine " : " complete " ,
" options " : {
" model " : " gpt-3.5-turbo-instruct " ,
" endpoint_url " : " https://api.openai.com/v1/completions " ,
" max_tokens " : 1000 ,
" temperature " : 0.1 ,
" request_timeout " : 20 ,
" enable_auth " : 1 ,
" selection_boundary " : " ##### " ,
},
" ui " : {
" paste_mode " : 1 ,
},
}
" This prompt instructs model to work with syntax highlighting
let s: initial_chat_prompt = << trim END
>>> system
You are a general assistant.
If you attach a code block add syntax type after ``` to enable syntax highlighting.
END
" :AIChat
" - options: openai config (see https://platform.openai.com/docs/api-reference/chat)
" - options.initial_prompt: prompt prepended to every chat request (list of lines or string)
" - options.request_timeout: request timeout in seconds
" - options.enable_auth: enable authorization using openai key
" - options.selection_boundary: selection prompt wrapper (eliminates empty responses, see #20)
" - ui.populate_options: put [chat-options] to the chat header
" - ui.open_chat_command: preset (preset_below, preset_tab, preset_right) or a custom command
" - ui.scratch_buffer_keep_open: re-use scratch buffer within the vim session
" - ui.paste_mode: use paste mode (see more info in the Notes below)
let g: vim_ai_chat = {
" options " : {
" model " : " gpt-4o " ,
" endpoint_url " : " https://api.openai.com/v1/chat/completions " ,
" max_tokens " : 0 ,
" temperature " : 1 ,
" request_timeout " : 20 ,
" enable_auth " : 1 ,
" selection_boundary " : " " ,
" initial_prompt " : s: initial_chat_prompt ,
},
" ui " : {
" code_syntax_enabled " : 1 ,
" populate_options " : 0 ,
" open_chat_command " : " preset_below " ,
" scratch_buffer_keep_open " : 0 ,
" paste_mode " : 1 ,
},
}
" Notes:
" ui.paste_mode
" - if disabled code indentation will work but AI doesn't always respond with a code block
" therefore it could be messed up
" - find out more in vim's help `:help paste`
" options.max_tokens
" - note that prompt + max_tokens must be less than model's token limit, see #42, #46
" - setting max tokens to 0 will exclude it from the OpenAI API request parameters, it is
" unclear/undocumented what it exactly does, but it seems to resolve issues when the model
" hits token limit, which respond with `OpenAI: HTTPError 400`
Es posible configurar el complemento para usar diferentes puntos finales compatibles con Openai. Consulte algunos proyectos geniales enumerados en la sección API personalizada sobre la wiki de la comunidad.
let g: vim_ai_chat = {
" options " : {
" endpoint_url " : " http://localhost:8000/v1/chat/completions " ,
" enable_auth " : 0 ,
},
}
Es posible configurar modelos de chat, como gpt-4o
, para ser utilizados en :AI
y :AIEdit
. Estos modelos son más baratos, pero actualmente son menos adecuados para la edición/finalización de código, ya que responden con texto y comentarios similares a los humanos.
Dependiendo del caso de uso, un buen mensaje inicial puede ayudar a instruir al modelo de chat que responda de la manera deseada:
let initial_prompt = << trim END
>>> system
You are going to play a role of a completion engine with following parameter s:
Task: Provide compact code/text completion, generation, transformation or explanation
Topic: general programming and text editing
Style: Plain result without any commentary, unless commentary is necessary
Audience: Users of text editor and programmers that need to transform/generate text
END
let chat_engine_config = {
" engine " : " chat " ,
" options " : {
" model " : " gpt-4o " ,
" endpoint_url " : " https://api.openai.com/v1/chat/completions " ,
" max_tokens " : 0 ,
" temperature " : 0.1 ,
" request_timeout " : 20 ,
" selection_boundary " : " " ,
" initial_prompt " : initial_prompt,
},
}
let g: vim_ai_complete = chat_engine_config
let g: vim_ai_edit = chat_engine_config
Es posible que encuentre útil una colección de comandos personalizados en la wiki de la comunidad.
Para crear un comando personalizado, puede llamar a las funciones AIRun
, AIEditRun
y AIChatRun
. Por ejemplo:
" custom command suggesting git commit message, takes no arguments
function ! GitCommitMessageFn ()
let l: diff = system ( ' git --no-pager diff --staged ' )
let l: prompt = " generate a short commit message from the diff below: n " . l: diff
let l: config = {
" engine " : " chat " ,
" options " : {
" model " : " gpt-4o " ,
" initial_prompt " : " >>> system n you are a code assistant " ,
" temperature " : 1 ,
},
}
call vim_ai#AIRun ( l: config , l: prompt )
endfunction
command ! GitCommitMessage call GitCommitMessageFn ()
" custom command that provides a code review for selected code block
function ! CodeReviewFn ( range ) range
let l: prompt = " programming syntax is " . & filetype . " , review the code below "
let l: config = {
" options " : {
" initial_prompt " : " >>> system n you are a clean code expert " ,
},
}
exe a: firstline . " , " . a: lastline . " call vim_ai#AIChatRun(a:range, l:config, l:prompt) "
endfunction
command ! - range = 0 CodeReview <line1> , <line2> call CodeReviewFn ( <count> )
¡Las contribuciones son bienvenidas! No dude en abrir una solicitud de extracción, informar un problema o contribuir a la wiki de la comunidad.
Precisión : GPT es bueno para producir texto y código que se ve correcto a primera vista, pero puede estar completamente equivocado. ¡Asegúrese de revisar, leer y probar todos los resultados generados por este complemento!
Privacidad : este complemento envía texto a OpenAI al generar finalizaciones y ediciones. Por lo tanto, no lo use en archivos que contienen información confidencial.
Licencia de MIT