본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 05. 20. 13:53

madox2/vim-ai

요약

madox2/vim-ai는 Vim 및 Neovim 사용자들을 위해 OpenAI API를 통합하여 코드 생성, 텍스트 편집, 대화형 채팅 기능을 제공하는 플러그인입니다. OpenAI 호환 API를 지원하여 Gemini, Claude 또는 로컬 모델과도 연동이 가능하며, 사용자가 선택한 텍스트만 전송하여 보안과 비용 효율성을 유지합니다.

핵심 포인트

  • Vim/Neovim 환경에서 코드 생성, 편집, 질문 답변 및 대화형 채팅 지원
  • OpenAI API 외에도 OpenRouter나 LiteLLM을 통해 Claude, Gemini 등 다양한 모델과 연동 가능
  • 비전 기능을 통한 이미지 텍스트 변환 및 이미지 생성 기능 포함
  • 사용자가 선택한 텍스트만 전송하여 코드 보안 및 토큰 비용 관리 최적화
  • 커스텀 프로바이더 플러그인 확장이 가능한 구조

이 플러그인은 여러분의 Vim 및 Neovim에 인공지능 (AI) 기능을 추가합니다. OpenAI의 API를 통해 코드를 생성하거나, 텍스트를 편집하거나, GPT 모델과 대화형 대화를 나눌 수 있습니다.

AI 명령어로 무엇을 할 수 있는지 아이디어를 얻으려면 커뮤니티 위키 (Community Wiki)의 프롬프트 (prompts)를 확인하세요.

  • AI를 사용하여 텍스트 또는 코드 생성, 질문 답변
  • AI를 사용하여 선택한 텍스트를 제자리에서 편집
  • ChatGPT와 대화형 대화
  • 커스텀 역할 (Custom roles)
  • 비전 기능 (Vision capabilities, 이미지에서 텍스트로 변환)
  • 이미지 생성
  • 모든 OpenAI 호환 API와 통합
  • AI 프로바이더 (AI provider) 플러그인

이 플러그인은 응답을 생성하기 위해 OpenAI의 API를 사용합니다. 계정을 설정하고 API 키 (API key)를 발급받아야 합니다. API 사용은 무료가 아니지만, 비용은 합리적이며 사용한 토큰 (tokens)의 양, 즉 간단히 말해 얼마나 많은 텍스트를 보내고 받는지에 따라 달라집니다 (가격 책정 확인). 이 플러그인은 백그라운드에서 여러분의 코드를 임의로 전송하지 않는다는 점에 유의하세요. 여러분은 프롬프트와 채팅 내용으로 구체적으로 선택한 것만 공유하고 비용을 지불하게 됩니다.

Gemini, Claude 또는 서비스 형태나 로컬에서 실행되는 다른 모델을 실험해보고 싶다면, 모든 OpenAI 호환 프록시 (proxy)를 사용할 수 있습니다. 간단한 방법으로는 합리적인 가격을 제공하고 (현재 많은 모델을 무료로 제공하는) OpenRouter를 사용하거나, LiteLLM과 같은 프록시를 로컬에 설정하는 것이 있습니다. 커스텀 OpenRouter 역할을 구성하는 방법에 대한 이 간단한 가이드를 참조하세요.

🚨 공지 사항 🚨

vim-ai는 이제 커스텀 프로바이더 플러그인으로 확장할 수 있습니다.
하지만 아직 사용 가능한 것이 많지 않으므로, 새로운 플러그인을 개발하는 것을 환영합니다!
자세한 내용은 프로바이더 섹션을 참조하세요.

  • python3 지원이 포함된 Vim 또는 Neovim
  • API 키 (API key)
# API 키를 `~/.config/openai.token` 파일에 저장
echo "YOUR_OPENAI_API_KEY" > ~/.config/openai.token
# 또는 환경 변수로 설정
...

기본 API 키 파일 위치는 ~/.config/openai.token이지만,
.vimrc 파일에서 g:vim_ai_token_file_path를 설정하여 변경할 수 있습니다:

let g:vim_ai_token_file_path = '~/.config/openai.token'

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
...

AI 명령어를 사용하려면 명령어를 입력한 뒤 지시 프롬프트 (instruction prompt)를 입력하세요. 비주얼 선택 (visual selection) 영역과 조합하여 사용할 수도 있습니다. 사용 가능한 명령어의 간략한 개요는 다음과 같습니다:

========== 기본 AI 명령어 (Basic AI commands) ==========
:AI complete text
:AIEdit edit text
...

팁: 언제든지 Ctrl-c를 눌러 :AI:AIEdit 완료를 취소할 수 있습니다.

팁: 명령어 단축키인 :AIE, :AIC, :AIS, :AIR, :AII를 사용하거나 자신만의 키 바인딩 (key bindings)을 설정하세요.

팁: 커스텀 역할 (custom roles)을 정의하여 사용하세요. 예: :AIEdit /grammar

팁: 미리 정의된 역할인 /right, /below, /tab을 사용하여 채팅창이 열리는 방식을 선택하세요. 예: :AIC /right

팁: 특수 역할인 /populate 또는 /populate-all을 사용하여 채팅 헤더 설정에서 옵션을 표시하세요. 예: :AIC /populate /gemini

팁: 범위를 지정하여 명령어를 조합하세요 :help range. 예: 버퍼 전체를 선택하려면 - :%AIE fix grammar

더 많은 팁이 궁금하거나 :GitCommitMessage (git 커밋 메시지 제안)와 같은 명령어로 Vim의 수준을 높이고 싶다면, 커뮤니티 위키 (Community Wiki)를 방문하세요.

다음은 다양한 AI 제공업체 (AI providers)를 사용할 수 있게 해주는 제3자 제공자 플러그인 (3rd party provider plugins) 목록입니다.

  • google provider - Google의 Gemini 모델
  • OpenAI Responses API Provider - OpenAI Responses API 호환 플러그인
  • OpenAI Provider with MCP support - MCP를 지원하는 OpenAI 채팅

직접 개발하는 것에 관심이 있다면, 참조용 google provider를 살펴보세요. 이 목록을 업데이트하기 위한 PR (Pull Request)을 보내는 것을 잊지 마세요.

이 플러그인의 문맥에서 역할 (role)이란 재사용 가능한 AI 지시 사항 및/또는 설정을 의미합니다. 역할은 설정 .ini 파일에 정의됩니다. 예를 들어 grammaro1-mini 역할을 다음과 같이 정의할 수 있습니다:

let g:vim_ai_roles_config_file = '/path/to/my/roles.ini'

# /path/to/my/roles.ini
[grammar]
prompt = fix spelling and grammar
...

이제 텍스트를 선택하고 :AIEdit /grammar 명령어를 실행할 수 있습니다.

.

또한 역할 (roles)을 조합할 수도 있습니다: :AI /o1-mini /grammar helo world!

더 많은 예시는 roles-example.ini를 참조하세요.

아래 문서에서 <selection>

비주얼 선택 (visual selection) 또는 기타 범위를 나타내며, {instruction}

지시 프롬프트 (instruction prompt), {role}

사용자 정의 역할 (custom role)을 나타내고, ? 기호는

선택적 파라미터 (optional parameter)를 의미합니다.

:AI {prompt}

  • 프롬프트 완성 (complete the prompt)

<selection> :AI

  • 선택 영역 완성 (complete the selection)

<selection> :AI {instruction}

  • 지시 사항을 사용하여 선택 영역 완성 (complete the selection using the instruction)

<selection>? :AI /{role} {instruction}?

  • 역할을 사용하여 완성 (use role to complete)

<selection>? :AIEdit

  • 현재 줄 또는 선택 영역 편집 (edit the current line or the selection)

<selection>? :AIEdit {instruction}

  • 지시 사항을 사용하여 현재 줄 또는 선택 영역 편집 (edit the current line or the selection using the instruction)

<selection>? :AIEdit /{role} {instruction}?

  • 역할을 사용하여 편집 (use role to edit)

:AIImage {prompt}

  • 프롬프트로 이미지 생성 (generate image with prompt)

<selection> :AIImage

  • 선택 영역으로 이미지 생성 (generate image with selection)

<selection>? :AI /{role} {instruction}?

  • 역할을 사용하여 생성 (use role to generate)

사전 정의된 이미지 역할 (Pre-defined image roles): /hd, /natural

:AIChat

  • 대화를 이어가거나 새로운 대화 시작 (continue or start a new conversation)

<selection>? :AIChat {instruction}?

  • 선택 영역, 지시 사항 또는 둘 다를 사용하여 새로운 대화 시작 (start a new conversation given the selection, the instruction or both)

<selection>? :AIChat /{role} {instruction}?

  • 역할을 사용하여 완성 (use role to complete)

AI가 답변을 마치면, 입력 모드 (insert mode)로 들어가 프롬프트를 추가한 뒤 다시 한번 :AIChat 명령어를 사용하여 대화를 이어갈 수 있습니다.

사전 정의된 채팅 역할 (Pre-defined chat roles): /right, /below, /tab

채팅 대화를 .aichat 파일로 편집 및 저장하고 나중에 복구할 수 있습니다.
이를 통해 재사용 가능한 사용자 정의 프롬프트를 만들 수 있습니다. 예를 들어:

# ./refactoring-prompt.aichat
>>> system
당신은 Clean Code 전문가입니다. 다음과 같은 코드가 있으니, 동료들이 코드를 더 쉽게 유지보수할 수 있도록 더 깔끔하고 간결한 방식으로 리팩터링(refactor)해 주세요. 또한, 제가 Pull Request에 설명을 추가할 수 있도록 왜 코드를 리팩터링하려 하는지 이유를 설명해 주세요.
...

채팅에 파일을 포함하려면 특별한 include 섹션을 사용합니다:

>>> user
다음 파일들에 대한 문서를 생성해 주세요
>>> include
...

각 파일의 내용은 ==> {path} <== 헤더와 함께 추가적인 사용자 메시지로 추가되며, 상대 경로는 현재 작업 디렉토리(current working directory)를 기준으로 해결됩니다.

이미지 비전 기능(image to text)을 사용하려면 이미지 파일을 포함하세요:

>>> user
이미지에 있는 물체가 무엇인가요?
>>> include
...

명령을 실행하고 그 표준 출력(stdout)을 채팅에 포함하려면:

>>> user
git 커밋 메시지를 제안해 주세요
>>> exec
...

지원되는 채팅 섹션은 >>> system, >>> user, >>> include, >>> exec, 그리고 <<< assistant 입니다.

:AIRedo

  • 마지막 AI 명령을 반복합니다.

AI 명령 직후에 사용하여 다시 시도하거나 다른 완성형(completion)을 얻을 때 사용하세요.
응답의 무작위성(randomness)은 temperature 파라미터에 크게 의존한다는 점에 유의하십시오.

각 명령은 상응하는 설정 변수(configuration variable)로 구성됩니다.
기본 설정을 사용자 정의하려면 선택한 옵션들로 설정 변수를 초기화하세요. 예를 들어, .vimrc 파일에 다음과 같이 작성할 수 있습니다:

let g:vim_ai_chat = {
\ "options": {
\ "model": "o1-preview",
...

또는 특별한 default 역할을 사용할 수 있습니다:

# 모든 명령(chat, complete, edit)에 대한 옵션 설정
[default]
options.token_file_path = /custom/path/ai.token
...

또는 채팅 버퍼에서 직접 옵션을 사용자 정의할 수 있습니다:

[chat]
options.model = o1-preview
options.stream = 0
...

아래에는 사용 가능한 모든 설정 옵션과 기본값이 나열되어 있습니다. 채팅 모델에는 별도의 토큰 제한(token limit)이 적용되지 않음에 유의해 주세요.

" 이 프롬프트는 에디터 내에서 인라인으로 사용되도록 모델이 간결하게 응답하도록 지시합니다.
let s:initial_complete_prompt =<< trim END

system
...
"를 구문 강조(syntax highlighting) 활성화하는 데 사용합니다.
END
" :AIChat
" - provider: AI 제공업체 (AI provider)
" - prompt: 선택적 접두사 프롬프트 (optional prepended prompt)
" - options: openai 설정 (openai config) (https://platform.openai.com/docs/api-reference/chat 참조)
" - options.initial_prompt: 모든 채팅 요청에 접두사로 붙는 프롬프트 (줄 목록 또는 문자열)
" - options.request_timeout: 초 단위의 요청 시간 제한
" - options.auth_type: API 인증 방식 (bearer, api-key, none)
" - options.token_file_path: 전역 토큰 설정 재정의
" - options.token_load_fn: 토큰을 로드하는 표현식/vim 함수
" - options.selection_boundary: 선택 프롬프트 래퍼 (빈 응답 제거, #20 참조)
" - options.reasoning: openrouter 추론(reasoning) 매개변수 (문자열화된 json)
" - ui.open_chat_command: 프리셋 (preset_below, preset_tab, preset_right) 또는 사용자 지정 명령어
" - ui.populate_options: 채팅 헤더 설정에서 변경된 옵션 표시
" - ui.populate_all_options: 채팅 헤더 설정에서 모든 옵션 표시
" - ui.scratch_buffer_keep_open: vim 세션 내 스크래치 버퍼 재사용
" - ui.force_new_chat: 새 채팅 창 강제 열기 (예: 채팅 열기 역할에서 사용)

/tab)
" - ui.paste_mode: 붙여넣기 모드 사용 (자세한 내용은 아래 Notes 참조)
let g:vim_ai_chat = {
\ "provider": "openai",
\ "prompt": "",
\ "options": {
\ "model": "gpt-4o",
\ "endpoint_url": "https://api.openai.com/v1/chat/completions",
\ "max_tokens": 0,
\ "max_completion_tokens": 0,
\ "temperature": 1,
\ "request_timeout": 20,
\ "stream": 1,
\ "auth_type": "bearer",
\ "token_file_path": "",
\ "token_load_fn": "",
\ "selection_boundary": "",
\ "initial_prompt": s:initial_chat_prompt,
\ "frequency_penalty": "",
\ "logit_bias": "",
\ "logprobs": "",
\ "presence_penalty": "",
\ "reasoning_effort": "",
\ "seed": "",
\ "stop": "",
\ "top_logprobs": "",
\ "top_p": "",
\ "reasoning": "",
\ },
\ "ui": {
\ "open_chat_command": "preset_below",
\ "scratch_buffer_keep_open": 0,
\ "populate_options": 0,
\ "populate_all_options": 0,
\ "force_new_chat": 0,
\ "paste_mode": 1,
\ },
}
" :AIImage
" - prompt: 선택적 접두사 프롬프트
" - options: openai 설정 (https://platform.openai.com/docs/api-reference/images/create)
" - options.request_timeout: 요청 시간 초과(초 단위)
" - options.auth_type: API 인증 방식 (bearer, api-key, none)
" - options.token_file_path: 전역 토큰 설정 재정의
" - options.token_load_fn: 토큰 로드용 표현식/vim 함수
" - options.download_dir: 이미지 다운로드 디렉토리 경로, 정의되지 않은 경우 cwd 사용
let g:vim_ai_image = {
\ "provider": "openai",
\ "prompt": "",
\ "options": {
\ "model": "dall-e-3",
\ "endpoint_url": "https://api.openai.com/v1/images/generations",
\ "quality": "standard",
\ "size": "1024x1024",
\ "style": "vivid",
\ "request_timeout": 40,
\ "auth_type": "bearer",
\ "token_file_path": "",
\ "token_load_fn": "",
\ },
\ "ui": {
\ "download_dir": "",
\ },
}
" custom roles file location
let g:vim_ai_roles_config_file = s:plugin_root . "/roles-example.ini"
" custom token file location
let g:vim_ai_token_file_path = "~/.config/openai.token"
" custom fn to load token, e.g.

"g:GetAIToken()"
let g:vim_ai_token_load_fn = ""
" 모든 AI 요청에 대한 프록시 (proxy) 설정
let g:vim_ai_proxy = 'http://your-proxy-server:port'
" 비동기 AI 채팅 (AIChat) 활성화/비활성화 (기본적으로 활성화됨)
let g:vim_ai_async_chat = 1
" aichat 파일에서 전체 마크다운 (markdown) 하이라이팅 (highlighting) 활성화/비활성화
" 참고: 이 옵션을 활성화하지 않아도 코드 구문 하이라이팅 (syntax highlighting)은 즉시 작동합니다.
" 참고: preservim/vim-markdown과 함께 사용할 경우 하이라이팅이 손상될 수 있습니다.
g:vim_ai_chat_markdown = 0
" 디버그 (debug) 설정
let g:vim_ai_debug = 0
let g:vim_ai_debug_log_file = "/tmp/vim_ai_debug.log"
" 참고 사항:
" ui.paste_mode
" - 비활성화할 경우 코드 들여쓰기 (indentation)가 작동하지만, AI가 항상 코드 블록 (code block)으로 응답하지 않을 수 있습니다.
" 따라서 형식이 망가질 수 있습니다.
" 자세한 내용은 Vim 도움말 :help paste를 참조하세요.
" options.max_tokens
" - 프롬프트 (prompt) + max_tokens의 합이 모델의 토큰 (token) 제한보다 작아야 함을 유의하세요. #42, #46 참조
" - max_tokens를 ""로 설정하면 OpenAI API 요청 파라미터 (parameters)에서 제외됩니다.
" 이것이 정확히 어떤 역할을 하는지는 불분명하거나 문서화되어 있지 않지만,
" 모델이 토큰 제한에 도달하여 OpenAI: HTTPError 400으로 응답하는 문제를 해결하는 것으로 보입니다.
" options.selection_boundary
" - ``` 값을 설정하면 마크다운 (markdown)과 유사한 방식으로 동작하며, 경계 (boundary)에 파일 타입 (filetype)을 추가합니다.


플러그인이 서로 다른 OpenAI 호환 엔드포인트 (endpoints)를 사용하도록 구성할 수 있습니다. 커뮤니티 위키 (Community Wiki)의 Custom APIs 섹션에 나열된 멋진 프로젝트들을 확인해 보세요.

let g:vim_ai_chat = {
\ "options": {
\ "endpoint_url": "http://localhost:8000/v1/chat/completions",
...

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0