2. 들여가며
• Vim에서는 VimL 이라는 언어를 이용하여
Plugin을 개발 할 수 있습니다
• 하지만, Python을 이용하여 Vim Plugin을
개발할 수 있다는 사실!
– 아직은 많은 분들이 모르고 계십니다
• 본 문서에서는 Python으로 Vim Plugin을
개발하는 방법에 대해서 알아보겠습니다
3. 차례
• Vim plugin 기초 (Markdown Heading 예)
– command map
– function
• python으로 plugin 만들기
– 예제1) 계산기
– 예제2) JSON Formatter
• Vim Plugin Manager
– Vundle 사용법
5. Vim에서 Markdown h1 자동 입력
Title 1
Title 1
=======
vim에서 yypVr= 을 입력하면,
참고: yypVr=는 다음과 같은 의미를 갖고 있습니다.
yy: 한줄 복사
p: 붙여 넣기
V: 한줄 선택
r=: =로 replace
6. map - command 입력을 편하게
• map을 사용하면 command 입력이 편합니다
• ~/.vimrc에 다음의 내용을 입력해보세요
• u1 을 입력하면 h1이 생성된 것을 볼 수
있습니다.
– ~/.vimrc 내용이 바뀌었으므로,
– vim을 새로 띄우거나 vim에서 :source
~/.vimrc 명령을 실행시켜야 합니다
nnoremap <leader>u1 :normal yypVr=<cr>
7. map - command 입력을 편하게
• nnoremap
– normal mode에서 수행되는 map 정의
• <leader>
– leader key를 의미합니다
– 별도 설정을 하지 않은 경우 <leader> key는 back
slash입니다
• <cr>
– carriage return, 즉 enter key 입력을 의미합니다
8. Function
• Markdown Heading을 VimL 함수를 이용하여
좀 더 확장해겠습니다
• 마찬가지로 ~/.vimrc에 다음의 내용을
추가하세요
function! UnderlineHeading(level)
if a:level == 1
normal! yypVr=
elseif a:level == 2
normal! yypVr-
else
normal! I###
endif
endfunction
9. Function
• Vim에서 다음과 같이 호출 할 수 있습니다
– ":call Under" 까지만 입력하고 Tab을
입력하면 "자동완성" 됩니다
• 함수 호출 또한 다음과 같이 mapping할 수
있습니다
:call UnderlineHeading(1)
nnoremap <leader>u1 :call UnderlineHeading(1)<cr>
11. Vim 버전 확인
• 다음과 같은 명령을 내렸을 때 "+python"이
보여 합니다
– "+"는 기능이 존재한다는 것을 의미하고,
– "-"는 기능이 존재하지 않는 다는 것을
의미합니다
• "+python"은 Vim이 Python2를 지원한다는
이야기입니다
$ vim --version | grep python
+cryptv +linebreak +python +viminfo
+cscope +lispindent -python3 +vreplace
12. "Hello world"
• Vim에서 다음과 같이 입력해 보세요
• "Hello world"가 10번 출력된 것을 보실 수
있습니다
• 그렇습니다. 여러 분들은 지금 Vim에서
Python code를 실행시킨 것입니다
:python "Hello world" * 10
13. Text 계산기
• 터미널 작업 중 계산할 일이 있으면 bc
명령을 실행시켰지만, 이젠 vim 안에서 직접
계산할 수 있습니다
14. Text 계산기
function! Calc()
python <<endPython
import vim
# cursor가 위치한 line의 내용 접근
current_line = vim.current.line
result = eval(current_line)
# cursor가 위치한 line 번호, 컬럼 번호 접근
(row, col) = vim.current.window.cursor
# 계산 결과를 현재 line에 붙여 넣기
vim.current.buffer[row-1] += " = " + str(result)
endPython
endfunction
마찬가지로 아래 내용을 ~/.vimrc 파일에 입력하세요
15. Text 계산기
• 이제 계산하고자 하는 line에서 :call
Calc()를 입력하면 계산 결과를 보실 수
있습니다.
2.54 * 5.7 2.54 * 5.7 = 14.478:call Calc()
16. Interactions with Vim
이 부분의 내용 아래 문서를 주로 참조했습니다
https://github.com/JarrodCTaylor/vim-plugin-starter-kit/wiki/Interactions-with-the-buffer
17. Vim buffer 내용 조회
• Vim Plugin을 만들기 위한 핵심 중
하나입니다
• cursor 아래에 있는 단어 조회
– current_word = vim.eval('expand("<cword>"))
• cursor가 위치하는 line의 내용
– current_lind = vim.current.line
• cursor 아래에 있는 단어 변경하기
– vim.command("normal BcW%s" % "New word")
이 부분의 내용은 아래 문서를 주로 참조했습니다
https://github.com/JarrodCTaylor/vim-plugin-starter-kit/wiki/Interactions-with-the-buffer
18. Vim buffer 내용 조작
• vim.current.buffer 객체를 통하여 buffer 내용을
수정할 수 있습니다
• buffer 첫 줄 내용 변경
• buffer의 제일 뒤에 line 추가
• 0~3번째 line 삭제
• vim.current.buffer는 python의 array interface를
그대로 사용 가능합니다
vim.current.buffer[0] = "modified line"
vim.current.buffer.append("appended line")
vim.current.buffer[:3] = None
19. cursor 좌표
• cursor 좌표 구하기
• cursor 좌표 이동하기
cursor_pos = vim.current.window.cursor
print("The cursor is on row {0} and column {1}".format(cursor_pos[0], cursor_pos[1]))
# 1번 line, 0번 column으로 이동
# line은 1부터 시작이고, column은 0번 부터 시작임
vim.current.window.cursor = (1, 0) # Move cursor to the top left
20. visual select 영역 조회
• visual select 후 명령 내릴 때 시작 위치, 끝
위치가 <, > 로 marking된 것에 착안된
code입니다
def get_visual_selection():
buf = vim.current.buffer
(starting_line_num, col1) = buf.mark('<')
(ending_line_num, col2) = buf.mark('>')
lines = vim.eval('getline({}, {})'.format(starting_line_num, ending_line_num))
lines[0] = lines[0][col1:]
lines[-1] = lines[-1][:col2 + 1]
return lines, starting_line_num, ending_line_num, col1, col2
21. JSON Formatter
function! FormatJson()
python <<endPython
import json
import vim
try:
formatted_json = json.dumps(json.loads('n'.join(vim.current.buffer[:])),
indent=2,
ensure_ascii=False).encode('utf8')
vim.current.buffer[:] = None # buffer 내용 삭제
for line in str.split(formatted_json, 'n'): # vim에 삽입
vim.current.buffer.append(str(line))
vim.current.buffer[0] = None # 첫 줄에 빈 문자열이 저장되서 삭제
except ValueError, e:
print e
endPython
endfunction
command! FormatJson call FormatJson()
23. Vim Plugin Manager
이 부분의 내용은 "Python으로 Vim plugin 만들기"라는 주제와 직접적인 연관은 없습니다
하지만 여러분들이 멋지게 만든 Plugin을 남들이 쉽게 쓰게 하기 위해서는 알고 있어야 할
내용입니다
24. "Vundle을 소개합니다"
• https://kldp.org/node/125263
– Vundle 이전의 Vim 플러그인 배포와 문제점
• 여러 디렉터리에 사용자가 직접 copy를 해야 했음
– pathogen의 등장
• runtime path 조작
• 기존 방법보다는 편리하지만, Plugin Manager라 불리긴
어려움
– Vundle의 등장
• 진정한 Plugin Manager 등장
• 설치, 삭제를 쉽게 해줌
• github을 Plugin Repository로 활용
25. Vundle 설치
• Vundle 다운로드
– $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
• ~/.vimrc에 다음 내용 추가
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end() " required
filetype plugin indent on " required
26. Plugin 설치
1.~/.vimrc의 call
vundle#begin()와 call
vundle#end()사이에
2. 설치하고자 하는 Plugin의 이름 적은 다음,
3. vim을 새로 띄운 후 :PluginInstall
명령을 내리면 됩니다
4. 그러면 Vundle은 추가된 Plugin을
자동으로 설치해줍니다
27. Plugin 설치
Text 정렬을 쉽게 맞춰주는 Align이라는 Plugin을
설치해보겠습니다.
1. Align 설치 전 ~/.vimrc 내용
2. Align 설치 전 ~/.vim/bundle/ 디렉터리 내용
(Vundle.vim/ 밖에 없음)
3. Align 설치를 위해 Plugin 'Align' 추가
4. ~/.vimrc 내용이 변경되었으므로 ~/.vimrc을 새로 읽어야
한다.
vim을 새로 실행시키거나 Vim에서 :source $MYVIMRC 명령
입력한다
29. JSON Formatter 배포하기
• 앞에서 만들었던 JSON Formatter를 github에
배포하고 설치하는 방법에 대해서
알아보겠습니다
• 다음 github Repository와 동일한 구조의
Repository를 만드세요
– https://github.com/mysqlguru/JsonFormatter
– Fork를 하셔도 무방합니다
30. JSON Formatter 배포하기
• ~/.vimrc의 call vundle#begin()와
call vundle#end()사이에 다음의 내용을
추가하세요
• vim을 새로 연 뒤에 :PluginInstall
명령을 입력하면 JsonFormatter가 설치됩니다
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'Align'
Plugin 'mysqlguru/JsonFormatter' "mysqlguru 대신 본인의 id 입력
call vundle#end()
31. JSON Formatter 배포하기
• Plugin 'mysqlguru/JsonFormatter'
– 다음의 github repository를 설치하겠다는 것을
의미합니다
– https://github.com/mysqlguru/JsonFormatter
• Plugin 'Align'
– 다음의 github repository를 설치하겠다는 것을
의미합니다
– https://github.com/vim-scripts/Align
32. 참고 자료
• Your First Vim Plugin
– https://www.youtube.com/watch?v=lwD8G1P52Sk
• Writing Vim plugins with python
– https://www.youtube.com/watch?v=vMAeYp8mX_M
• Vim Documentation
– http://vimdoc.sourceforge.net/htmldoc/if_pyth.html
• Mapping keys in Vim - Tutorial
– http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-
_Tutorial_(Part_1)
• "vundle을 소개합니다"
– https://kldp.org/node/125263