久々にVimをやっています.
(実際はNeovim v0.4.4で開発をしています.Vimでは違う動作をしてしまうなどありましたら教えてください)
さて,Vimにはクラスは無いので連想配列やら関数やらを組み合わせてどうにかします.
参考
今回,Vim Pluginを書いているときにStackというデータ構造を使いたくなったのですが,Vimの標準の機能にはなさそうです.
そこで,autoload
下にて別ファイルにStackクラス(のようなもの)を作りたくなりました.
しかし,Vimscript特有のスコープやautoload
下のファイルの関数に書く必要があるプレフィックスのことなどがごっちゃになって詰まったので,ここにメモとして残しておきます.
" メンバやメソッドが入る辞書
let s:Stack = {'vals': []}
" コンストラクタ
function! stack#Stack() abort
return deepcopy(s:Stack)
endfunction
" メソッド
function! s:Stack.push(val) abort
call add(self.vals, a:val)
endfunction
function! s:Stack.pop() abort
call remove(self.vals, len(self.vals)-1)
endfunction
function! s:Stack.top() abort
return self.vals[len(self.vals)-1]
endfunction
そう,メソッドはstack#
をプレフィックスにする必要はなさげなんですよね.
呼び出し側
let s:stack = stack#Stack()
ただ,これではstack
というプラグインがあるように見えるので,autoload/myplugin
みたいなディレクトリを作って,その中にファイルを置いてmyplugin#stack#Stack
で呼び出せるようにすると良さげな気がします.
実際,例えばShougoさんのdein.vimではそういう工夫がされているように見えます.
もっと良い書き方やご指摘あればコメントなどで教えてください