0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

(neo)Vim Plugin開発で別ファイルにクラスを定義する

Posted at

久々に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ではそういう工夫がされているように見えます.

もっと良い書き方やご指摘あればコメントなどで教えてください:bow:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?