SlideShare a Scribd company logo
1 of 25
Download to read offline
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('getpos(".")') #=> [0, 43, 1, 0]
EOF
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 = #{v0 + v1}")
EOF
return result
endfunc
echo Add(1, 2) “ 3
● VimスクリプトとRubyが混在し可読性が低い
○ Rubyを外部ファイルに極力分離
● VIM::evaluate / commandの呼び出しが煩雑
○ ラッパの開発が必要か
● Rubyの値をVIMの値に変換する方法がない
○ ArrayやHashを拡張するのが良いかも
ちょっと困ったこと
(工夫すれば)
何でもできそうですね!
● 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.lex(src) # 種類と位置情報付きでトークンに分割する
pp Ripper.sexp(src) # S式のツリーを取得する
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_content, "Hello,
World!"],
[[1, 19], :on_tstring_end, """],
[[1, 20], :on_nl, "n"]]
Ripper.sexp
[:program,
[[:command,
[:@ident, "puts", [1, 0]],
[:args_add_block,
[[:string_literal,
[:string_content, [:@tstring_content, "Hello,
World!", [1, 6]]]]],
false]]]]
ちょっと困ったこと
● パターンマッチは自力で実装する必要がある
○ 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://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

More Related Content

What's hot

Unite vim
Unite vim Unite vim
Unite vim Shougo
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜Shougo
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacsShougo
 
modern X86 environment
modern X86 environmentmodern X86 environment
modern X86 environmentShougo
 
Vim = VM
Vim = VMVim = VM
Vim = VMShougo
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)deris0126
 
すごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりすごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりcohama
 
個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編Koichi Shiraishi
 
暗黒美夢王とEmacs
暗黒美夢王とEmacs暗黒美夢王とEmacs
暗黒美夢王とEmacsShougo
 
Rubyで.netを扱う
Rubyで.netを扱うRubyで.netを扱う
Rubyで.netを扱う107steps
 
PHP懇親会
PHP懇親会PHP懇親会
PHP懇親会kaz_29
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口Sunao Tomita
 
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有zaru sakuraba
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
 
ゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツYusuke Ando
 
Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識alwei
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacGosuke Miyashita
 
mrubyで作るマイコンボード
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボードkishima7
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ107steps
 

What's hot (20)

Unite vim
Unite vim Unite vim
Unite vim
 
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜我が evil-mode を嫌いな理由 〜evil-mode の闇〜
我が evil-mode を嫌いな理由 〜evil-mode の闇〜
 
Vimから見たemacs
Vimから見たemacsVimから見たemacs
Vimから見たemacs
 
modern X86 environment
modern X86 environmentmodern X86 environment
modern X86 environment
 
Vim = VM
Vim = VMVim = VM
Vim = VM
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
 
すごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりすごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつり
 
個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編個人で作っているgoのプロダクト by zchee編
個人で作っているgoのプロダクト by zchee編
 
暗黒美夢王とEmacs
暗黒美夢王とEmacs暗黒美夢王とEmacs
暗黒美夢王とEmacs
 
Rubyで.netを扱う
Rubyで.netを扱うRubyで.netを扱う
Rubyで.netを扱う
 
PHP懇親会
PHP懇親会PHP懇親会
PHP懇親会
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口
 
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
WebAssembly と Rust の入口の向かいにある道路のベンチに腰掛けるレベルのさわってみた感想を共有
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
ゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツ
 
Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識Vimを学びたい初心者のための5つの豆知識
Vimを学びたい初心者のための5つの豆知識
 
Maglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayacMaglica - A Simple Internal Cloud Tool at #techkayac
Maglica - A Simple Internal Cloud Tool at #techkayac
 
Vimとgo
VimとgoVimとgo
Vimとgo
 
mrubyで作るマイコンボード
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボード
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ
 

Similar to VimとRubyのアツい関係

emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRubymametter
 
Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料Shohei Kobayashi
 
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)Yoko TAMADA
 
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて   第16回 岡山ruby, ruby on rails勉強会Mrubyについて   第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会Masaya Konishi
 
20170823 rmiを使ってみた
20170823 rmiを使ってみた20170823 rmiを使ってみた
20170823 rmiを使ってみたDaniel Sun
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見るkishima7
 
Yokohama.vim
Yokohama.vimYokohama.vim
Yokohama.vimgu4
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』についてRyosuke MATSUMOTO
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1Takuya Mukohira
 
Rubyをちょっと理解しよう
Rubyをちょっと理解しようRubyをちょっと理解しよう
Rubyをちょっと理解しようShun Hikita
 

Similar to VimとRubyのアツい関係 (12)

emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRuby
 
Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料Ruby on vim yokohama.vim発表資料
Ruby on vim yokohama.vim発表資料
 
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)
Middlemanで個人ページを作っている話(2014/8/23 社内勉強会LT)
 
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて   第16回 岡山ruby, ruby on rails勉強会Mrubyについて   第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
 
20170823 rmiを使ってみた
20170823 rmiを使ってみた20170823 rmiを使ってみた
20170823 rmiを使ってみた
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
 
Yokohama.vim
Yokohama.vimYokohama.vim
Yokohama.vim
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
 
Tdd vim
Tdd vimTdd vim
Tdd vim
 
Mbed2013
Mbed2013Mbed2013
Mbed2013
 
Rubyをちょっと理解しよう
Rubyをちょっと理解しようRubyをちょっと理解しよう
Rubyをちょっと理解しよう
 

More from Misao X

BestGems.org 2018年の進化
BestGems.org 2018年の進化BestGems.org 2018年の進化
BestGems.org 2018年の進化Misao X
 
Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Misao X
 
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くRubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くMisao X
 
極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044Misao X
 
Native Extensionのビルドどうしてますか?
Native Extensionのビルドどうしてますか?Native Extensionのビルドどうしてますか?
Native Extensionのビルドどうしてますか?Misao X
 
しょぼいカレンダーからアニメデータベースを作る
しょぼいカレンダーからアニメデータベースを作るしょぼいカレンダーからアニメデータベースを作る
しょぼいカレンダーからアニメデータベースを作るMisao X
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-Misao X
 

More from Misao X (7)

BestGems.org 2018年の進化
BestGems.org 2018年の進化BestGems.org 2018年の進化
BestGems.org 2018年の進化
 
Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話Rubyからg rpcでdocker化したkuromojiを使った話
Rubyからg rpcでdocker化したkuromojiを使った話
 
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くRubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
 
極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044
 
Native Extensionのビルドどうしてますか?
Native Extensionのビルドどうしてますか?Native Extensionのビルドどうしてますか?
Native Extensionのビルドどうしてますか?
 
しょぼいカレンダーからアニメデータベースを作る
しょぼいカレンダーからアニメデータベースを作るしょぼいカレンダーからアニメデータベースを作る
しょぼいカレンダーからアニメデータベースを作る
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-
 

Recently uploaded

あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]Taka Narita
 
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元ivanwang53
 
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ivanwang53
 
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンWindowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンivanwang53
 
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxWindows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxivanwang53
 
動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Componentsokitamasashi
 

Recently uploaded (6)

あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
あらゆる通信環境で切れない「ネットモーション」のモバイルアクセス [NetMotion]
 
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
Windows 10、Windows 11の付箋を簡単に復元する6つの方法|データ復元
 
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
ダウンロードがダウンロード(Downloads)フォルダに表示されない」問題の対処法
 
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーンWindowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
Windowsアップデート後の黒い画面を修正する方法|データ復元|ブラックスクリーン
 
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docxWindows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
Windows Defenderのフル・クイック・カスタム・オフラインスキャンを実行する方法.docx
 
動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components動的 & 非同期コンポーネント / Dynamic & Async Components
動的 & 非同期コンポーネント / Dynamic & Async Components
 

VimとRubyのアツい関係