Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はじめてのvimscipt
Search
kazy1991
June 02, 2013
Programming
1
450
はじめてのvimscipt
pythonインターフェースを用いたvimscriptの作り方
kazy1991
June 02, 2013
Tweet
Share
More Decks by kazy1991
See All by kazy1991
基本のAndroid View開発ドキュメント
kazy1991
0
2.7k
Cookpad.apk#1-ReactNativeについて
kazy1991
1
6.4k
いつか使ってみたいOperatorたち
kazy1991
0
490
Cookpad TechKitchen#6-android-with-ml-and-scheduler
kazy1991
0
720
Droidkaigi 2017
kazy1991
5
12k
RxJava Droidkaigi
kazy1991
1
110
rx.pdf
kazy1991
0
140
Other Decks in Programming
See All in Programming
関数型まつりレポート for JuliaTokai #22
antimon2
0
160
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
160
Deep Dive into ~/.claude/projects
hiragram
13
2.5k
すべてのコンテキストを、 ユーザー価値に変える
applism118
3
1.2k
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
4
730
XP, Testing and ninja testing
m_seki
3
240
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
750
AIともっと楽するE2Eテスト
myohei
0
330
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
630
10 Costly Database Performance Mistakes (And How To Fix Them)
andyatkinson
0
230
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
76
25k
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
270
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Site-Speed That Sticks
csswizardry
10
680
Music & Morning Musume
bryan
46
6.6k
The Cult of Friendly URLs
andyhume
79
6.5k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Practical Orchestrator
shlominoach
188
11k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Building Applications with DynamoDB
mza
95
6.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
680
Designing for humans not robots
tammielis
253
25k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
Transcript
はじめての vim plugin 136݄2༵
便利なplugin書きたい vimmerのジレンマ 136݄2༵
便利なplugin書きたい vim_script書くのは辛い vimmerのジレンマ 136݄2༵
136݄2༵
Sublime Text 136݄2༵
pythonでプラグインが書ける Sublime Text 136݄2༵
2つの選択肢 136݄2༵
* 素直にsublimeに移行する 2つの選択肢 136݄2༵
* 素直にsublimeに移行する 2つの選択肢 * もうすこしvimで粘る 136݄2༵
* もうすこしvimで粘る 2つの選択肢 136݄2༵
有名な機能はプラグインで 実装されてるよ 136݄2༵
有名な機能はプラグインで 実装されてるよ * kien/ctrlp.vim * terryma/vim-multiple-cursors 136݄2༵
pythonでvimのプラグイン 書きたいなー? 136݄2༵
\出来るよ!!/ 136݄2༵
なんでpythonで書けるのか VimにはRuby,Python,Perl, SchemeなどのVimScript以外の言語の インタフェースが用意されている. 136݄2༵
必要な環境 pythonインタフェースが使えるvim (Macvim-kaoriya etc..) 136݄2༵
こんなの作ったよ kazy1991/simple-browser.vim カーソル上のurlを開くプラグイン 136݄2༵
デモします 136݄2༵
プラグインの構成 136݄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 136݄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 136݄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 136݄2༵
pythonの有無の確認 1 if !has('python') && !has('python3') 2 echomsg "Error: ...
3 finish 4 endif 起動しているvimがpythonインターフェースを備えているか チェックし,持っていなければ警告を出して終了する 136݄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 136݄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 136݄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 136݄2༵
お約束のテンプレ 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 136݄2༵
それぞれの解説 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 136݄2༵
それぞれの解説 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 136݄2༵
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種類 136݄2༵
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 これが,ベスト・プラクティスな気がする.. 136݄2༵
それぞれの解説 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 136݄2༵
それぞれの解説 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 136݄2༵
vimの関数の定義 [スコープの違い] function! Webbrowse() * グローバルな関数 * 関数名は大文字から始める function! s:webbrowse()
* 現行のスクリプトファイル内でのみ有効 * s:の接頭辞を付け,関数名は小文字から始める * こっちが推奨されてると思う 136݄2༵
キーバインドの設定 function! s:webbrowse() python sbrowser.webbrowse() endfunction command! -nargs=0 SimpleWebBrowse call
s:webbrowse() nnoremap W :<c-u>SimpleWebBrowse<cr> 関数をコマンド化することで, ローカル関数でもキーバインド出来る 136݄2༵
少しだけpython編 136݄2༵
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) # όοϑΝͷߦΛදࣔ 136݄2༵
vimとの連携 [特殊なメソッド] 1 vim.command('echo "hoge"') 2 color_name = vim.eval('g:color_name') vim.command()は引数ので与えられたvimscriptを実行
返り値が欲しい場合はvim.eval()を使用する 136݄2༵
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" 136݄2༵
おわり 136݄2༵