Этот плагин добавляет возможности искусственного интеллекта (ИИ) к вашему VIM и NEOVIM. Вы можете генерировать код, редактировать текст или вести интерактивный разговор с моделями GPT, причем все Powered By API Openai.
Чтобы получить представление о том, что возможно сделать с командами ИИ, увидите подсказки на сообществе вики
Этот плагин использует API OpenAI для генерации ответов. Вам нужно будет настроить учетную запись и получить ключ API. Использование API не является бесплатным, но стоимость разумна и зависит от того, сколько токенов вы используете, в простых терминах, сколько текста вы отправляете и получаете (см. Цены). Обратите внимание, что плагин не отправляет ваш код за кулисами. Вы делитесь только и платите за то, что вы специально выбираете, для подсказок и контента чата.
# 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 "
Расположение файла ключа API по умолчанию - ~/.config/openai.token
, но вы можете изменить его, установив g:vim_ai_token_file_path
в вашем файле .vimrc
:
let g: vim_ai_token_file_path = ' ~/.config/openai.token '
vim-plug
Plug ' madox2/vim-ai '
Использование встроенных пакетов VIM :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
Чтобы использовать команду AI, введите команду, за которой следует приглашение инструкции. Вы также можете объединить его с визуальным выбором. Вот краткий обзор доступных команд:
========= 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
Совет: нажмите Ctrl-c
в любое время, чтобы отменить завершение
СОВЕТ: Установите свои собственные привязки ключей или используйте сочетания команд - :AIE
, :AIC
, :AIR
Совет: пользовательская роль {роли} может быть передана в вышеуказанные команды с помощью начального параметра /{роли}, например :AIEdit /grammar
.
Совет: объедините команды с диапазоном :help range
, например, для выбора всего буфера - :%AIE fix grammar
Если вы заинтересованы в дополнительных советах или хотите выровнять свой VIM с помощью большего количества команд, таких как :GitCommitMessage
- предлагая сообщение GIT Commit, посетите сообщество Wiki.
В приведенной ниже документации <selection>
обозначает визуальный выбор или какой -либо другой диапазон, {instruction}
подсказка инструкции, {role}
пользовательская роль и ?
Символ дополнительный параметр.
:AI
:AI
- Заполните текст на текущей строке
:AI {prompt}
- завершить приглашение
<selection> :AI
- Завершите выбор
<selection> :AI {instruction}
- заполните выбор, используя инструкцию
<selection>? :AI /{role} {instruction}?
- Используйте роль для завершения
:AIEdit
<selection>? :AIEdit
- отредактировать текущую строку или выбор
<selection>? :AIEdit {instruction}
- редактировать текущую строку или выбор, используя инструкцию
<selection>? :AIEdit /{role} {instruction}?
- Используйте роль, чтобы редактировать
:AIChat
:AIChat
- продолжить или начать новый разговор.
<selection>? :AIChat {instruction}?
- начать новый разговор, учитывая выбор, инструкцию или оба
<selection>? :AIChat /{role} {instruction}?
- Используйте роль для завершения
Когда ИИ заканчивает ответ, вы можете продолжить разговор, введя режим вставки, добавив свою подсказку, а затем используя команду :AIChat
еще раз.
.aichat
файлы Вы можете редактировать и сохранить разговор в чате в файле .aichat
и восстановить его позже. Это позволяет создавать повторные пользовательские подсказки, например:
# ./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]
Чтобы включить файлы в чат, используется специальная роль: используется include
:
>>> user
Generate documentation for the following files
>>> include
/home/user/myproject/requirements.txt
/home/user/myproject/**/*.py
Содержание каждого файла будет добавлено в дополнительное сообщение о роле user
с файлами, разделенными ==> {path} <==
, где путь - это путь к файлу. Globing расширяется через glob.gob
, и относительные пути к текущему рабочим каталогу (как определено getcwd()
) будет разрешено до абсолютных путей.
Поддерживаемые роли чата - это >>> system
, >>> user
, >>> include
и <<< assistant
:AINewChat
:AINewChat {preset shortname}?
- Начните новый разговор
Эта команда используется, когда вам нужно создать новый чат определенным образом или в ситуации, когда :AIChat
обычно продолжит разговор.
В качестве параметра вы размещаете предварительный сочетание открытого чата - below
, tab
или right
. Например :: :AINewChat right
.
:AIRedo
:AIRedo
- Повторите последнюю команду AI
Используйте это сразу после команды AI
/ AIEdit
/ AIChat
, чтобы повторить или получить альтернативное завершение. Обратите внимание, что случайность ответов в значительной степени зависит от параметра temperature
.
В контексте этого плагина роль означает повторную инструкцию ИИ и/или конфигурацию. Роли определены в файле конфигурации .ini
. Например, определяя роль 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
Теперь вы можете выбрать текст и запустить его с помощью команды :AIEdit /grammar
.
См. Roles-Example.ini для получения дополнительных примеров.
Этот плагин не устанавливает привязки ключей. Создайте свои собственные привязки в .vimrc
для запуска команд AI, например:
" 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>
Каждая команда настроена с соответствующей переменной конфигурации. Чтобы настроить конфигурацию по умолчанию, инициализировать переменную конфигурации с помощью выбора параметров, например, поместите это в свой файл .vimrc
:
let g: vim_ai_chat = {
" options " : {
" model " : " gpt-4 " ,
" temperature " : 0.2 ,
},
}
После того, как вышее выше, вы можете изменить параметры непосредственно во время сеанса VIM:
let g: vim_ai_chat [ ' options ' ][ ' model ' ] = ' gpt-4 '
let g: vim_ai_chat [ ' options ' ][ ' temperature ' ] = 0.2
Или настроить параметры непосредственно в буфере чата:
[chat-options]
model =gpt-4
temperature =0.2
>>> user
generate a paragraph of lorem ipsum
Ниже перечислены все доступные параметры конфигурации, а также значения по умолчанию. Обратите внимание, что на модель чата нет ни одного ограничения токена.
" :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`
Можно настроить плагин для использования различных конечных точек OpenAI. См. Некоторые классные проекты, перечисленные в разделе «Пользовательские APIS» на сообществе Wiki.
let g: vim_ai_chat = {
" options " : {
" endpoint_url " : " http://localhost:8000/v1/chat/completions " ,
" enable_auth " : 0 ,
},
}
Можно настроить модели чата, такие как gpt-4o
, для использования в :AI
и :AIEdit
Commands. Эти модели дешевле, но в настоящее время менее подходят для редактирования/завершения кода, поскольку они реагируют на человеческий текст и комментарии.
В зависимости от варианта использования, хорошая первоначальная подсказка может помочь инструктировать модель чата ответить желаемым способом:
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
Вы можете найти полезную коллекцию пользовательских команд в сообществе Wiki.
Чтобы создать пользовательскую команду, вы можете вызвать функции AIRun
, AIEditRun
и AIChatRun
. Например:
" 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> )
Взносы приветствуются! Пожалуйста, не стесняйтесь открыть запрос на привлечение, сообщать о проблеме или внести свой вклад в сообщество Wiki.
Точность : GPT хорош в создании текста и кода, который выглядит правильно с первого взгляда, но может быть совершенно неправильным. Обязательно тщательно просмотрите, прочитайте и протестируйте все выходные данные, сгенерированные этим плагином!
Конфиденциальность : этот плагин отправляет текст в Openai при создании завершений и изменений. Поэтому не используйте его в файлах, содержащих конфиденциальную информацию.
MIT Лицензия