やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

【vim-endwise】Vimにendを自動挿入するプラグインを入れた

 いい感じ。これができなきゃrubyやめる。

成果物

情報源

Vim8

 Vimのバージョン8からプラグインを導入する仕組みができた。これまではサードパーティ製ツールでしか存在しなかったので嬉しい。

pulgins

配置パス 概要
~/.vim/pack/{mypackage}/start/{myplugin}/ 起動時にruntimepathに追加されロードされる。
~/.vim/pack/{mypackage}/opt/{myplugin}/ :packadd mypluginとすることでプラグインをロードできる。特定のファイル形式の場合にのみ使うときもここへ。

 今回はRuby言語ファイル.rbのときのみtpope/vim-endwiseプラグインを読込たいのでoptに配置しよう。

前提

 vim8をインストールしておく。たぶんaptで入るはず。

$ apt search vim
...
vim/stable 2:8.1.0875-5 armhf
  Vi IMproved - enhanced vi editor

 私は自前でビルドした。aptのはクリップボードにコピーできないから。最新のはどうなっているのか知らんけど。

方針

 基本的にプラグインマネージャーからVim8標準のパッケージ機能に移行した話を参考にする。

dotfilesで管理しない

 面倒くさそうだから。システム側のパスをリンクにしちゃっているのも怖い。dotfilesやーめた! とかいって削除したら消えちゃうんじゃないの?

 あと、バージョン固定というのが微妙。別のOSを使う時になると古いバージョンは使えないってことが稀によくある。なので結局、ツールひとつひとつを最新にして、その最新版の設定ファイル仕様にあわせたものに書き換えねばならない。前にCLIファイラrangerでハマった。ようするに一発で環境構築できるなんて甘言は真に受けないほうがいい。

 ツールのバージョンはそのOSで使える最新にしたほうがいい。となるとdotfilesによる管理のメリットがない。むしろ面倒な手間をかけて、結局は使えないものを作り込むハメになる。それなら別の環境に移行することになったとき、ゼロからやったほうがマシである。

 よってdotfilesは使わない。

git submodule しない

 git cloneでやる。このほうが圧倒的に簡単。dotfilesで管理する必要がないならgit cloneでやったほうがいい。

手順

  1. プラグイン配置ディレクトリを作る
  2. プラグインgit cloneする
  3. ~/.vimrcpackaddする

1. プラグイン配置ディレクトリを作る

 プラグインを配置するディレクトリを用意する。

 プラグインはオプションにしたい。なので~/.vim/pack/{mypackage}/opt/{myplugin}/に配置する。このディレクトリを用意しよう。

 まずは名前を決める。{mypackage}を適当にrubyとしてディレクトリを作る。

cd ~/.vim
MY_PKG=ruby
mkdir -p pack/$MY_PKG/opt

2. プラグインgit cloneする

cd pack/$MY_PKG/opt
git clone https://github.com/tpope/vim-endwise

3. ~/.vimrcpackaddする

vim ~/.vimrc

 以下でvim-endwiseプラグインを遅延ロードできる。

packadd vim-endwise

 このとき、ファイルの拡張子が.rbのときだけロードするようにしたい。

 そのためには次のように書く。

filetype plugin indent on

function! s:setup_ruby()
  packadd vim-endwise
endfunction

augroup MyAutoCmd
    autocmd!
    autocmd MyAutoCmd BufNewFile,BufRead *.rb set filetype=ruby 
    autocmd FileType ruby call s:setup_ruby()
augroup END

 なお、すでに以下のような設定をしてある。それとは別に上記を追記した。

augroup fileTypeIndent
    autocmd!
    autocmd BufNewFile,BufRead *.rb setlocal tabstop=2 softtabstop=2 shiftwidth=2 expandtab smartindent autoindent packadd vim-endwise
augroup END

 Rubyのインデントはスペース2文字。それが慣例的らしい。

使ってみる

vim a.rb

 def, def a, def a(b)と書いた後にEnterキーを押下すると次の行にendが追記された。成功!

def a
end

 もし~/.vimrcfiletype plugin indent onを追加しなかったら次のようなバグが起こる。if, do, whileのときはendの前にインデントが入ってしまう。

if

  end

 以下ISSUEによりfiletype plugin indent onの設定が必要であることが判明した。

 ちゃんと設定したら以下のようになった。OK!

if

end

所感

 やはり苦戦した。vimは魔窟なので触るのが怖い。vimプラグインとかvimスクリプトとか、ハマりだしたら大変なことになりそう。その前にVSCodeのほうもいい感じに環境構築したい。

 ああ、一体いつになったら書けるんだ。書きたい。ruby書きたい。でもendは書きたくない。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux