NoahOrblog

某・福島にある大学のコンピュータ理工学部の大学生のお話。

vimプラグイン備忘録

Noahです。

使用するエディタがもっぱらVim(vimの使用歴3年程度)なんですが、.vimrcへの設定やプラグインを使うことはあれど、作ったことはまったくなかったので作ってみました。

最初なので純粋にvimscriptだけで書いていきます

何を書こうか迷ったのですが、vimを3年使ってても方向キー使ってしまうときが恥ずかしながらあるためhjklキー矯正のvimプラグインを書こうと思います

…というより、以前このような方向キー矯正プラグインを利用して挫折した経緯があったため、(vimプラグイン書いてみたかったし)せっかくならと自分で実装して、それを忘れないための備忘録。

方向性

先述の通り、3年程度使っておきながら、移動は方向キーという初心者だったので、それの矯正を行うプラグインをテーマにします。

さらに、

「方向キーを使うことは悪魔的行為(デビルズアクション)」

と、天啓を得た(ただのアホ)ので、

「方向キー強制無効化(hjklを使わざるを得ない)、そしてもしも方向キー使用時はサターニャにvim下部のコンソールでツッこまれる」

こんな方向性で行きます

ところでサターニャとは

gabdro.com

の、こんな子

f:id:NoahOrberg:20170624224832j:plain

かわいい。

いざ作る

以下はvimプラグインのフォルダ階層です

- PLUGIN-NAME.vim/
  - autoload/
    - PLUGIN-NAME.vim
  - plugin/
    - PLUGIN-NAME.vim

autoload/ 内に関数定義を書き、plugin/ 内でキーマッピングなどをするのが習慣のようです。

なぜ分けるかというと、 autoload/ 内で 起動時に読み込みではなく必要時に読み込むスクリプト を書いておくことで、起動速度が改善されるからです。

ちなみに、偉大な先人の方がプラグインを書いており、

github.com

このプラグインから、雛形を簡単に作ることが出来ます

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ヶ月前(この記事ドラフトのままにしててすっかり忘れていた。)

f:id:NoahOrberg:20170517191855g:plain

github.com

f:id:NoahOrberg:20170624224446p:plain

サターニャかわいい。