Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてのvimscipt

 はじめてのvimscipt

pythonインターフェースを用いたvimscriptの作り方

kazy1991

June 02, 2013
Tweet

More Decks by kazy1991

Other Decks in Programming

Transcript

  1. プラグインのテンプレ “ 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೔೔༵೔
  2. それぞれの解説 “ 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೔೔༵೔
  3. それぞれの解説 “ 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೔೔༵೔
  4. pythonの有無の確認 1 if !has('python') && !has('python3') 2 echomsg "Error: ...

    3 finish 4 endif 起動しているvimがpythonインターフェースを備えているか チェックし,持っていなければ警告を出して終了する 13೥6݄2೔೔༵೔
  5. それぞれの解説 “ 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೔೔༵೔
  6. それぞれの解説 “ 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೔೔༵೔
  7. それぞれの解説 “ 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೔೔༵೔
  8. お約束のテンプレ 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೔೔༵೔
  9. それぞれの解説 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೔೔༵೔
  10. それぞれの解説 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೔೔༵೔
  11. pythonの呼び出し方法 2 #(1) :python <code> でpythonのワンライナーが書ける 3 :python print "hoge";

    print "piyo" 4 5 #(2) ヒアドキュメントも使える 6 :python <<EOM 7 print "piyo" 8 EOM 9 10 #(3) : pyfile <source> で.pyファイルが呼び出せる 11 :pyfile hoge_piyo.py pythonを呼び出す方法は3種類 13೥6݄2೔೔༵೔
  12. pythonの呼び出し python << PYTHONEOF import vim import sys import os

    sys.path.insert(1, os.path.join(vim.eval('expand("<sfile>:p:h:h")'), 'plugin')) import sbrowser sys.path.pop(1) PYTHONEOF これが,ベスト・プラクティスな気がする.. 13೥6݄2೔೔༵೔
  13. それぞれの解説 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೔೔༵೔
  14. それぞれの解説 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೔೔༵೔
  15. vimの関数の定義 [スコープの違い] function! Webbrowse() * グローバルな関数 * 関数名は大文字から始める function! s:webbrowse()

    * 現行のスクリプトファイル内でのみ有効 * s:の接頭辞を付け,関数名は小文字から始める * こっちが推奨されてると思う 13೥6݄2೔೔༵೔
  16. キーバインドの設定 function! s:webbrowse() python sbrowser.webbrowse() endfunction command! -nargs=0 SimpleWebBrowse call

    s:webbrowse() nnoremap W :<c-u>SimpleWebBrowse<cr> 関数をコマンド化することで, ローカル関数でもキーバインド出来る 13೥6݄2೔೔༵೔
  17. 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೔೔༵೔
  18. sbrowser.py 1 import vim 2 import webbrowser 3 import re

    4 def webbrowse(): 5 c_word = vim.eval('expand("<cWORD>")') 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೔೔༵೔