September 02, 2006
rails.vimのいい加減な翻訳 12:51
- Permalink
- Comments (1867)
- Trackbacks (3)
Rails, vim
バイト先でTextMate触ってみて、Ruby, Railsに特化しててショートカットとかいろいろ便利だなぁと思いつつも、カーソルの移動とか基本的な編集のところで発狂しそうになるので、vimをTextMate並にRailsフレンドリーにするしかないと思った。
てことで、前にインストールしたもののシンタックスハイライトしか使っていなかったrails.vimを本格的に使うため、ヘルプをものすごい勢いで訳した。 自分用なのでかなりいい加減な文で、しかもTOEIC400点台なのでクソな訳が混じってます。それから、なんちゃってvimerなので全然理解していないところも多々。 でもまあせっかくなので公開しておきます。 いろんな直しは後でやる。 それにしてもひどい訳だ……。ハズカシス(つД`)
イントロダクション
TextMateはRuby on Railsアプリケーションの開発にとって最新の流行かもしれないが、 Vimはいつも流行っている。このプラグインは、Ruby on Railsの開発に以下の特徴を提供する。
- Railsアプリケーションのファイルを含むバッファを自動的に発見し、それらのバッファ(のみ)に設定を適用する。その上、あなたは自分自身の設定を適用するためにautocommandを使うことが出来る。
- わずらわしくない。Railsアプリケーションのファイルにだけ影響し、一般的なRubyスクリプトには手を付けないままだ。プラグインが有効になっているときでさえ、プラグインはもしその特徴をあなたが使っていないならば、あなたのやり方に干渉しない。(もしそうではない状況を見付けたら、rails-plugin-authorにコンタクトを)
- Railsアプリケーションで仕事をするための妥当な設定を提供する。Rakeは'makeprg'(そしてそれはいつもあなたのRakefileがどこにあるのかを知っている)、'shiftwidth'は2、そして'path'はあなたのアプリケーションのディレクトリの適切なコレクションを含んでいる。
- Railsのディレクトリ構造への簡単なナビゲーション。gfは文脈を考慮し、partial, fixtureなど多くについて知っている。ファイル間の簡単なジャンプとして:A(alternate)と:R(relate)という2つのコマンドがあり、このジャンプにはモデルとマイグレーション、テンプレートとヘルパー、コントローラと機能テストのような近いものを含む。より発展的な使い方は、:Rmodel, :Rview, :Rcontrollerと、いくつかほかのコマンドが提供されている。
- 拡張された文法ハイライト。has_and_belongs_to_manyからdistance_of_time_in_wordsまでがここにある。Vim 7のユーザには、'completefunc'がi_CTRL-X_CTRL-Uでのsyntax based completionが使えるようになる。これは長いメソッド名のようなものを入力するのを容易にする。
- script/*へのインタフェース。一般的に、script/aboutを呼び出すために":Rscript about"を使う。多くのコマンドは追加的な特徴と一緒にラッパーを持っている。":Rgenerate controller Blog"はblogコントローラを生成し、app/controllers/blog_controller.rbを編集する。
- 部分的な抽出。:Rpartisal {file}は、望んだ範囲(理想的には、ビジュアルラインモードで選択されている)をrender :partial => '{file}'で置き換える。これは、自動的にあなたの内容と一緒に作成される。@{file}インスタンス変数は、{file}ローカル変数によって置き換えられる。
- ほかのプラグインとの統合。:Rprojectは新しいproject.vimプロジェクトを作成する。:Rdbextはdbext.vimのためにdatabase.ymlからデータベースの設定をロードする(そしてデフォルトでは多くの状況でこれが起こる)。Creamのユーザはいくつかの追加的なマッピングを得られ、すべてのGUIユーザはメニューを得る。
インストールと使い方
もしzipファイルを持っているなら、それをvimfiles(Windows)か~/.vim(その他)に取り出す。 すると、あなたは以下のファイルを持っているはずだ。
plugin/rails.vim doc/rails.txt
ドキュメンテーションを可能にするに当たって、説明書としてadd-local-helpを見よ。 nutshellでは、
:helptags ~/.vim/doc
あなたがRailsアプリケーションのファイルを編集したいときはいつでも、このプラグインは 自動的に有効になる。これはさまざまなオプションをセットし、いくつかのバッファ特有の コマンドを定義する。
もしあなたが始めようと急いでいるなら、最小限の量として、このファイルの見出しとコマンド をスキミングして何が提供されているか良いアイデアを得ることを勧める。もし1つだけ読むなら、 それはナビゲーションのセクションであることを確認せよ。
一般的なコマンド
別の方法で宣言されていなければ、すべてのコマンドはバッファローカルである。これは、あなたがRailsアプリケーションのファイルを実際に編集しなければならないことを意味する。
- :Rails {directory}
-
グローバルだけのコマンド。{directory}に新しいRailsアプリケーションを作成し、READMEをロードする。
- :Rake {target}
-
('makeprg'がrakeの状態で):make {target}を呼んだ場合と同じ。しかしながら、いくつかの文脈では、 もし{target}が省略された場合、:Rakeは何か賢明なことを採用する(マイグレーションでのdb:migrateや、現在のテストのような)。
- :Rcd [{directory}]
-
/path/to/railsapp/{directory}へ:cdする。
- :Rlcd [{directory}]
-
/path/to/railsapp/{directory}へ:lcdする。
- :Rdoc
-
Rails APIをブラウズする。APIは現在のRailsアプリケーションのdoc/apiか、 もし動いているならgem_serverか、http://api.rubyonrails.org/のどれかである。 :OpenURLが定義されている必要がある(:OpenURLを見よ)
- :Rdoc!
-
適切な:helptagsを呼び、:help railsを実行する。
- :Redit {file}
-
{file}を編集する。アプリケーションルートからの相対パス。
- :Rlog [{logfile}]
-
ウィンドウを分割し、{logfile}($RAILS_ENVか、デフォルトではdevelopment)をオープンする。 ハイライトのために使われている制御文字は削除される。 もし:Tailコマンド(これはtailminusf.vimにより提供される)を持っているなら、それが使われる。 そうでないなら、ファイルは変更されてもリロードされない。 Vimに変更をチェックさせるよう指示するにはchecktimeを使う。 Gはファイルの最後にジャンプすることより優先してそれをするようにマップされていて、 qはウィンドウを閉じることにマップされている。 もしロードの遅延が長すぎるなら、:Rake log:clearをするのがいいかもしれない。
- :Rinvert
-
マイグレーションの中でだけ有効な実験的なコマンド。self.upメソッドをself.downメソッドに書き直す。 もしself.upが空なら、その処理は逆になる。より複雑な命令では苦しいが、create_table、add_column、などのような 単純な呼び出しにはかなりうまくいく。
- :Rpreview [{path}]
-
http://localhost:3000/と与えられた{path}からURLを作成する。もし{path}が省略されると、 賢明なデフォルトが使われる(現在のコントローラ、テンプレートを考慮するが、ルーティングには配慮しない)。 そんなに便利ではないデフォルトは、netrwにそれをダウンロードすることを許しながらvim自身を使ってこのURLを編集する。 より便利なのは、:OpenURLコマンドを定義することだ。これを代わりに使うことができる。(:OpenURLを見よ)
- :Rpreview! [{path}]
-
:Rpreviewと同じである。:OpenURLが使われないことをのぞいては。
- :Rtags
-
現在のアプリケーションルートでctags -Rを呼ぶ。ctagsがインストールされている必要がある。
- :OpenURL {url}
-
これはプラグインによって提供されたコマンドではなくむしろユーザによって提供され、 ほかのプラグインの特徴によって利用される。このコマンドは、提供された{url}をwebブラウザで開くよう 定義されているべきだ。Macでのコマンドの例をあげる。
:command -bar -nargs=1 OpenURL :!open <args>
Windowsで動かすためには以下のようにする。
:command -bar -nargs=1 OpenURL :!start cmd /cstart /b <args>
Debian系のディストリビューションでは、以下が好まれる方法だ。
:command -bar -nargs=1 OpenURL :!sensible-browser <args>
もしhas("mac_gui")、has("wind32_gui")、またはexecutable("sensible-browser")がtrueならば、 上の関連するコマンドは自動的に定義される。 そうでないなら、あなたはあなた自身で提供しなければならない(とにかくこれは推奨)。
ナビゲーション
ナビゲーションはこのプラグインの本当の力が発揮される所だ。 以下の特徴の効果的な使用は、Railsのファイル構造を渡り歩くのを大いに簡単にする。
'path'は全てのベストな場所を含むよう更新されている。
:find blog_controller :find book_test
gfコマンドは普通カーソルの下にあるファイルを編集するものであるが、 文脈を考慮するようにマップしなおされている。 CTRL-W_f(新しいウィンドウを開く)とCTRL-W_gf(新しいタブで開く)もまたマップしなおされている。
gfの使用例と、それらが何を開くか。(*はカーソルのポジションを表す)
Pos*t.find(:first) app/models/post.rb has_many :c*omments app/models/comment.rb link_to "Home", :controller => :bl*og app/controllers/blog_controller.rb <%= render :partial => 'sh*ared/sidebar' %> app/views/shared/_sidebar.rhtml <%= stylesheet_link_tag :scaf*fold %> public/stylesheets/scaffold.css class BlogController < Applica*tionController app/controllers/application.rb class ApplicationController < ActionCont*roller::Base .../action_controller/base.rb fixtures :pos*ts test/fixtures/posts.yml layout :pri*nt app/views/layouts/print.rhtml (In the Blog controller) def li*st app/views/blog/list.rhtml
2つのコマンド:Aと:Rが、以下に定義した「もうひとつ」と「関連する」ファイルへの素早い ジャンプに使われる。
- :A, :AE, :AS, :AV, :AT
-
これらのコマンドはMichael Sharpeのa.vimを真似るために選ばれた。 簡単に言うと、それらは同じウィンドウ(:A, :AE)、新しいスプリットウィンドウ(:AS)、新しい 垂直スプリットウィンドウ(:AV)、または新しいタブ(:AT)で「もうひとつの」ファイルを編集する。 :Aへの実験的なマッピングは[fである。
- :R, :RE, :RS, :RV, :RT
-
これらは上にあげた:Aとその仲間と同様であるが、「もうひとつの」ファイルよりも「関連する」ファイルへ ジャンプする。:Rへの実験的なマッピングは]fである。
「もうひとつの」ファイルとは、例外はあるがもっともよくあるのはテストファイルである。 「関連する」ファイルは異なり、ファイル中の現在の位置に時々依存する。 例えば、コントローラを編集しているとき、「関連する」ファイルとは現在編集している メソッドのテンプレートである。
これらのコマンドを学習するもっとも簡単な方法は体験することだ。 以下は「もうひとつの」ファイルと「関連する」ファイルのいくつかの例である。
| 現在のファイル | 「もうひとつの」ファイル | 「関連する」ファイル |
|---|---|---|
| モデル | ユニットテスト | 関連するマイグレーション |
| コントローラ(のメソッドの中) | 機能テスト | テンプレート(ビュー) |
| テンプレート(ビュー) | ヘルパー | コントローラ(メソッドに飛ぶ) |
| マイグレーション | 前のマイグレーション | 次のマイグレーション |
| config/routes.rb | config/database.yml | config/environment.rb |
「もうひとつの」ファイル、「関連する」ファイル、カーソルの下のファイル のためのさらなる考えられた文脈の提案は歓迎だ。 それらはリリースからリリースへ巧妙に手を加えられる。
もっと一般的でないケースでは、より意図的なコマンドが提供されている。 以下のそれぞれは、オプションの引数(tabで補完)をとるが、Railsの慣習に従う 納得のいく推測がデフォルトになる。例えば、app/models/employee.rbを編集しているときは、 :Rcontrollerはデフォルトでapp/controller/employees_controller.rbになるだろう。 コントローラとモデルのオプションは、理想的にはrails-modelinesからのセットであるが、 modelに関連するファイルから、コントローラに関連するファイル(Rset controller=hiringや 逆(Rset model=employee)へのマッピングにオーバーライドすることができる。 :Rsetを見よ。
::Rmodel, :Rview, :Rcontroller, :Rmigration, :Robserver, :Rlayout, :Rhelper, :Rapi, :Rfixtures, :Runittest, :Rfunctionaltest, :Rintegrationtest
これらのコマンドのそれぞれは、スプリット、垂直スプリット、新しいタブで開く、への変形を持っている。:Rmodelには、それらの変形は:RSmodel, :RVmodel, :RTmodelとなる。また:Rmodelの同義として:REmodelもある。(将来のバージョンでは:Rmodelのふるまいのカスタマイズが出来るかもしれない)
最後に、上の全てとの結合で便利となる、あるVimの特徴CTRL-^がある。 このキーストロークは、前のファイルを編集し、上のコマンドのどれかから戻るのに助けになる。
スクリプトラッパー
以下のコマンドは、Railsアプリケーションのスクリプト・ディレクトリの中のスクリプト周りのラッパーである。 ほとんどはスクリプトを呼ぶことを越えた特徴を余分に持っている。 限定されているがtabでの補完もサポートされている。
- :Rscript {script} {options}
-
ruby script/{script} {options}を呼ぶ。
- :Rbreakpointer {options}, :Rconsole {options}
-
適切なスクリプトを呼ぶ。Windowsでは、これらは!startでバックグラウンドで実行される。 ターミナルでは、もしGNU Screenが動いていてg:rails_gnu_screenがセットされているなら、 それが使われる。
- :Rrunner {code}
-
script/runnerで{code}を実行する。codeがひとつの引数として渡される:Rscript runner {code}とは 異なっている。また、system()が:!の代わりに使われる。これはいまいましい"Press ENTER"プロンプト を取り除くのを助ける。
- :Rp {code}
-
:Rrunnerと似ているが、結果でRubyのpメソッドを呼ぶ。文字どおり"begin p {code} end"。
- :Rgenerate {options}
-
script/generate {options}を呼び、生成された初めのファイルを編集する。 g:rails_subversionに関係する。
- :Rdestroy {options}
-
script/destroy {options}を呼ぶ。g:rails_subversionに関係する。
- :Rplugin {options}
-
script/plugin {options}を呼ぶ。g:rails_subversionに関係する。
- :Rserver {options}
-
script/server {options}をバックグランドで起動する。Win32では、これは!startを意味する。 ほかのシステムでは、これは--daemonオプションを使う。
- :Rserver! {options}
-
:Rserverと同じであるが、まず同じポートを使っている他のサーバをkillすることを試みる。 Windowsではないシステムでは、これをするためにlsofがインストールされていなければならない。
部分抽出
:Rpartialコマンドは新しいファイルにpartialを抽出するために使うことができる。
- :[range]Rpartial [{controller}/]{name}
-
{name}パーシャルを[range]の行から作成する。(デフォルトは現在のライン)
もしあなたのファイルのapp/views/blogs/show.rhtmlがこれだとすると、
1 <div> 2 <h2><%= @post.title %></h2> 3 <p><%= @post.body %></p> 4 </div>
あなたはこのコマンドを実行する。
:2,3Rpartial post
あなたのファイルはこのように変わるだろう。
1 <div> 2 <%= render :partial => 'post' %> 3 </div>
そしてapp/views/blog/_post.rhtmlが今これを含んでいるだろう。
1 <h2><%= post.title %></h2> 2 <p><%= post.body %></p>
特別なケースとして、もしファイルがこのように見えたら、
1 <% for object in @posts -%> 2 <h2><%= object.title %></h2> 3 <p><%= object.body %></p> 4 <% end -%>
結果はこのようになる。
1 <%= render :partial => 'post', :collection => @posts %>
抽出するものを選択するもっとも簡単な方法は、linewise-visualモードを使うことだ。 単純に
:'<,'>Rpartial blog/post
で足りるだろう。(この例のコントローラ名の使い方に注意)
プラグインの統合
- :Rproject [{file}]
-
このコマンドは、projectプラグインがインストールされているときにだけ提供される。 :Project(普通引数なし)を呼び、現在のRailsアプリケーションのルートを探す。 もし見付からなかったら、適切なディレクトリ(appなど。vendorは含まない)と一緒に 新しいプロジェクトを作成する。
- :Rproject! [{file}]
-
:Rprojectと同じであるが、もしプロジェクトが存在するならそれを削除し、作りなおす。 古いプロジェクトを削除するロジックは絡み合っていて、多分間違いがある。rails-plugin-authorに どんな問題も報告してほしい。便利なマッピングは以下のようになるだろう。
autocmd User Rails* map <buffer> <F6> :Rproject!|silent w<CR>
特別に、このコマンドは簡単なナビゲーションのためにビューをわかれたディレクトリに組織化する。 このマイナス面は、あなたがもうひとつのディレクトリを追加するときは毎回プロジェクトを 再生成しなければならないだろうことだ。(これがこのコマンドがプロジェクトを毎回 作りなおす理由だ!)
- :Rdbext [{environment}]
-
このコマンドはdbextプラグインがインストールされている時だけ提供される。 {environment}の設定(デフォルトでは$RAILS_ENVかdevelopment)をconfig/database.ymlから 読み、dbextを設定するためにそれを使う。設定は異なるRailsアプリケーションが編集されるまで キャッシュされる。このコマンドは、g:rails_dbextがセットされているとき(Windowsでないシステムではデフォルトでon) あなたのために自動的に呼ばれる。
- :Rdbext! [{environment}]
-
上のようにデータベースの設定を読み込み、それからそのためのCREATE DATABASEを試みる。 これはおもにデモンストレーションに便利である。
このプラグインは、もしCream(Vimをバックエンドとして使うユーザフレンドリーなエディタ)で 動いているならいくつかの追加的なキーバインドを提供する。 Ctrl+Enterはカーソルの下のファイルを探し(railsのgfのように)、Alt+[とAlt+]は 「もうひとつの」ファイルと「関連する」ファイルを探す。GUIのメニューもあり、 これはCreamとGVim両方から利用できる。
ABBREVIATION
abbreviationはまだ実験段階である。それらはあとで他のプラグインにわけられるか、完全に削除されるだろう。
- :Rabbrev
-
Railsのすべてのabbreviationをリスト化する。
- :Rabbrev {abbr} {expn} [{extra}]
-
新しいRailsのabbreviationを定義する。{extra}は、{expn}が"("でで終わっているときに限り許される。
- :Rabbrev! {abbr}
-
abbreviationを削除する。
Railsのabbreviationは、C-](i_CTRL-]を見よ)かTabの後でだけ展開される点で普通のabbreviationとは異なっている (もしTabでうまく動かないなら、他のプラグインによってマッピングされているのだろう)。 もしabbreviationがある句読点で終わるなら、追加的な拡張が実行できる。 いくつかの例が望むらくはこれを解決するだろう。 (以下のすべては、適切なファイルタイプにおいてデフォルトで有効になっている)
| Command | Sequence typed | Resulting text |
|---|---|---|
| Rabbrev rp( render :partial\ => | rp( | render(:partial => |
| Rabbrev rp( render :partial\ => | rp<Tab> | render :partial => |
| Rabbrev vs( validates_size_of | vs( | validates_size_of( |
| Rabbrev pa[ params | pa[:id] | params[:id] |
| Rabbrev pa[ params | pa<C-]> | params |
| Rabbrev pa[ params | pa.inspect | params.inspect |
| Rabbrev AR:: ActionRecord | AR::Base | ActiveRecord::Base |
| Rabbrev :a :action\ =>\ | render :a<Tab> | render :action => |
端的に言えば、::は:で展開され、(は(で、[は.と[のとき展開される。 これらのひきずる句読点は、最終的なabbreviationの部分ではなく、 句読点についてだけ異なっている2つのマッピングをもつことはできない。
あなたはあなたの展開の中でスペースを"\ "または<Space>としてエスケープしなければならない。 (で終わるabbreviationにとって、あなたは展開を(エスケープされないスペースで分割された)2つの部分に 分割することによって括弧をどこに挿入するべきかを定義するかもしれない。
多くのabbreviationはデフォルトで提供されている。それらを一覧するためには:Rabbrevを使う。 それはらファイルのタイプに依存して変わる(モデルはコントローラとは異なるabbreviationを持つ)。 ある賢いabbreviationがある。:cがそれで、文脈に応じて":controller => "か":conditions => "に展開される。
設定
とても少ない設定が実際に必要とされている。このプラグインは自動的にあなたのRailsアプリケーションを 探し、Vimを調節する。
もしあなたがあなた自身でカスタマイズしたVimの設定をRailsのファイルがロードされたときにいつも セットしたいなら、vimrcで以下のようにautocommandを使うことが出来る。
autocmd User Rails* silent! Rlcd autocmd User Rails* map <buffer> <F9> :Rake<CR>
あなたはあるタイプのファイルにだけ適用されるautocommandを持つことも出来る。 これらはstatusline(statuslineの項目を見よ)でピリオドに変わったハイフンと一緒に 表示されている情報に基づいている。いくつかの例。
autocmd User Rails.controller* iabbr <buffer> wsn wsdl_service_name autocmd User Rails.model.arb* iabbr <buffer> vfo validates_format_of autocmd User Rails.view*rhtml* imap <buffer> <C-Z> <%= %><C-O>3h
すべてのRailsのautocommandは、たとえあなたが正確な仕様を持っていてもアスタリスクで終わる。 ファイル名にマッチするシンタックスもある。
autocmd User Rails*/db/schema.rb Rset task=db:schema:dump
以下の冗長な例のように2つの形を結合することもできる。
autocmd User Rails.helper*/app/helpers/*_helper.rb ...
可能ならファイルタイプに基づいたシンタックスを使い、より発展的なケースのためにファイル名に基づいた シンタックスはとっておくこと。
もしあなたがはっきりとしたプロジェクトに特化した設定を持っているなら、 それらはアプリケーションのルートディレクトリの中にconfig/rails.vimファイルとして 置くことが出来る。 そのファイルは、セキュリティ上の理由でsandboxに供給されている。これはVim7かそれ以上で動く。
- :Rset {option}[={value}]
-
ローカルオプションを問い合わせる、またはセットする。このコマンドはautocommandかconfig/rails.vimから 直接呼ばれるかもしれない。
オプションは4つのスコープのひとつでセットされるだろう。これはオプションのプレフィックスによって 識別される。これらのスコープは、どのくらい広くオプションが適用されるかを決定する。 一般に、デフォルトのスコープで十分である。
| Scope | Description |
|---|---|
| a: | Railsアプリケーションのすべてのファイル |
| b: | 特定のバッファ |
| g: | すべてのアプリケーションに対してグローバル |
| l: | メソッドに対してローカル(Rubyでないファイルでの:bと同じ) |
オプションはそれらのデフォルトスコープと一緒に以下に示した。デフォルトスコープは省略できる。 あなたはプレフィックスでスコープをオーバーライドするかもしれないが、 これはほとんど必要にならず、しばしば無用である。 (例えば、g:taskを設定することは、rakeタスクがデフォルトでこのオプションを考慮する前に 適用されるだろうから無用である。
| Option | Meaning |
|---|---|
| b:alternate | :Aのための「もうひとつの」ファイルのカスタム。Railsルートからの相対 |
| b:controller | あるコマンド(:Rhelperとか)のためのデフォルトのコントローラ |
| b:model | あるコマンド(:Rfixturesとか)のためのデフォルトのモデル |
| l:preview | :RpreviewのためのURLスタブ(例えばblog/show/1) |
| b:task | :Rakeと一緒に使われるデフォルトのタスク |
| l:related | :Rのための「関連する」ファイルのカスタム。Railsルートからの相対 |
| a:root_url | :RpreviewのようなコマンドのためのルートURL |
例。
:Rset root_url=http://localhost:12345 :Rset related=app/views/blog/edit.rhtml preview=blog/edit/1 :Rset alternate=app/models/ :Rset l:task=preview " Special pseudo-task for :Rake
最後の例のスコープのプレフィックスの使用に注意。
もしg:rails_modelinesが有効なら、これらのオプションはファイルの初めか終わりの近くで modelinesからセットさせることも出来る。 これらのmodelinesはいつもバッファローカルのオプションをセットする。スコープは決して指定されない。 例。
# Rset task=db:schema:load <%# Rset alternate=app/views/layouts/application.rhtml %>
modelinesはメソッドに対してローカルに設定することもできる。例。
def test_comment # rset alternate=app/models/comment.rb
これら2つの形は、ケースによって異なる。
管理されたVimオプション
以下のオプションはプラグインがアクティブになっているところではバッファローカルにセットされる。
- shiftwidth, sw, softtabstop, sts, expandtab, et
-
shiftwidth(とsofttabstop)とexpandtabには2が使われる。これはRailsでの強い慣習であり、 だからユーザの好みという習慣の知恵は無視された。
- path, pa
-
あなたのアプリケーションから関連したすべてのディレクトリは、pathに追加される。 これは忘れたファイルへのアクセスを簡単にする。
:find blog_controller.rb
- suffixesadd, sua
-
これはファイルタイプ依存であるが、典型的に.rbと.rhtmlといくつか他のものを含む。 これは上の例を短縮できる。
:find blog_controller
- includeexpr, inex
-
includeexprオプションは、gfの項目で記述されたマジックを可能にするためにセットされる。
- statusline, :stl
-
g:rails_statuslineが有効ならば、役に立つ情報がstatuslineに追加される。 このオプションは、副作用がないのが明らかなのでグローバルにセットされる。
- makeprg, mp, errorformat, efm
-
Rakeはmakeprgとして使われるので、想像されている通り:makeでも動くだろう。 また、errorformatはあなたのテストを扱うために適切にセットされる。
- filetype, ft
-
filetypeは、Railsのファイルのために時々調節される。もっと明白には、*.rxmlと*.rjsはRubyのファイルとして扱われ、Masonのソースとして間違って認識されたファイルは ERubyファイルに変更される(しかしそれらがRailsアプリケーションの一部であるときだけ)。
- completefunc, cfu
-
completefuncが(すでにセットされていないなら)提供される。 それはかなりシンプルで、その推測をするためにシンタックスハイライトを使う。 i_CTRL-X_CTRL-Uを見よ。
- balloonexpr, bexpr
-
もしriがインストールされているなら、balloonexprはそれを呼ぶためにセットアップされている。 それを使うために、balloonevalがセットされていなければならない。 詳細はballoon-evalを見よ。
グローバルな設定
いくつかのグローバル変数は、このプラグインのふるまいをコントロールする。 一般に、それらはあなたのvimrcで1をセットすることで有効になり、 0をセットすることで無効になる。
let g:rails_some_option=1 let g:rails_some_option=0
これらのほとんどは、けっして使われる必要はないだろう。興味深いかもしれないいくつかは、 g:rails_expensive, g:rails_subversionとg:rails_default_databaseである。
- g:rails_level
-
let g:rails_level=3
これはロードされる特徴のレベルの一般的なコントロールである。 ふるまいは、ほかの設定であとで洗練することができる。 このオプションは削除候補になっている。もしこれをまだ使いたいなら、 rails-plugin-authorに連絡してほしい。
value meaning -1 完全に利用不可にする 0 ユーザレベルのautocommandだけ 1 最小の特徴だけ。おもにオプションの管理 2 デフォルトから、マッピングやstatuslineのようないくつかナイスなものを引いたもの 3 デフォルト。 おそらく破壊的な要素をのぞいてすべてを含む 4 すべての普通の特徴を有効にする。推奨 5+ 実験的 - g:loaded_rails
-
let g:loaded_rails=1
プラグインをノードしない。緊急のとき用。
- g:rails_abbreviations
-
Railsのabbreviationを有効にする。ABBREVIATIONSの項目を見よ。 g:rails_levelが3以上の時有効となる。
- g:rails_dbext
-
let g:rails_dbext=1
もしdbextプラグインがインストールされているなら、それとの統合を有効にする。 g:rails_expensiveの値がデフォルトになる。 このオプションがセットされているとき、dbextの設定は自動的にconfig/database.ymlから抽出される。 それから、あなたはテーブル名の補完や、以下のコマンドのような特徴を使うことが出来る。
:Create database brablog_development :Select * from posts where title like '%Denmark%'
dbextは複雑なプラグインで、さらに設定が必要になるかもしれないことに注意せよ。 もしインストールされているならdbextと、それからsql-completion-dynamic(vim7の中)のヘルプを見よ。
- g:rails_defalut_file
-
let g:rails_default_file='config/database.yml'
新しいRailsアプリケーションが作られたときロードするファイル。デフォルトはREADMEになっている。
- g:rails_devalut_database
-
let g:rails_devalut_database='sqlite3'
新しいアプリケーションで使うデータベース。デフォルトはRailsに決めさせる。
- g:rails_expensive
-
let g:rails_expensive=1
高価な(slow)特徴(典型的に、Rubyのインタプリタを呼ぶ)を有効、無効にする。 適度に早いコンピュータにはおすすめ。 g:rails_levelが3以上(回部のプログラムが明らかに遅く走るwindowsでは4以上)。 windowsのユーザは、このオプションをONにし、パフォーマンスが受け入れられるものかどうかを 見ることを奨励する。
- g:rails_gnu_screen
-
let g:rails_gnu_screen=1
:Rbreakpointer, :Rconsole, :Rserverをバックグラウンドで立ち上げるために、 (もし動いているなら)GNU Screenを使う。デフォルトで有効。
- g:rails_mappings
-
let g:rails_mappings=1
いくつかのマッピング(ほとんどはナビゲーション)を有効にする。g:rails_levelが3以上のとき有効。
- g:rails_modelines
-
let g:rails_modelines=1
以下のようにmodelinesを有効にする。
# Rset task=db:schema:load
modelinesは:Rsetコマンドを使ってバッファローカルのオプションをセットする。 また、メソッドに特化したmodelinesを有効にする。
def show # rset preview=blog/show/1
modelinesは非常に便利であるが、信用できないソースからプロジェクトを編集するときは セキュリティ上の問題を引き起こすかもしれない。 g:rails_levelが3以上で有効になる。
- g:rails_menu
-
let g:rails_menu=1
2のとき、Railsメニューが作られる。1のとき、このメニューはPluginメニューの下のサブメニューになる。 デフォルトは0, 1, 2で、これはg:rails_levelが3より小さいか、等しいか、大きいかに依存する。
- g:rails_url
-
let g:rails_url='http://localhost:3000'
:Rpreviewコマンドで使われる。デフォルトは上に示したものである。 b:rails_urlでオーバーライドされる。
- g:rails_statusline
-
let g:rails_statusline=1
プラグインが有効になっているとき、ステータスラインにその手がかりを与える。 g:rails_levelが3以上のとき有効。
- g:rails_subversion
-
let g:rails_subversion=1
:Rgenerateと:Rdestroy(:Rscriptではダメ)のようなコマンドのために、 subversionのリポジトリに自動的にファイルを追加、削除する。 アプリケーションがsubversionのリポジトリの部分でない場合は無視する。 g:rails_levelが4以上で有効。
- g:rails_syntax
-
let g:rails_syntax=1
有効の時、これはよりRailsフレンドリーになるようにシンタックスハイライトを調節する。 g:rails_levelが2以上で有効。
g:rails_syntaxが有効の時、あなたはRubyのファイルがすこしシアンが強い(か、あなたの識別子がハイライトされる) と気づくかもしれない。ft-ruby-syntaxで説明されているように、g:ruby_no_identifiersを有効にしたいかもしれない。
- g:rails_tabstop
-
let g:rails_tabstop=4
これは、shiftwidthのデフォルトが2であることを嫌う人々のためのオプションである。 0でないとき、すべてのファイルはロードされたときに、 最初にあるインデントをスペースからタブに変換するためにtabstop=2で:retab !されるだろう。 それから、tabstopとshiftwidthはオプションの値にセットされるだろう。 この処理は書き込みの時に逆のことをする。 そういうわけで、編集中はカスタムインデントを使い、しかしセーブするときはRailsの慣習に従う。 このオプションのローカルバッファバージョンもあり、次のようなことを可能にする。
autocmd User Rails* if &ft == 'ruby' | let b:rails_tabstop = 4 | endif
このオプションはデフォルトでは0で、推奨する値である。
もし全てのこのマジックの代わりにこのプラグインの設定をオーバーライドし、あなた自身の カスタムshiftwidthを使うことを好むならば、autocommandで手動で調節する。
autocmd User Rails* set sw=4 sts=4 noet
これには大変がっかりだ。Railsと闘うのはよすんだ。
ABOUT
このプラグインはTim Popeによって書かれた。彼にメールするにはvimNOSPAM at tpope.info(atを@に読み変えてください)へ。 彼はFreenodeのIRCネットワークでも見付けることが出来る。 #rubyonrailsと#vimでtpopeとしてそこにいる。
最新の安定バージョンはhttp://www.vim.org/scripts/script.php?script_id=1567で見付けることが出来る。 Vim 7.0では、GetLatestVimScriptsで最新に保つことが出来る。
開発バージョンは以下のURLで見付けことができる。
1つめのはvim7.0のためのvimballだ。3つめはsubversionのリポジトリで、 もっとも最新の特徴とバグを含んでいる。
このプラグインへのフィードバックを求む。すべてのコメントと、苦情と、作者への賛辞を送ってほしい。
このプラグインはVim自身と同じ条件のもとで配布されている。licenseを見よ。 No warranties, expressed or implied.
September 07, 2006
ひさびさにまともにJavaScript書いた 21:18
- Permalink
- Comments (310)
- Trackbacks (0)
JavaScript
なんかせっかくrails.vimのヘルプを読んだのに(w、今週のバイトはひたすらJavaScriptでした。Railsはテンプレートくらいしか触ってない。そしてそのテンプレート開いて書いてるのはJavaScriptだったりするww
JavaScriptはオレのプログラミングの原点なんだけど、ブラウザに依存するところが嫌いでほとんどやらずに来た。でもね、今週触ってて気づいたんだけど、functionってlambdaじゃん! おかげでちょっと好きになれました。この点についてはRubyよりもScheme(LISP)色が強い使用感だった。あー、括弧が書きたくなってきたー……。
ただね、lambdaはあってもmapとかfilterとかそういうのないような。ダメじゃん。結局配列はインデックスごろごろ回してめんどくさいことになる。あとreturnて長い。邪魔。書き忘れてもエラーにならないから余計に邪魔。
September 08, 2006
prototype.js便利(何ヶ月遅れ?) 02:09
- Permalink
- Comments (1176)
- Trackbacks (0)
JavaScript
なんてこった。mapがねーとか愚痴ってたけど、なんか言われてみればRubyからメソッドぱくったJavaScriptライブラリなんて話をさらっと見た記憶が。すっかり忘れてた。それってprototype.jsだったのか。「今頃かよ」って感じだけど、興味ないものについての知識なんてこんなもんです……。しっかし、これ使ってたら今週はもうちょっとイライラしないですんだなー。
JavaScriptはもっとストレスフルなのかと思ってできるだけ避けてきたけど、意外と面白いな。てか、ただのバイトプログラマってだけのオレに必要なのはリスト処理関数とlambdaとオブジェクトだけなんでそんだけあればなんでも快適に感じるわ……薄いなーオレの技術。
September 15, 2006
サーバ調子悪い 00:50
- Permalink
- Comments (1342)
- Trackbacks (0)
サーバ
最近気がつくとうちのサーバのMySQLが落ちてる。lighttpdも落ちてるときがある。
ここんとこ見てなかった/var/log/messagesに見慣れないログがあったので抜粋。 左の数字は8月10日から今日までのログに出現した数。
1 kernel: VM: killing process X
76 kernel: VM: killing process chasen
2 kernel: VM: killing process crond
13 kernel: VM: killing process dispatch.fcgi
2 kernel: VM: killing process dns.pl
2 kernel: VM: killing process gdm-binary
6 kernel: VM: killing process gdmgreeter
1 kernel: VM: killing process hddtemp
8 kernel: VM: killing process lighttpd
2 kernel: VM: killing process mysqld
11 kernel: VM: killing process perl
6 kernel: VM: killing process php
1 kernel: VM: killing process postdrop
1 kernel: VM: killing process prefdm
1 kernel: VM: killing process proftpd
1 kernel: VM: killing process rails
2 kernel: VM: killing process rpmq
158 kernel: VM: killing process ruby
2 kernel: VM: killing process run-parts
10 kernel: VM: killing process sh
1 kernel: VM: killing process touch
3 kernel: VM: killing process updatedb
落ちてたのはこれが原因かな? lighttpdのほうは頻度的に説明がつきそうな数字かなーと思う。あとRubyの回数は嫌がらせだと思う。
"kernel: VM: killing process ..."についての適度に詳しい説明を見つけた。
VM = Virtual Memory. the kernel ran out of REAL and Virtual memory, and processes were still demanding more. To survive this, the kernel goes into lifesaver mode and begins "reaping" processes somewhat randomly in order to free memory so that it won't crash. (I think the only process safe from reaping is probably init). How to fix it?
1> Don't run more on your system than memory will allow.
2> find the software with the memory leak, kill it, and upgrade to a version without that leak...
3> Buy more memory or add another swap partition.
メモリを使い果たしてピンチだったからkillしたようだ。 オレの知らないところで戦っていたんですね。ファンがうるさいからって蹴ってごめんよ。 昨日は3人くらいに蹴られてたよね……(´・ω・`)
うちのサーバ、こんな感じです。
$ free -m
合計 使用済 空き領域 共有領域 バッファ キャッシュ
Mem: 233 175 58 0 17 45
-/+ バッファ: 112 121
Swap: 478 71 407
たまに様子を見ることにする。
ちょっとだけカーネルハッキング - OOM Killerにもうちょっと詳しい説明がありました。OOM Killerというのか、これ。
September 20, 2006
うぇぶでざいん 20:10
- Permalink
- Comments (1247)
- Trackbacks (1)
Web
ムズいよ。美術2だよオレ。マジこれだけは他人に丸投げしたい。
イケてるデザインでピカピカの画像作れてCSSのノウハウに精通してる人そのへんにいないかなぁ。
September 22, 2006
MySQLの文字コードに関するメモ 02:36
- Permalink
- Comments (1624)
- Trackbacks (1)
MySQL
ろくな知識もなくデータベース使ってるもんだからいろいろわかんない。良くないすなぁ。
とりあえず最近アウトプットが少ないので、初心に帰って調べたことをメモ。
MySQLは4.1からcharとかvarcharとかのあとについてる数字(char(10)の10)がバイト数から文字数になったと聞いていたのに文字が変なところでチョン切られるからおかしいなあと思っていた。
ちょっと調べてみた中で目にした関数を試しに使ってみると、文字数を返すはずのcharacter_length()でバイト数みたいな数字が返ってくるし、charset()をするとlatin1って返ってくるもんだから、あー、これutf8じゃないよ……という結論になった。
まーデータ自体はutf8のコードで保存されているんだろうけど、MySQL内での扱いがlatin1ってことかな。Railsでもmysqlでも化けなかったってことは。
mysql> show variables like "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
mysql:9586によると、character_set_databaseてのがCREATE DATABASE で文字コードが指定されなかった場合、database の文字コードはこれになる。
ということなので、ああ確かにオレのはlatin1になるな、と。
my.cnfの[mysqld]のところにdefault-character-set=utf8と書いておけば良さそうですよ。
クライアント側はサーバと別の文字コードを使うことが出来て、これが
mysql --default-character-set=utf8
とか
mysql> set names utf8
とかで変更できるそうだ。ふむふむ。
使える文字コード一覧は、
mysql> show character set;
euc-jpをujisと書いたりするから注意、と。
日本語が入るとmysqlコマンドで表を出力したときに罫線がずれてたんだけど、これはこの文字コードにからんだ問題だったみたい。(参考:mysqlのオプション指定でテーブルの縦線を揃える)
さて、これでMySQLの理解が一つ深まったんだけど、問題はすでにあるデータベース。
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
肝心のcharacter_set_databaseがlatin1のままだよママン(´Д⊂)
変え方がわからないので、mysqldumpして create tableにdefault character setを追加してリストアしてutf8になりました。
MySQLの文字コードに関するメモ2 22:43
- Permalink
- Comments (1570)
- Trackbacks (0)
Rails, MySQL
メモ。正しくない可能性があるので注意。
MySQLのテーブルの文字コードを指定するにはmy.cnfの[mysqld]で
default-character-set=utf8
とするか、
CREATE TABLE table_name ( ... ) DEFAULT CHARACTER SET utf8; とか name VARCHAR(255) CHARACTER SET utf8
のように個別に指定する。
mysqldはクライアントの文字コードに合わせてやりとりするデータの文字コードを変換しているようなので、 utf8のテーブルと正しくやりとりするには、
SET NAMES utf8
のようにクライアント側の文字コードを適切にセットするか、 文字コード変換を抑制するようmy.cnfの[mysqld]に
skip-character-set-client-handshake
と書く。
Railsではdatabase.ymlにencodingを追加するとSET NAMESしてくれる。
development: adapter: mysql database: test_development username: root password: encoding: utf8 socket: /var/run/mysqld/mysqld.sock host: localhost
まだよくわかってないけど、char_length()が文字数と一致するようになったし varchar(20)は21文字目以降が切られるようになった。
あー、本買わないとダメかなぁ。あんま興味ないが。
September 23, 2006
MySQLの文字コードに関するメモ3 18:36
- Permalink
- Comments (1610)
- Trackbacks (0)
MySQL
一応latin1のテーブルにutf8突っ込んでた今回のケース、どう操作したかメモっとく。
my.cnfの[mysqldump]を
default-character-set=binary
としてまずダンプ。これは
$ mysqldump --default-character-set=binary
でも同じことだと思う。
binaryにすると文字コードが変換されないらしい。 オレのはlatin1のテーブルにutf8らしき文字コードで文字が入ってたんだけど、 ダンプしたものを見てみるとやっぱりutf8だったんだなと確認できた。
それから、CREATE TABLEにDEFAULT CHARACTER SET utf8を追加して
$ mysql -u root --default-character-set=utf8 -D test_production < dump_file
て感じでリストア。
……ありゃ、ためすぎたRailsのMLを片付けてたらrails:1358にMySQLの文字コードの話があったよ。 やっぱ文字コードはまるよね!
質問2:(typoにおいて)テーブルに設定された文字コードがlatin-1であるのに、なぜ日本語を保持 、表示できているのでしょうか。
これはオレも疑問だった。 とりあえずはっきりしてるのは、 オレのケースではlatin1のテーブルにutf8のコードで文字が格納されてたってこと。
Rails側がutf8なのを考えると、mysqldとRailsの間でやりとりするときに文字コードの変換が起こらなかったんじゃないか。 で、変換が起こらないための条件はテーブルとクライアント側の文字コードが同じってところだろうから、 mysqldはRailsをlatin1として扱ってたんじゃないかなぁ。 latin1-latin1だからutf8を変換せずにそのまま格納って感じ。
Railsがlatin1扱いされたのはSET NAMSES utf8とかしなかったから。 クライアントが文字コードの指定をしてこなかった場合 mysqldはそれをlatin1として扱うんじゃないすかね。 charsetを指定していないテーブルをそうするように。
そういえばmy.cnfに[client]って項目があるけど、 ここはmysqlコマンド以外のクライアントのための設定なんだろうか。
うーん、今まで何度かMySQLとかSQLiteとかで日本語使ったけど、 ホント理解せず使ってても動くもんだから余計はまるよ。 SQLiteのほうは日本語どうなってんだろう……。
あー、こんなエントリ書いてないで本とかマニュアルとか読めって声が聞こえてきそう。 やだよwww 時間ないもん。
September 25, 2006
ひさびさに生協 15:25
- Permalink
- Comments (371)
- Trackbacks (0)
book
これ買って帰る予定だった。
技術評論社 (2006/09/16)
そしたらなんとこんなものを発見……。
共立出版 (2005/03)
売り上げランキング: 2,326
→購入。
びっくりした。なんでこの本がこの大学の生協に……。英語のは図書館にあったけど。 誰かが注文したんだろうか……。そういえば心なしか言語処理本も増えてるような。 てかこれ勢いで買ったのはいいけど理解できるんかな……。
気になるのがもう一つ。
森北出版株式会社 (2006/08/25)
さすがに読んでもわからない本を2冊買うわけにはいかないので今回は買わず。 取り合えずメモとして載せとく。
途中インデントの世界へ 誘われそうになりながらレジへ。
September 28, 2006
cssのバグみたいの 01:34
- Permalink
- Comments (1527)
- Trackbacks (0)
CSS
ブロック要素を包んでるinsに
ins { border: 1px solid black }
てな感じでスタイル設定しても、手元のfirefoxとoperaで正しくレンダリングされず。
どうやらMozilla 5.0系 CSSバグリストにある
mozillaではdisplayプロパティで明示しない限りこれらの要素は常にインライン要素として扱われる
というバグくさい。
他にはこの前こんなのがあった。次のようなボタンについて、
[OK]
幅が狭くて押しにくいと友人に言われたので
input[type="submit"] { min-width: 70px }
で解決かと思ったら、
[ OK ] <-- opera [OK ] <-- firefox
となって萎えた。
width: 70pxとかした場合はOKがcenterに来るのに。firefoxにはがっかりですね。
とりあえずしかたがないのでwidthをセットしておくことに。
でもvalueが70px越えちゃったらどうせ見苦しく途中で切れるんだろ……?
属性セレクタに対応してない小学生レベルのIE6が現役バリバリなので、 ボタンにclassをいちいち書いて回って最終的には
input.button { width: 70px }
なんていう激しくDRYに反するダサいことになった。
これ、結局押しやすい長さになるようにvalueを考えるしかないのかな?
[ログイン] [新規作成]
みたいな。
September 29, 2006
学校来てから言ってくださいよ 20:26
- Permalink
- Comments (1207)
- Trackbacks (0)
大学
今日は研究内容について先生と軽くバトル。 あと「みなさんそういうことは学校来てから言ってくださいよ」みたいのを何度か聞いた。 出席率が悪いのが相当気になるらしい。 おかげで週に27コマ以上学校にいなければならなくなり、 予定表を提出するので極めてサボりにくい。 先生がいる時間で27コマなので土日とかはカウントしない。 バイト(←平日昼)がピンチwww この研究室なら余裕で時間があると思って始めたのに。 まあうちの研究室は多分一番研究が進んでないからなぁ。
とりあえずこのままでは研究でオレの興味のあることはなかなかできそうにない。 興味の赴くままじゃいかんのかなぁ。 そのほうがよっぽどモチベーションあがるよ。
しょうがないから追試でもして気になる技術を触ることにするか……やらないかも。

![Software Design (ソフトウエア デザイン) 2006年 10月号 [雑誌]](http://images-jp.amazon.com/images/P/B000ICL4U0.09.MZZZZZZZ.jpg)

