vim 사용자를 위한 플러그인 매니저 vundle 을 소개 합니다.

neocoin의 이미지

(2011년 기준으로 읽어주시면 됩니다. 내부 명령어 변경사항은 갱신되었니 이용에 무리 없습니다. --2015-01-23)

제 개발 환경은 Ubuntu Server (Vim)와 Mac(MacVim, Vim) 입니다. Windows 환경에서 작업하지 않은지 몇년이 되어서, Windows에서 이하 내용이 정확히 돌아가는 가에 대한 확신이 없습니다. 참고해주세요. 요즘 매우 유용하게 쓰고 있어서 추천 안할수가 없네요. 카테고리는 마땅치 않아 강좌로 세팅합니다.

Vim을 사용하면서 최근 몇년 사이에 인상깊은 발전을 보고 정리겸 공유하고 싶어서 입니다. 그럼 시작합니다.

도입

vim 명령을 내리면 펼쳐지는 심심한 화면 때문에 잘 인지할 수 없지만, 요 몇년간 Vim 은 다른 에디터 처럼 꾸준히 발전해 왔습니다. 버전 숫자 하나가 올라갈때 마다 수많은 버그와 개선이 이루어지곤 했죠. 특히 2006년에 메이저 버전이 업그레이드 되면서 등장한 Vim 7.x 부터 내부 스크립트에서 자료형을 지원하면서, 외부 스크립트에 의존하지 않고 Vim 의 스크립팅만으로 괜찮은 플러그인을 만들수 있는 환경이 갖추어졌습니다. (그래요.. 그전에는 emacs를 조금이라도 흉내내려면, 외부 스크립의 도움을 받아야 했습니다.)

그리고 2010년에 이르러 Rails 커뮤니티 맴버들이 Vim의 플러그인 생태계에 가담하면서 재미있는 프로젝트가 생겼는데, 그게 Plugin manager 로 발전하였습니다. 전 바로 이 플러그인 메니저들 중 가장 멋진 작품이 되어 가고 있는 vundle 을 소개하려 합니다.

과거(Vundle 등장 이전) Vim 플러그인 배포의 방법과 문제

Vim 을 설치하면, 기본 플러그인은 다음의 구조를 가집니다.

~/.vim
    ├── after
    ├── autoload
    ├── backups
    ├── colors
    ├── doc
    ├── ftdetect
    ├── ftplugin
    ├── indent
    ├── lib
    ├── plugin
    ├── syntax
    └── undos

각각의 폴더 이름에서 짐작할수 있듯이 vim이 실행되면서 이루어지는 일종의 콜백 위치라고 생각하면 됩니다. 따라서, 멋진 플러그인일 수록 각 콜백에 적합한 위치에 여러 소스가 퍼지는 형태로 제작됩니다. (예 syntax/good.vim, after/good.vim 이런식) 이를 배포하기 위해서, Vim 커뮤니티의 Charles E. Campbell, Jr.는 Vimball Archiver(이하 vba) 라는 방식을 제시합니다. vba 는 Vim 플러그인 인스톨러 포맷 같은겁니다. Vim 플러그인은 모두 텍스트로 구성되어 있기 때문에, 각 파일들을 저장할 위치를 명시해서 하나의 텍스트 파일에 통합해서 배포하는 것이죠. (압축된 zip 이 아닙니다. 텍스트 파일입니다.)

자세한 내용은 Vim 에서 볼수 있습니다.

:help vba

그래서 vim online 에서 스크립트를 찾으면 vba 파일을 종종 볼수 있습니다. 이 파일은 vim 내에서 실행하는 것만으로 설치가 가능합니다. 그런데 아무리 vba로 플러그인을 편하게 설치해도, 배포 환경이 불러오는 문제는 해결되지 않습니다. 일단 소스가 여러 디렉토리로 퍼저서 플러그인 단위로 버전 관리하기가 힘듭니다. 자동 업그레이드는 따위는 생각하기 힘들죠. 그리고 vba 패키징이 생각보다 귀찮아요.

Vim 플러그인 환경의 개선 pathogen.vim

그런데 Rails 커뮤니티의 인원들이 TextMate에서 적극적으로 vim으로 이주(?)하기 시작하면서, 그 중 일부가 재미있는 일을 시작합니다. 처음에는 단순히 Rake (Ruby계의 Make)를 이용해서 자신이 좋아하는 플러그인을 자동 설치해주는 시스템이 등장합니다. 이런 플러그인 공유가 등장한후 얼마 지나지 않아서, Rails 세상의 라이브러리 패키징 방식(주1)과 Bundler라는 라이브러리의 아이디어를 vim으로 가지고 와서 불편한 플러그인 배포 환경을 개선합니다. (2015년 즈음에는 이런 혁신을 nodejs, npm 에서 자주 발견할수 있습니다.)

  • 주1) 정확히는 Rails 의 구버전에 있던 gem freezing 이라는 개념입니다. 이 문서에서는 ruby 사용자 대상이 아니므로 모두 '라이브러리'로 지칭합니다.

배포 환경 개선의 포인트는 각각의 플러그인별로 ~/.vim 내에 디렉토리로 격리 시켜 버리는 겁니다. 이런 식으로 말이죠.

~/.vim
    ├── after
    ├── autoload
    ├── backups
    ├── bundle
    │   ├── Align
    │   │   ├── autoload
    │   │   ├── doc
    │   │   └── plugin
    │   ├── FuzzyFinder
    │   │   ├── autoload
    │   │   │   └── fuf
    │   │   ├── doc
    │   │   └── plugin
    │   ├── The-NERD-Commenter
    │   │   ├── doc
    │   │   └── plugin
    │   ├── The-NERD-tree
    │   │   ├── doc
    │   │   ├── nerdtree_plugin
    │   │   └── plugin
--------(생략)---------------
    ├── colors
    ├── doc
    ├── ftdetect
    ├── ftplugin
    ├── indent
    ├── lib
    ├── plugin
    ├── syntax
    └── undos

이렇게 구성해놓고 vim 을 정상 동작하도록 하는 녀석이 바로 pathogen.vim(: manage your runtimepath) 입니다. Vim 의 런타임 패스를 조작하는 방식이죠. (참고로 이 플러그인의 개발자인 tpope's Profile - GitHub 를 보시면 정말 굉장합니다. 특히, Rails 개발자에게 이 아저씨가 만든 vim-rails 는 예술입니다.)

자 이렇게 만드는 것만으로, Vim 플러그인 개발과 공유는 매우 쉽게 되었습니다. 이게 2010년 입니다. 더불어서 이때가 github 이 등장하면서 이 위에서 오픈소스로 vim 플러그인 개발이 매우 용이해 졌습니다. 그냥 ~/.vim/bundle 밑에 git clone 하는 것으로 플러그인을 설치하고 개발할 수 있거든요. 최근 Vim 플러그인에 관심을 가진 분이라면 pathogen.vim 이 심심치 않게 등장하는 걸 볼수 있을 겁니다. 여기까지만 써도 기존 플러그인 보다 정말 혁신적인 환경을 사용할 수 있습니다.

Vim Plugin Package Manager - vundle.vim

그런데 개선은 여기에서 멈추지 않습니다.

이 시기에 github 가 폭풍처럼 인기를 끌기 시작합니다. (현재(2011) github의 커밋 숫자는 sf, google code를 합친 숫자를 훨씬 뛰어 넘습니다.)

우선 위에 잠깐 등장한 등장한 Ruby 세상의 Bundler 라이브러리의 역할을 조금 자세히 소개해야 겠습니다. 이 녀석은 지정된 라이브러리를 공용 저장소 서버에서 가지고 와서 설치히고 패키징도 하는 역할을 합니다. (Java 로 보면 Maven 역할) 그런데 이 저장소를 정해진 서버가 아니라 라이브러리 단위로 git으로 노출된 서버를 지정할 수 있는 강력한 특징이 있습니다. 즉, 네트웍이 연결된 git 저장소에서 소스를 들고와서 이를 라이브러리로 패키징 하는 개념이죠. 주소 변경 만으로 개발 버전과 제품 버전을 바꾸어서 패키징하는 등 많은 이점이 있습니다.

git을 배포 저장소로 하는 이득이 너무 커서, Rails 세상에서는 소스 서버 대상을 아예 git으로 타케팅 해버리는게 일상화 되어 버립니다.

이런 git을 통해서 배포하는 Bundler의 아이디어와 Vim 의 런타임 패스를 조작해서 플러그인 배포 환경을 개선한 pathogen 에서 영감을 얻어 만들어진 'Vim Plugin Manager'가 바로 마지막에 소개하는 vundle.vim 입니다.

즉, vundle.vim 은 모든 플러그인을 특정 웹사이트( http://vim-scripts.org ) 에 담긴 인덱스와 git 저장소 정보를 바탕으로 마치 애플의 앱스토어 처럼 플러그인을 설치하는 통합 환경을 Vim에 제공합니다. 그리고 플러그인 단위로 다른 git 저장소를 지정해서 설치할 수도 있습니다. 아래 활용의 스크린샷을 참고하세요.

  • 참고로 welcome home : vim online를 미러링해둔 플러그인은 vim-scripts's Profile - GitHub에 저장되어 있습니다. 무려 저장소가 3660개가 넘어가죠.(2015년 4100개) 저는 github 애들이 이걸다 지원해준다는 점이 정말 놀랍습니다.

vundle.vim 설치 정보

Vim Scripts에서 vundle.vim 과 이와 동일 역할을 하는 다른 도구들을 찾을 수 있습니다.

vundle의 설치 단계는 다음 문서를 참고하세요.

vundle 은 플러그인 자체를 관리하는 플러그인 입니다. 설치 방법은 위에 잘나와 있으니 생략하고 간단히 제가 사용하는 과정을 첨부합니다.

vundle.vim 의 사용 사례 1

만약 제가 새로운 vim 플러그인을 설치하려면 일단 Google이나 scripts : vim을 검색합니다. 그리고 이름을 알아내죠.

이번에 저는 Align 라는 녀석을 설치하려 해요. 일단 vundle 이 지원하는지 확인합니다.

:PluginSearch 

그러면 vundle 을 이용해서 설치할수 있는 리스트가 나옵니다. 이 리스트는 Vim Scripts 의 인덱스를 기본으로 합니다. 참고로 해당 사이트는 여전히 개선 중입니다. (아직 추천이나 검색이 없습니다.)

여기에서 검색! Align가 있네요. 오호! 제 vim 설정 파일을 엽니다.

:vs $MYVIMRC

이제 왼쪽에서 찾은 플러그인 한줄을 오른쪽의 제 $MYVIMRC 에 복사합니다. (리스트에서 I를 누르면 그냥 설치는 됩니다. 지속적인 관리를 위해서 리스트에 추가시켜 줍니다.)

그리고 나서

:PluginInstall

이러면, 네트웍을 통해서 소스를 가지고와서 설치하고 도움말을 위한 인덱스 생성까지 깔끔하게 마무리 해줍니다.

1. 플러그인 찾기 (PluginSearch 혹은 github 주소)  
2. $MYVIMRC 에 원하는 플러그인 기입 
    예)
        Plugin 'Align'    "(PluginSearch 에서 복사)
        Plugin 'https://github.com/juvenn/mustache.vim.git'  "(github 에서 찾아서 추가)
3. PluginInstall

어때요 사용 방법이 참 쉽죠(?)

(과거를 생각해 보세요. 일단 찾아서 웹사이트에서 다운을 받은후 이게 text인지, zip인지 vba인지 파악한 후, 터미널 열어서 zip이면 cp로 적절한 위치에 복사하고 vba면 실행하고, vim help 뒤져서 플러그인의 도움말을 위한 tag를 만들주는 명령을 실행하면 완료입니다. 헉헉..)

Vim Scripts 측은 기존의 scripts : vim 를 모두 github 에 미러링 해두어서 대부분의 플러그인은 무리 없이 찾을수 있습니다. 스크린샷 오른쪽의 16라인을 보시면 저런식으로 각 플러그인의 소스 저장소를 git으로 직접 명시할 수도 있습니다. 스크린샷 오른쪽에 기입된 Plugin 을 보면 글을 작성한 2011년에서 몇년이 지난 이제는 (2015년) git 저장소를 지칭한 것이 더 많은데요. 제가 쓰는 플러그인들도 vim-scripts.org 보다 직접 github 를 지칭하는 것이 더 많아졌습니다. 그만큼 이 도구가 매우 일반화 되었습니다.

플러그인이 마음에 들지 않는다면 $MYVIMRC (.vimrc) 에서 해당 플러그인 라인을 제거하고 다음을 실행합니다.

:PluginClean

이 명령어는 위 스크린샷 오른쪽 편에 Plugin "plugin-name" 으로 기술되지 않은 플러그인을 일괄 삭제합니다. (역시 과거를 생각해 보세요. find, grep rm 신공을 이용해서 손수 찾아서 삭제해야 합니다.)

좀 더 자세한 건 도움말을 참고하세요.

:help vundle

vundle 활용 사례 2

저는 Client, Server 에서 여러 곳에서 동일 개발 환경을 유지하기 위해서 개인 정보를 제외한 모든 개발 환경 정보를 소스 저장소를 통해 관리합니다. (예전에는 Google code, 지금은 github 입니다. 이런 사용이 은근히 많더군요.) 소스를 체크 아웃하고 필요한 것만 심볼릭 링크 걸어서 쓰는 방법을 즐깁니다. (최초 github 체크 아웃 빼고는 모두 자동화 되어있습니다. )

그런데 vundle 을 사용하기 전에는 vim 의 모든 플러그인을 함께 넣어서 checkout 해서 썼습니다. vundle 적용후 대부분의 큰 플러그인들은 vundle을 통해 일괄 설치하고, 자작이나 커스텀 플러그인만 넣어두고 관리합니다. vundle의 사용을 알면 이제 .vimrc 파일 하나만 들고 다녀도 동일 플러그인 환경을 언제든 구성할 수 있게 됩니다.

마치며

Happy Vim!

부록

Changes

2015-01-23 Bundle prefix => Plugin 교체 (=> PluginSearch, PluginInstall, PluginClean ) 기본 명령어가 변경됨. 관련 스크린샷 교체. 2015년 시간 관점에서 시간 모호한 부분 코멘트 추가

File attachments: 
Forums: 
feedseaotter의 이미지

pathogen을 써보려고 하고 있었는데 마침 좋은 소개글을 써주셨군요. 감사합니다.

beta의 이미지

오래만에 글쓰게 만드네요. 감사합니다.

발 담갔다. 이제 익숙해 지는길만이..

익명 사용자의 이미지

vim의 컬러스킴이 예쁩니다.

neocoin의 이미지

evening 입니다.

antz의 이미지

좋은 정보 고맙습니다. :-)

cleansugar의 이미지

와 정성껏 장문을 써주셨네요.

고맙습니다.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

calmperson의 이미지

이런 멋진게 있었네요 한번 써봐야 겠어요
감사합니다~

"그때의 두려움을 어찌 잊을 수 있으리오!"
왕이 말했다.
"하지만"
여왕은 말을 이었다.
"메모해 두지 않으면 잊고 말 겁니다."

khiny의 이미지

저도 neocoin의 wiki에서 이 글을 예전에 보고 한번 도전해봤는데요.
_vimrc에 샘플 넣고 gvim을 다시 실행해서 :BundleInstall 을 실행하면 프로그램이 죽어버리면서 창이 닫혀버리더군요.
이리저리 찾아보다가 포기했어요. ^^;

오늘 한 번 더 도전해봐야겠네요.
샘플에 있는 Bundle을 다 주석처리하고 BundleInstall실행해도 죽네요.

neocoin의 이미지

위에 적었다 시피 아예 windows에서 실행해보지 않았습니다. 성공하시면 공유 부탁드려요.

그리고, 구지 vundle 이 아니더라도, pathogen.vim + git 만 잘 돌아가도 윈도우에서 매우 편하게 vim plugin 을 사용하고 개발할 수 있습니다.

익명 사용자의 이미지

감사합니다. 잠시 emacs에 혹했던 마음이 순식간에 사라지는군요 ^^

익명 사용자의 이미지

vim 소개글에 emacs 소개하는건 반칙(?)이지만...
emacs얘기도 해 보자면...
emacs에는 el-get이라는게 있습니다. ^^

https://github.com/dimitri/el-get#readme

익명 사용자의 이미지

raymundo의 이미지

오오 감사합니다~

좋은 하루 되세요!

sangheon의 이미지

아직 플러그인을 많이 활용하고 있지는 않지만 바로 상당한 수준의 플러그인이라는 느낌이 들었습니다. 앞으로 플러그인을 더 많이 활용하게 될 것 같은 생각이 듭니다.

--

Minimalist Programmer

raymundo의 이미지

예전에 이 글을 읽고는 계속 미루다가 어제 오늘에서야 시도해봤는데요, 윈도 gvim 에서 하려니 좀 난항이 있군요.

1) 보통 gvim 설치하면 폴더 구조가

D:\vim\ - 여기가 루트(?)
D:\vim\vim73\ - 버전 별로 설치되고
D:\vim\_vimrc - rc 파일은 요렇게 되고
D:\vim\vimfiles\ - 버전에 무관하게 플러그인 등등을 까는 곳

이런 식으로 쓰이던데 Vundle 은 사용자 홈 디렉토리(XP라면 Document and...\아이디)
아래에 .vim 폴더 아래를 기준으로 삼더군요. 이거야 뭐 그러려니 넘어가면 되고

2)

:BundleInstall 이나 :BundleClean 을 할 때 갑자기 하단에 "인자가 너무 많습니다"를 필두로 하면서 에러가 주루룩 났다가, 제대로 읽을 틈도 없이 사라져버리는 문제가 있더라고요.

플러그인 사이트에서 잘 뒤져보면 누군가 문제를 호소하고 해결법도 적어두지 않았을까 싶긴 한데 여기 매달리긴 싫어서 그렇게 구경만 하고 지웠습니다. 혹시 윈도에서 하실 분들 참고하십사 해서 적어둡니다. 저는 일단 여기서도 언급된 pathogen 을 쓰는 정도로 해보려고요. (제대로만 되면 pathogen을 쓰는 것보다 Vundle을 쓰는 게 훨씬훨씬훨씬 더 편할 것 같긴 합니다)

좋은 하루 되세요!

hwiorb의 이미지

windows에서 필요해서 해봤습니다.

1)
Vundle이 home directory에 대한 기준이 OS를 따르는 것일지도 모르겠군요.

2)
msysgit가 설치되어 있는 상태에서, BundleInstall, BundleClean 잘 됩니다.

설치할때 cmd /c 옵션으로 git을 호출하는데, 에러를 표준출력(2>&1)으로 보여주게 되어 있는데,
아마 이 부분이 문제가 아니었나 싶습니다.

nil.

neocoin의 이미지

이 문서가 markdown 으로 작성되어 있었는데, kldp 시스템 그동안 한번 엎어지면서 링크 부분 표현이 정확하지 않은게 좀 아쉽네요.

readme의 이미지

써본 감상...

1, 여튼 관리하기는 무지하게 편하네요... 여태까지 플러그인 깔려있는지도 망각하고 그냥 썼었는데... 다시 돌아보는(?) 계기가 됬어요

2, 여러가지 독특한 확장기능이 많군요... 몇개는 새롭게 받아서 잘 쓰고 있습니다.

3, 실제 파일(*.vim)이랑 플러그인 번들이름이 달라서 햇갈리네요. 모든 확장기능을 번들로 대체가 불가능... 확장기능의 원래 이름을 몰라서 -_-

4, BundleSearch리스트에 번들은 있는데 설치가 안되는게 좀 있네요... 어쩔수 없이 이럴경우에는 git 링크 걸어서 받는 수 밖엔...

5, 일부 번들은 설치를 정상적으로 했는데도 불구하고, 제대로 실행이 안되는 경우가 있네요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.