これ僕.com:行動分析学マニアがおくる行動戦略

意図と行動のギャップから生じる「不自由さ」への挑戦。果たして僕たちに自由はあるのか?

vimのスクリプトを勉強する(1)

プログラムを書いていて、色々手で書くのが嫌になってきたので、vimスクリプトの勉強をすることにしてみた。とりあえず1回目。2回目以降があるかは知らないw

今日のゴール

  • RSpecのdescribeやitのテンプレートをカーソル位置に貼り付けたい
    • 定型的な事をいちいち書きたくないのだよ

Hello, World

  • 関数名の最初の文字は大文字にすること
  • 定義した関数を呼び出すには":call"を使う
  • 取り敢えず、~/.vim/pluginの下にmy.vimというファイルを作成して色々試す
    • vim起動時に読み込まれるっぽ
function Hello()
    echo "Hello, World"
endfunction

で、":call Hello()"ってやると、"Hello, World"って表示される。

:callっていちいち打ちたくない・・・

  • commandを使って新しいコマンドを作成できる
function Hello()
    echo "Hello, World"
endfunction

command MyHello call Hello()

で、":MyHello"ってやると、"Hello, World"って表示される。

特定の位置に文字を挿入するには?

  • append(line, string)を使うらしい
    • lineの直下にstringを挿入するっぽ
function AppendHello()
    call append(1, "Hello,")
    call append(2, "World")
endfunction

command MyAppend call AppendHello()

で、":MyAppend"ってやると、2行目に"Hello,"、3行目に"World"って挿入される。

カーソルの位置を知るには?

  • line(".")でカーソル位置の行番号が分かるらしい
function AppendHello()
    call append(line("."), "Hello,")
    call append(line(".") + 1, "World")
endfunction

command MyAppend call AppendHello()

で、":MyAppend"ってやると、カーソル位置の下に"Helli,"、"World"って挿入される。

関数の引数は、どうやって使うの?

  • 引数はfunction Foo(arg1, arg2)と書けばいい
  • 関数内で引数にアクセスするときは"a:arg1"ってな感じに、"a:"を付加する
function AppendHello(arg1, arg2)
    call append(line("."), a:arg1)
    call append(line(".") + 1, a:arg2)
endfunction

command MyAppend call AppendHello("Hello,", "World")

で、":MyAppend"ってやると、カーソル位置の下に"Helli,"、"World"って挿入される。

材料は揃った!・・・ような気がする

  • 自分作成したコマンドで引数を扱いたい場合は、
    • "-nargs=1"オプションを付ける → 引数を1つ指定できる
    • "-nargs=*"は引数を幾つでも、"-nargs=?"は無しか1つ、"-nargs=+"は1つ以上、"-nargs=0"は引数無し
    • でコマンドに引数を渡す
  1 function RSpecWriter(type)
  2     if a:type == "desc"
  3         call append(line("."), "describe MODEL, \"\" do")
  4         call append(line(".") + 1, "  fixtures FIXTURES")
  5         call append(line(".") + 2, "")
  6         call append(line(".") + 3, "  before(:each) do")
  7         call append(line(".") + 4, "  end")
  8         call append(line(".") + 5, "")
  9         call append(line(".") + 6, "  it \"\" do")
 10         call append(line(".") + 7, "  end")
 11         call append(line(".") + 8, "end")
 12     elseif a:type == "it"
 13         call append(line("."), "  it \"\" do")
 14         call append(line(".") + 1, "  end")
 15     else
 16         echo "invalid command"
 17     end 
 18 endfunction
 19         
 20 command -narg=1 RSpecWriter call RSpecWriter("<args>")

で、本日のゴール。エレガントさのかけらもないコードだけど、まぁ、よしとする。

  • ":RSpecWriter desc"でRSpecのdescribeをごりごり挿入
  • ":RSpecWriter it"でRSpecのitを挿入


これで、ちょっとは楽になるといいけどw

参考