vimプラグイン備忘録
Noahです。
使用するエディタがもっぱらVim(vimの使用歴3年程度)なんですが、.vimrcへの設定やプラグインを使うことはあれど、作ったことはまったくなかったので作ってみました。
最初なので純粋にvimscriptだけで書いていきます
何を書こうか迷ったのですが、vimを3年使ってても方向キー使ってしまうときが恥ずかしながらあるためhjklキー矯正のvimプラグインを書こうと思います
…というより、以前このような方向キー矯正プラグインを利用して挫折した経緯があったため、(vimプラグイン書いてみたかったし)せっかくならと自分で実装して、それを忘れないための備忘録。
方向性
先述の通り、3年程度使っておきながら、移動は方向キーという初心者だったので、それの矯正を行うプラグインをテーマにします。
さらに、
「方向キーを使うことは悪魔的行為(デビルズアクション)」
と、天啓を得た(ただのアホ)ので、
「方向キー強制無効化(hjklを使わざるを得ない)、そしてもしも方向キー使用時はサターニャにvim下部のコンソールでツッこまれる」
こんな方向性で行きます
ところでサターニャとは
の、こんな子
かわいい。
いざ作る
- PLUGIN-NAME.vim/ - autoload/ - PLUGIN-NAME.vim - plugin/ - PLUGIN-NAME.vim
autoload/
内に関数定義を書き、plugin/
内でキーマッピングなどをするのが習慣のようです。
なぜ分けるかというと、 autoload/
内で 起動時に読み込みではなく必要時に読み込むスクリプト を書いておくことで、起動速度が改善されるからです。
ちなみに、偉大な先人の方がプラグインを書いており、
このプラグインから、雛形を簡単に作ることが出来ます
Neobundleの場合は ~/.vimrc
に
NeoBundleLazy 'mopp/layoutplugin.vim', { 'autoload' : { 'commands' : 'LayoutPlugin'} }
dein.vimの場合は $XDG_CONFIG/nvim/init.vim
に
call dein#add('mopp/layoutplugin.vim')
と記述し、:call dein#update()
などでインストール後に
:LayoutPlugin castOfArrow.vim
とすることで、プラグインのディレクトリ構成を一発で作れます。
雛形も作れたところで、autoload/
内に関数を定義していきます
"============================================================================= " File: castOfArrow.vim " Author: noahorberg " Created: 2017-03-05 "============================================================================= scriptencoding utf-8 if !exists('g:loaded_castOfArrow') finish endif let g:loaded_castOfArrow = 1 let s:save_cpo = &cpo set cpo&vim function! castOfArrow#Cast() let l:dist = ["hjklキー使えってこと!?師匠なのに!","こんな方向キー使う奴野放しにしてるなんて天界どうかしてるっ!!","矢印キーで移動するようとするなんて・・・悪っ!!", "どう!?矢印キーなんて最高に悪魔的な行為でしょっ!!", "矢印キーの形態はすべて掌握しているわ それもすべて・・・","上矢印とかkってなに!?"] let l:match_end = matchend(reltimestr(reltime()), '\d\+\.') + 1 let l:rand = reltimestr(reltime())[l:match_end : ] % (len(dist)) echo dist[rand] endfunction let &cpo = s:save_cpo unlet s:save_cpo
シンプルですね。乱数で文字列の配列からランダムに要素を選び、echoするだけです
直で配列に書くのは気が引けましたが、jsonファイルにまとめるにも、JSONパースが面倒そうだったので直書き。
では、plugin/
内
"============================================================================= " File: castOfArrow.vim " Author: noahorberg " Created: 2017-03-05 "============================================================================= scriptencoding utf-8 if exists('g:loaded_castOfArrow') finish endif let g:loaded_castOfArrow = 1 let s:save_cpo = &cpo set cpo&vim nnoremap <Right> :call castOfArrow#Cast()<CR> nnoremap <LEFT> :call castOfArrow#Cast()<CR> nnoremap <Up> :call castOfArrow#Cast()<CR> nnoremap <Down> :call castOfArrow#Cast()<CR> " inoremap <Right> <ESC>:call castOfArrow#Cast()<CR>i " inoremap <LEFT> <ESC>:call castOfArrow#Cast()<CR>i " inoremap <Up> <ESC>:call castOfArrow#Cast()<CR>i " inoremap <Down> <ESC>:call castOfArrow#Cast()<CR>i let &cpo = s:save_cpo unlet s:save_cpo
こっちには、キーマッピング系のものを書きます。ひとまずノーマルモード時は方向キーを強制的に使えないようにマッピングします。(インサートモード時は挙動が変だったため保留にしてます。)
完成品
という感じでひとまず完成させたのが 3ヶ月前(この記事ドラフトのままにしててすっかり忘れていた。)
サターニャかわいい。