SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
python으로 Vim Plugin 만들기
Jason Heo
http:/jason-heo.github.io/
2015-10
들여가며
• Vim에서는 VimL 이라는 언어를 이용하여
Plugin을 개발 할 수 있습니다
• 하지만, Python을 이용하여 Vim Plugin을
개발할 수 있다는 사실!
– 아직은 많은 분들이 모르고 계십니다
• 본 문서에서는 Python으로 Vim Plugin을
개발하는 방법에 대해서 알아보겠습니다
차례
• Vim plugin 기초 (Markdown Heading 예)
– command map
– function
• python으로 plugin 만들기
– 예제1) 계산기
– 예제2) JSON Formatter
• Vim Plugin Manager
– Vundle 사용법
Vim Plugin 기초
Markdown Heading 예제
(Markdown과 Heading에 대한 기초 개념이 있는 가정하에
작성했습니다.)
Vim에서 Markdown h1 자동 입력
Title 1
Title 1
=======
vim에서 yypVr= 을 입력하면,
참고: yypVr=는 다음과 같은 의미를 갖고 있습니다.
yy: 한줄 복사
p: 붙여 넣기
V: 한줄 선택
r=: =로 replace
map - command 입력을 편하게
• map을 사용하면 command 입력이 편합니다
• ~/.vimrc에 다음의 내용을 입력해보세요
• u1 을 입력하면 h1이 생성된 것을 볼 수
있습니다.
– ~/.vimrc 내용이 바뀌었으므로,
– vim을 새로 띄우거나 vim에서 :source
~/.vimrc 명령을 실행시켜야 합니다
nnoremap <leader>u1 :normal yypVr=<cr>
map - command 입력을 편하게
• nnoremap
– normal mode에서 수행되는 map 정의
• <leader>
– leader key를 의미합니다
– 별도 설정을 하지 않은 경우 <leader> key는 back
slash입니다
• <cr>
– carriage return, 즉 enter key 입력을 의미합니다
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
Function
• Vim에서 다음과 같이 호출 할 수 있습니다
– ":call Under" 까지만 입력하고 Tab을
입력하면 "자동완성" 됩니다
• 함수 호출 또한 다음과 같이 mapping할 수
있습니다
:call UnderlineHeading(1)
nnoremap <leader>u1 :call UnderlineHeading(1)<cr>
Python으로 Vim plugin 만들기
이제 본격적으로 Python으로 Vim plugin 만드는 방법을 알아
보겠습니다
Vim 버전 확인
• 다음과 같은 명령을 내렸을 때 "+python"이
보여 합니다
– "+"는 기능이 존재한다는 것을 의미하고,
– "-"는 기능이 존재하지 않는 다는 것을
의미합니다
• "+python"은 Vim이 Python2를 지원한다는
이야기입니다
$ vim --version | grep python
+cryptv +linebreak +python +viminfo
+cscope +lispindent -python3 +vreplace
"Hello world"
• Vim에서 다음과 같이 입력해 보세요
• "Hello world"가 10번 출력된 것을 보실 수
있습니다
• 그렇습니다. 여러 분들은 지금 Vim에서
Python code를 실행시킨 것입니다
:python "Hello world" * 10
Text 계산기
• 터미널 작업 중 계산할 일이 있으면 bc
명령을 실행시켰지만, 이젠 vim 안에서 직접
계산할 수 있습니다
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 파일에 입력하세요
Text 계산기
• 이제 계산하고자 하는 line에서 :call
Calc()를 입력하면 계산 결과를 보실 수
있습니다.
2.54 * 5.7 2.54 * 5.7 = 14.478:call Calc()
Interactions with Vim
이 부분의 내용 아래 문서를 주로 참조했습니다
https://github.com/JarrodCTaylor/vim-plugin-starter-kit/wiki/Interactions-with-the-buffer
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
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
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
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
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()
JSON Formatter
[{
"name":"
Heo","jo
b":"farm
er","gen
der":"M"
}]
[
{
"gender": "M",
"job": "farmer",
"name": "Heo"
}
]
:FormatJson
Vim Plugin Manager
이 부분의 내용은 "Python으로 Vim plugin 만들기"라는 주제와 직접적인 연관은 없습니다
하지만 여러분들이 멋지게 만든 Plugin을 남들이 쉽게 쓰게 하기 위해서는 알고 있어야 할
내용입니다
"Vundle을 소개합니다"
• https://kldp.org/node/125263
– Vundle 이전의 Vim 플러그인 배포와 문제점
• 여러 디렉터리에 사용자가 직접 copy를 해야 했음
– pathogen의 등장
• runtime path 조작
• 기존 방법보다는 편리하지만, Plugin Manager라 불리긴
어려움
– Vundle의 등장
• 진정한 Plugin Manager 등장
• 설치, 삭제를 쉽게 해줌
• github을 Plugin Repository로 활용
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
Plugin 설치
1.~/.vimrc의 call
vundle#begin()와 call
vundle#end()사이에
2. 설치하고자 하는 Plugin의 이름 적은 다음,
3. vim을 새로 띄운 후 :PluginInstall
명령을 내리면 됩니다
4. 그러면 Vundle은 추가된 Plugin을
자동으로 설치해줍니다
Plugin 설치
Text 정렬을 쉽게 맞춰주는 Align이라는 Plugin을
설치해보겠습니다.
1. Align 설치 전 ~/.vimrc 내용
2. Align 설치 전 ~/.vim/bundle/ 디렉터리 내용
(Vundle.vim/ 밖에 없음)
3. Align 설치를 위해 Plugin 'Align' 추가
4. ~/.vimrc 내용이 변경되었으므로 ~/.vimrc을 새로 읽어야
한다.
vim을 새로 실행시키거나 Vim에서 :source $MYVIMRC 명령
입력한다
Plugin 설치
5. :PluginInstall 명령 수행 후 vim
화면
6. ~/.vim/bundle/Align/이 생성된 것을 볼 수 있다
JSON Formatter 배포하기
• 앞에서 만들었던 JSON Formatter를 github에
배포하고 설치하는 방법에 대해서
알아보겠습니다
• 다음 github Repository와 동일한 구조의
Repository를 만드세요
– https://github.com/mysqlguru/JsonFormatter
– Fork를 하셔도 무방합니다
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()
JSON Formatter 배포하기
• Plugin 'mysqlguru/JsonFormatter'
– 다음의 github repository를 설치하겠다는 것을
의미합니다
– https://github.com/mysqlguru/JsonFormatter
• Plugin 'Align'
– 다음의 github repository를 설치하겠다는 것을
의미합니다
– https://github.com/vim-scripts/Align
참고 자료
• 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

Contenu connexe

Similaire à developing vim plugins with python

Vim for php
Vim for phpVim for php
Vim for phpSol Kim
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324종인 전
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1Jinkyoung Kim
 
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)NAVER CLOUD PLATFORMㅣ네이버 클라우드 플랫폼
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편Sam Kim
 
cross compile
cross compilecross compile
cross compilehe4722
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows TerminalOnGameServer
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
Posquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamliningPosquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamliningByungjin Park
 
Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Han Sung Kim
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debuggingJongwon Han
 
Virtual Development Environment Setting
Virtual Development Environment SettingVirtual Development Environment Setting
Virtual Development Environment SettingKwangyoun Jung
 

Similaire à developing vim plugins with python (20)

Vim for php
Vim for phpVim for php
Vim for php
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
JetsonTX2 Python
 JetsonTX2 Python  JetsonTX2 Python
JetsonTX2 Python
 
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
[온라인교육시리즈] 네이버 클라우드 플랫폼 init script 활용법 소개(정낙수 클라우드 솔루션 아키텍트)
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편
 
cross compile
cross compilecross compile
cross compile
 
Vim 강의
Vim 강의Vim 강의
Vim 강의
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
Posquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamliningPosquit0 - Fabric을 이용한 ssh streamlining
Posquit0 - Fabric을 이용한 ssh streamlining
 
Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료
 
Composer
ComposerComposer
Composer
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
 
Virtual Development Environment Setting
Virtual Development Environment SettingVirtual Development Environment Setting
Virtual Development Environment Setting
 

Dernier

공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 

Dernier (8)

공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 

developing vim plugins with python

  • 1. python으로 Vim Plugin 만들기 Jason Heo http:/jason-heo.github.io/ 2015-10
  • 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 사용법
  • 4. Vim Plugin 기초 Markdown Heading 예제 (Markdown과 Heading에 대한 기초 개념이 있는 가정하에 작성했습니다.)
  • 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>
  • 10. Python으로 Vim plugin 만들기 이제 본격적으로 Python으로 Vim plugin 만드는 방법을 알아 보겠습니다
  • 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 명령 입력한다
  • 28. Plugin 설치 5. :PluginInstall 명령 수행 후 vim 화면 6. ~/.vim/bundle/Align/이 생성된 것을 볼 수 있다
  • 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