basyura's blog

あしたになったらほんきだす。

plugin/rails.vim を読む

" vi 互換モードの場合
" または
" (
"    g:loaded_rails が定義されていてかつ true 
"    かつ 
"    (g:rails_debug が定義されていてかつ true)でない
" )
" の場合は終了
if &cp 
    || (exists("g:loaded_rails") && g:loaded_rails) 
    && !(exists("g:rails_debug") && g:rails_debug)
  finish
endif
" loaded_rails に 1 をセット
let g:loaded_rails = 1

compatible

'compatible' 'cp' 切替
    (既定では オン、ファイル|vimrc|または
    |gvimrc|が発見されたらオフ)
    グローバル 
    {Vi にはない}
    VimをなるべくVi互換にするか、
    便利な機能を使えるようにするかを決定する。

finish

:fini[sh] 
    スクリプトの読み込みを停止します。スクリプトファイル
    でのみ使えます。これはファイルの残りを読み込ませない
    ための手軽な方法です。

excite 翻訳頑張ってるけどシステムの都合臭がする


入力済み英文の単語を選択すると、右下のテキストボックスに反映される。検索ボタンを押すと新しいウインドウ(タブ)が開いて検索結果を表示してくれる。
すごいと思うんだけど・・・システム制限臭がすごくね?

とりあえず今できる範囲で要望された機能を実装しました。

って臭いがぷんぷんする。web2.0(笑)で盛り上がってる今ならポップアップで検索画面と結果を表示しちゃうぐらいしないとユーザが納得しないんじゃないかなぁ。Google 翻訳より精度がいいのにもったいない。
何が言いたいかというと
とっても親近感がわきました
(人ごとじゃない)

plugin/rails.vim を読む - その2

" Apparently, the nesting level within Vim when the Ruby interface is
" initialized determines how much stack space Ruby gets.  
"   どうやら、Ruby が初期化される時に
"   どれだけのスタック領域を取得するかによって、
"   Vim 内のネストレベルが決まるようだ。
" In previous versions of rails.vim, 
" sporadic stack overflows occured when omnicomplete was used.
"   前バージョンの rails.vim では
"   omnicomplete 使用時にスタックオーバーフローが時々起こった。
" This was apparently due to rails.vim having first initialized
" ruby deep in a nested function call.
"   どうやら rails.vim が最初に ruby を初期化する際の
"   呼び出しが深かったからのようだ。
"   
" (※) 訳自信なし

" ruby がサポートされている場合
if has("ruby")
  " ruby 呼び出し
  silent! ruby nil
endif

has

has({feature})  
    結果は機能{feature}がサポートされる場合1、
    されない場合0となる。

なんでこれで回避できるのかは良く分からない

plugin/rails.vim を読んでみる - その3

function! s:error(str)
  " ハイライトグループを指定
  echohl ErrorMsg
  " メッセージ表示
  echomsg a:str
  " ハイライトグループをもとに戻す
  echohl None
  " 最後のエラーメッセージ変数に設定する
  let v:errmsg = a:str
endfunction

echohl

:echoh[l] {name} 
    ハイライトグループ{name}を適用する。
    使用した後にはグループを"None"に戻すことを忘れないように。
    さもないとそれ以降のechoの表示総てがハイライトされてしまう。

echomsg

:echom[sg] {expr1} ..
    式を本当のメッセージとして表示し、
    そのメッセージをメッセージ履歴 message-history に保存する。

v:errmsg

v:errmsg
    最後に表示されたエラーメッセージ。
    この変数は代入することが許されている。

plugin/rails.vim を読む - その4

function! s:autoload(...)
  " g:autoloaded_rails が存在していなくて 
  " Vim のバージョンが 7 以上の場合
  if !exists("g:autoloaded_rails") && v:version >= 700
    " Ex コマンドを読み込む
    runtime! autoload/rails.vim
  endif
  " g:autoloaded_rails が存在する場合
  if exists("g:autoloaded_rails")
    " 引数がある場合
    if a:0
      " 引数の一つ目を実行
      exe a:1
    endif
    " 1 を返す
    return 1
  endif
  " g:rails_no_autoload_warning が存在しない場合
  if !exists("g:rails_no_autoload_warning")
    " 1 で定義
    let g:rails_no_autoload_warning = 1
    " version が 7 以上の場合
    if v:version >= 700
      " エラーメッセージを表示
      call s:error("Disabling rails.vim: autoload/rails.vim is missing")
    else
      " エラーメッセージを表示
      call s:error("Disabling rails.vim: Vim version 7 or higher required")
    endif
  endif
  " 空文字を返却
  return ""
endfunction

runtime

:ru[ntime][!] {file} ..
    'runtimepath'で示された各ディレクトリの{file}から
    Ex コマンドを読み込みます。
    [!]を付けると見つかった全てのファイルを読み込みます。
    付けなければ最初に見つかったファイルだけを読み込みます。

plugin/rails.vim を読む - その5

function! s:SetOptDefault(opt,val)
  " g:opt が存在しない場合
  if !exists("g:".a:opt)
    " 定義した上で val を設定
    let g:{a:opt} = a:val
  endif
endfunction
" デフォルト値設定
call s:SetOptDefault("rails_statusline",1)
"
" - 省略  -
"
if g:rails_dbext
  " g:loaded_dbext が存在している
  " かつ 
  " sqlite3 が実行可能
  " かつ
  " sqlite が実行可能でない場合
  if exists("g:loaded_dbext") && executable("sqlite3") && ! executable("sqlite")
    " デフォルト値を設定
    " Since dbext can't find it by itself
    call s:SetOptDefault("dbext_default_SQLITE_bin","sqlite3")
  endif
endif

executable

executable({expr}) *executable()*
    {expr}という名前の実行可能ファイルが存在するかどうか判定する。
    {expr}は引数を何もつけないプログラム名でなければならない。

plugin/rails.vim を読む - その6

function! s:escvar(r)
  " ファイル名を変更
  " /Users/basyura/.vim/plugin/vim-rails/plugin/rails.vim
  "     → ~/.vim/plugin/vim-rails/plugin/rails.vim 
  let r = fnamemodify(a:r,':~')
  " アルファベット、数字やアンダーバー以外の文字を置換
  let r = substitute(r,'\W','\="_".char2nr(submatch(0))."_"','g')
  " 数字始まりを置換(?)
  let r = substitute(r,'^\d','_&','')
  return r
endfunction

fnamemodify

fnamemodify({fname}, {mods})
    ファイル名{fname}を{mods}にしたがって変更する。
    {mods}はコマンドラインで使われるのと同様な文字列である。
    :~  ファイル名をホームディレクトリについて相対的な名前に
        (可能ならば) 切り詰める。
        ファイルがホームディレクトリの下になければ、
        ファイル名は修正されない。

submatch

submatch({nr}) *submatch()*
    substitute の中の式でのみ使われる。
    マッチしたテキストの{nr}番目の部分マッチを返す。
    {nr}が0のときはマッチしたテキスト全体を返す。

Batch.vim

選択した範囲に記述されたvimエディタのコマンドを、順々に実行するスクリプトです。 vimエディタ設定の確認や、vimスクリプトのデバッグで使用します。 (Windows, Mac)

batch.vim - 名無しのVIM使い

これすげえ。今まで

  1. vimscript 書く
  2. vim or gvim 再起動
  3. 以後ループ

だったのに!さくっと動かして確認出来ちゃう。せっかくなのでこの Batch.vim のソースを読もうと思ったら既にコメントが丁寧に書いてある。処理としては

1. 選択した範囲の行のvimスクリプトを読み込む
2. 一時ファイルに書き出す
3. 一時ファイルに書き出したvimスクリプトを実行する
4. 一時ファイルを削除する

とな。すげい。ほぼ数行で済んでる処理を抜き出すと

:function! s:Batch() range
    " 選択した範囲の行のvimスクリプトを読み込む
    :let l:selected = getline(a:firstline, a:lastline)
    " 一時ファイルの名前を取得する
    :let l:tempfile = tempname()
    " try-finally文で確実に一時ファイルを後始末する
    :try
        " 一時ファイルに読み込んだスクリプトを書き出す
        :call writefile(l:selected, l:tempfile)
        :try
            " 一時ファイルのvimスクリプトを実行する
            :execute ":source " . l:tempfile

range を書いておけば getline で取れるのか。勉強になる。