はじめてのvimscipt

 はじめてのvimscipt

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

11f1c6f9a26793f33d93eed3a97f4a6c?s=128

kazy1991

June 02, 2013
Tweet

Transcript

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

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

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

  4. 13೥6݄2೔೔༵೔

  5. Sublime Text 13೥6݄2೔೔༵೔

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    3 finish 4 endif 起動しているvimがpythonインターフェースを備えているか チェックし,持っていなければ警告を出して終了する 13೥6݄2೔೔༵೔
  24. それぞれの解説 “ 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೔೔༵೔
  25. それぞれの解説 “ 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೔೔༵೔
  26. それぞれの解説 “ 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೔೔༵೔
  27. お約束のテンプレ 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೔೔༵೔
  28. それぞれの解説 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೔೔༵೔
  29. それぞれの解説 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೔೔༵೔
  30. 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೔೔༵೔
  31. 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೔೔༵೔
  32. それぞれの解説 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೔೔༵೔
  33. それぞれの解説 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೔೔༵೔
  34. vimの関数の定義 [スコープの違い] function! Webbrowse() * グローバルな関数 * 関数名は大文字から始める function! s:webbrowse()

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

    s:webbrowse() nnoremap W :<c-u>SimpleWebBrowse<cr> 関数をコマンド化することで, ローカル関数でもキーバインド出来る 13೥6݄2೔೔༵೔
  36. 少しだけpython編 13೥6݄2೔೔༵೔

  37. 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೔೔༵೔
  38. vimとの連携 [特殊なメソッド] 1 vim.command('echo "hoge"') 2 color_name = vim.eval('g:color_name') vim.command()は引数ので与えられたvimscriptを実行

    返り値が欲しい場合はvim.eval()を使用する 13೥6݄2೔೔༵೔
  39. 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೔೔༵೔
  40. おわり 13೥6݄2೔೔༵೔