VimとRubyのアツい関係
rubyjump.vimの開発でわかったこと
2014/5/28
Kawasaki.rb #12
ぺけみさお
● ぺけみさお(xmisao)
● http://www.xmisao.com/
● プログラマ(Java屋さん)
● 趣味のRubyist
● GemのランキングサイトBestGems.orgを作っています
自己紹介
ある日突然
Vimプラグインを
作りたくなりました
rubyjump.vim
Rubyの定義にジャンプするためのプラグイン
GitHubで公開中↓
https://github.com/xmisao/rubyjump.vim
DEMO
Vimプラグインを作るには…
● Vimスクリプト
Vimプラグインを作るには…
● Vimスクリプトだけじゃない!
● 各種インタフェース
○ Ruby
○ Python
○ Lua
○ etc..
→実は色々な言語が利用可能
RubyでVimプラグインが書ける
Rubyインタフェースでできること
● 任意のRubyスクリプトを実行
● RubyからVimの式を評価
● RubyからVimのコマンドを実行
see if_ruby.txt
Rubyインタフェースの
簡単な使い方
Rubyの実行
ruby << EOF
puts "Hello, Ruby!"
puts "Hello, Ruby!"
puts "Hello, Ruby!"
EOF
Vimの式を評価
let a = "foo"
let b = 42
ruby << EOF
p VIM.evaluate('a') #=> "foo"
p VIM.evaluate('b') #=> 42
p VIM.evaluate('get...
Vimのコマンドを実行
ruby << EOF
VIM::command("sp") # ウィンドウを分割
EOF
応用:変数の受け渡し
func! Add(v0, v1)
ruby << EOF
v0 = VIM::evaluate('a:v0')
v1 = VIM::evaluate('a:v1')
VIM::command("let result = ...
● VimスクリプトとRubyが混在し可読性が低い
○ Rubyを外部ファイルに極力分離
● VIM::evaluate / commandの呼び出しが煩雑
○ ラッパの開発が必要か
● Rubyの値をVIMの値に変換する方法がない
○ Arr...
(工夫すれば)
何でもできそうですね!
● rubyjump.vimではripperを使っている
もちろんライブラリも利用可能
ripper
● Rubyプログラムのパーサ
● Ruby 1.9以降の標準添付ライブラリ
→RubyでRubyを扱うことが可能
サンプルコード
require 'ripper'
require 'pp'
src = <<RUBY
puts "Hello, World!"
RUBY
pp Ripper.tokenize(src) # トークンに分割する
pp Ripper...
Ripper.tokanize
["puts", " ", """, "Hello, World!", """, "n"]
Ripper.lex
[[[1, 0], :on_ident, "puts"],
[[1, 4], :on_sp, " "],
[[1, 5], :on_tstring_beg, """],
[[1, 6], :on_tstring_conte...
Ripper.sexp
[:program,
[[:command,
[:@ident, "puts", [1, 0]],
[:args_add_block,
[[:string_literal,
[:string_content, [:@ts...
ちょっと困ったこと
● パターンマッチは自力で実装する必要がある
○ patm / pattern-match 等gemも存在する
● パースできるスクリプトはRubyのバージョンに依存
○ rubyjump.vimでは正規表現を併用して対処
(工夫すれば)
何でもできそうですね!
● rubyjump.vimを作りました
● VimプラグインがRubyで書けるんです
● ripperでRubyスクリプト自体を扱えます
↓
Ruby編集用のVimプラグインが作り放題!
まとめ
参考
● Vimプラグイン RubyJump v0.9.2をリリースした
○ http://www.xmisao.com/2014/05/16/rubyjump-released.html
● VimのRubyインタフェース入門
○ http:...
Upcoming SlideShare
Loading in …5
×

VimとRubyのアツい関係

2,439 views

Published on

Published in: Internet
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,439
On SlideShare
0
From Embeds
0
Number of Embeds
477
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

VimとRubyのアツい関係

  1. 1. VimとRubyのアツい関係 rubyjump.vimの開発でわかったこと 2014/5/28 Kawasaki.rb #12 ぺけみさお
  2. 2. ● ぺけみさお(xmisao) ● http://www.xmisao.com/ ● プログラマ(Java屋さん) ● 趣味のRubyist ● GemのランキングサイトBestGems.orgを作っています 自己紹介
  3. 3. ある日突然 Vimプラグインを 作りたくなりました
  4. 4. rubyjump.vim Rubyの定義にジャンプするためのプラグイン GitHubで公開中↓ https://github.com/xmisao/rubyjump.vim
  5. 5. DEMO
  6. 6. Vimプラグインを作るには… ● Vimスクリプト
  7. 7. Vimプラグインを作るには… ● Vimスクリプトだけじゃない! ● 各種インタフェース ○ Ruby ○ Python ○ Lua ○ etc.. →実は色々な言語が利用可能
  8. 8. RubyでVimプラグインが書ける Rubyインタフェースでできること ● 任意のRubyスクリプトを実行 ● RubyからVimの式を評価 ● RubyからVimのコマンドを実行 see if_ruby.txt
  9. 9. Rubyインタフェースの 簡単な使い方
  10. 10. Rubyの実行 ruby << EOF puts "Hello, Ruby!" puts "Hello, Ruby!" puts "Hello, Ruby!" EOF
  11. 11. Vimの式を評価 let a = "foo" let b = 42 ruby << EOF p VIM.evaluate('a') #=> "foo" p VIM.evaluate('b') #=> 42 p VIM.evaluate('getpos(".")') #=> [0, 43, 1, 0] EOF
  12. 12. Vimのコマンドを実行 ruby << EOF VIM::command("sp") # ウィンドウを分割 EOF
  13. 13. 応用:変数の受け渡し func! Add(v0, v1) ruby << EOF v0 = VIM::evaluate('a:v0') v1 = VIM::evaluate('a:v1') VIM::command("let result = #{v0 + v1}") EOF return result endfunc echo Add(1, 2) “ 3
  14. 14. ● VimスクリプトとRubyが混在し可読性が低い ○ Rubyを外部ファイルに極力分離 ● VIM::evaluate / commandの呼び出しが煩雑 ○ ラッパの開発が必要か ● Rubyの値をVIMの値に変換する方法がない ○ ArrayやHashを拡張するのが良いかも ちょっと困ったこと
  15. 15. (工夫すれば) 何でもできそうですね!
  16. 16. ● rubyjump.vimではripperを使っている もちろんライブラリも利用可能
  17. 17. ripper ● Rubyプログラムのパーサ ● Ruby 1.9以降の標準添付ライブラリ →RubyでRubyを扱うことが可能
  18. 18. サンプルコード require 'ripper' require 'pp' src = <<RUBY puts "Hello, World!" RUBY pp Ripper.tokenize(src) # トークンに分割する pp Ripper.lex(src) # 種類と位置情報付きでトークンに分割する pp Ripper.sexp(src) # S式のツリーを取得する
  19. 19. Ripper.tokanize ["puts", " ", """, "Hello, World!", """, "n"]
  20. 20. Ripper.lex [[[1, 0], :on_ident, "puts"], [[1, 4], :on_sp, " "], [[1, 5], :on_tstring_beg, """], [[1, 6], :on_tstring_content, "Hello, World!"], [[1, 19], :on_tstring_end, """], [[1, 20], :on_nl, "n"]]
  21. 21. Ripper.sexp [:program, [[:command, [:@ident, "puts", [1, 0]], [:args_add_block, [[:string_literal, [:string_content, [:@tstring_content, "Hello, World!", [1, 6]]]]], false]]]]
  22. 22. ちょっと困ったこと ● パターンマッチは自力で実装する必要がある ○ patm / pattern-match 等gemも存在する ● パースできるスクリプトはRubyのバージョンに依存 ○ rubyjump.vimでは正規表現を併用して対処
  23. 23. (工夫すれば) 何でもできそうですね!
  24. 24. ● rubyjump.vimを作りました ● VimプラグインがRubyで書けるんです ● ripperでRubyスクリプト自体を扱えます ↓ Ruby編集用のVimプラグインが作り放題! まとめ
  25. 25. 参考 ● Vimプラグイン RubyJump v0.9.2をリリースした ○ http://www.xmisao.com/2014/05/16/rubyjump-released.html ● VimのRubyインタフェース入門 ○ http://www.xmisao.com/2014/05/13/vim-ruby-interface.html ● Rubyの標準添付ライブラリripperでRubyのソースをパースする ○ http://www.xmisao.com/2014/05/12/ruby-ripper.html ● Rubyのバージョンとripperの関係 ○ http://www.xmisao.com/2014/05/16/study-of-ruby-ripper.htm

×