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
480
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
ts-morph実践:型を利用するcodemodのテクニック
ypresto
1
520
REST API設計の実践 – ベストプラクティスとその落とし穴
kentaroutakeda
2
310
OpenTelemetryで始めるベンダーフリーなobservability / Vendor-free observability starting with OpenTelemetry
seike460
PRO
0
160
型付け力を強化するための Hoogle のすゝめ / Boosting Your Type Mastery with Hoogle
guvalif
1
220
List Unfolding - 'unfold' as the Computational Dual of 'fold', and how 'unfold' relates to 'iterate'"
philipschwarz
PRO
0
110
OpenNext + Hono on Cloudflare でイマドキWeb開発スタックを実現する
rokuosan
0
110
Building an Application with TDD, DDD and Hexagonal Architecture - Isn't it a bit too much?
mufrid
0
370
iOSアプリ開発もLLMで自動運転する
hiragram
6
2.1k
Efficiency and Rock 'n’ Roll (Really!)
hollycummins
0
590
漸進。
ssssota
0
510
がんばりすぎないコーディングルール運用術
tsukakei
1
170
AIコーディングの本質は“コード“ではなく“構造“だった / The essence of AI coding is not “code” but "structure
seike460
PRO
2
710
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
For a Future-Friendly Web
brad_frost
178
9.7k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Visualization
eitanlees
146
16k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
GraphQLとの向き合い方2022年版
quramy
46
14k
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༵