Slide 1

Slide 1 text

はじめての vim plugin 13೥6݄2೔೔༵೔

Slide 2

Slide 2 text

便利なplugin書きたい vimmerのジレンマ 13೥6݄2೔೔༵೔

Slide 3

Slide 3 text

便利なplugin書きたい vim_script書くのは辛い vimmerのジレンマ 13೥6݄2೔೔༵೔

Slide 4

Slide 4 text

13೥6݄2೔೔༵೔

Slide 5

Slide 5 text

Sublime Text 13೥6݄2೔೔༵೔

Slide 6

Slide 6 text

pythonでプラグインが書ける Sublime Text 13೥6݄2೔೔༵೔

Slide 7

Slide 7 text

2つの選択肢 13೥6݄2೔೔༵೔

Slide 8

Slide 8 text

* 素直にsublimeに移行する 2つの選択肢 13೥6݄2೔೔༵೔

Slide 9

Slide 9 text

* 素直にsublimeに移行する 2つの選択肢 * もうすこしvimで粘る 13೥6݄2೔೔༵೔

Slide 10

Slide 10 text

* もうすこしvimで粘る 2つの選択肢 13೥6݄2೔೔༵೔

Slide 11

Slide 11 text

有名な機能はプラグインで 実装されてるよ 13೥6݄2೔೔༵೔

Slide 12

Slide 12 text

有名な機能はプラグインで 実装されてるよ * kien/ctrlp.vim * terryma/vim-multiple-cursors 13೥6݄2೔೔༵೔

Slide 13

Slide 13 text

pythonでvimのプラグイン 書きたいなー? 13೥6݄2೔೔༵೔

Slide 14

Slide 14 text

\出来るよ!!/ 13೥6݄2೔೔༵೔

Slide 15

Slide 15 text

なんでpythonで書けるのか VimにはRuby,Python,Perl, SchemeなどのVimScript以外の言語の インタフェースが用意されている. 13೥6݄2೔೔༵೔

Slide 16

Slide 16 text

必要な環境 pythonインタフェースが使えるvim (Macvim-kaoriya etc..) 13೥6݄2೔೔༵೔

Slide 17

Slide 17 text

こんなの作ったよ kazy1991/simple-browser.vim カーソル上のurlを開くプラグイン 13೥6݄2೔೔༵೔

Slide 18

Slide 18 text

デモします 13೥6݄2೔೔༵೔

Slide 19

Slide 19 text

プラグインの構成 13೥6݄2೔೔༵೔

Slide 20

Slide 20 text

プラグインのテンプレ “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 21

Slide 21 text

それぞれの解説 “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 22

Slide 22 text

それぞれの解説 “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 23

Slide 23 text

pythonの有無の確認 1 if !has('python') && !has('python3') 2 echomsg "Error: ... 3 finish 4 endif 起動しているvimがpythonインターフェースを備えているか チェックし,持っていなければ警告を出して終了する 13೥6݄2೔೔༵೔

Slide 24

Slide 24 text

それぞれの解説 “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 25

Slide 25 text

それぞれの解説 “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 26

Slide 26 text

それぞれの解説 “ plugin/xxx.vim if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 27

Slide 27 text

お約束のテンプレ 6 let s:save_cpo = &cpo 7 set cpo&vim ------------------------------------------------------ “todo ------------------------------------------------------ 31 let &cpo = s:save_cpo 32 unlet s:save_cpo プラグインを書くときのテンプレのコード 気になった人は :help write-plugin 13೥6݄2೔೔༵೔

Slide 28

Slide 28 text

それぞれの解説 if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 29

Slide 29 text

それぞれの解説 if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 30

Slide 30 text

pythonの呼び出し方法 2 #(1) :python でpythonのワンライナーが書ける 3 :python print "hoge"; print "piyo" 4 5 #(2) ヒアドキュメントも使える 6 :python < で.pyファイルが呼び出せる 11 :pyfile hoge_piyo.py pythonを呼び出す方法は3種類 13೥6݄2೔೔༵೔

Slide 31

Slide 31 text

pythonの呼び出し python << PYTHONEOF import vim import sys import os sys.path.insert(1, os.path.join(vim.eval('expand(":p:h:h")'), 'plugin')) import sbrowser sys.path.pop(1) PYTHONEOF これが,ベスト・プラクティスな気がする.. 13೥6݄2೔೔༵೔

Slide 32

Slide 32 text

それぞれの解説 if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 33

Slide 33 text

それぞれの解説 if !has('python') && !has('python3') echomsg "Error: ... finish endif let s:save_cpo = &cpo set cpo&vim “ pythonݺͼग़͠ “ ΩʔόΠϯυͷઃఆͱ͔ let &cpo = s:save_cpo unlet s:save_cpo 13೥6݄2೔೔༵೔

Slide 34

Slide 34 text

vimの関数の定義 [スコープの違い] function! Webbrowse() * グローバルな関数 * 関数名は大文字から始める function! s:webbrowse() * 現行のスクリプトファイル内でのみ有効 * s:の接頭辞を付け,関数名は小文字から始める * こっちが推奨されてると思う 13೥6݄2೔೔༵೔

Slide 35

Slide 35 text

キーバインドの設定 function! s:webbrowse() python sbrowser.webbrowse() endfunction command! -nargs=0 SimpleWebBrowse call s:webbrowse() nnoremap W :SimpleWebBrowse 関数をコマンド化することで, ローカル関数でもキーバインド出来る 13೥6݄2೔೔༵೔

Slide 36

Slide 36 text

少しだけpython編 13೥6݄2೔೔༵೔

Slide 37

Slide 37 text

vimとの連携 [基本的なメソッド] 1 import vim 2 b = vim.current.buffer # ݱࡏͷόοϑΝ 3 print b.name # όοϑΝ໊ 4 print b.number # bufnr()ͰಘΒΕΔ஋ 5 b[0] = "hoge" # 1ߦ໨Λมߋ͢Δ 6 b[:] = None # όοϑΝΛۭʹ͢Δ 7 b = vim.buffers[1] # 1൪໨ͷόοϑΝ 8 del b[:] # ͜Ε΋όοϑΝΛۭʹ͢Δ 9 b[0:0] = ["fuga"] # Ұ൪্ʹߦΛૠೖ 10 del b[2] # 3ߦ໨Λ࡟আ 11 b.append("hoge") # ຤ඌʹߦΛ௥Ճ 12 print len(b) # όοϑΝͷߦ਺Λදࣔ 13೥6݄2೔೔༵೔

Slide 38

Slide 38 text

vimとの連携 [特殊なメソッド] 1 vim.command('echo "hoge"') 2 color_name = vim.eval('g:color_name') vim.command()は引数ので与えられたvimscriptを実行 返り値が欲しい場合はvim.eval()を使用する 13೥6݄2೔೔༵೔

Slide 39

Slide 39 text

sbrowser.py 1 import vim 2 import webbrowser 3 import re 4 def webbrowse(): 5 c_word = vim.eval('expand("")') 8 patt_url = re.compile("((http|https)://[A-Za- z0-9\'~+\-=_.,/%\?!;:@#\*&\(\)]+)") 9 match = patt_url.search(c_word) 10 if match: 11 webbrowser.open(match.group(0)) 12 else: 13 print "url not found" 13೥6݄2೔೔༵೔

Slide 40

Slide 40 text

おわり 13೥6݄2೔೔༵೔