はじめに
VimConf 2018最高でしたね。
テンションが上がりすぎて、この感動を共有しないわけにはいかないと英語でまとめを書いてしまったので、アドカレのネタがVimConf記事から変更になりました。
Vim歴10ヶ月の若輩者ですが、どうぞよろしくお願いします。
写経
きっかけはVimConf2018のAlisueさんのセッションでした。
Effective Modern Vim scripting
Modernとか、そういう言葉に弱いです。
最高のVim Script Tutorialな気配がしたのとDark Vimmerへの道を踏み出すために写経しました。
以下、写経して思ったこと
- autoload配下のpathと関数名が対応してる規約面白い
- source guardや
function!
など何のために必要なのか調査しないと分からないイディオムが多い - Vital.vim、めっちゃ便利
- 公式のplugin manager、欲しすぎる
- Vim script、思った以上にモダンに書ける
- Vim script、pythonっぽさを感じる
- Promise、デバッグが難しい
ゔぃむすくりぷつ
FizzBuzz
定番です。これ以上のネタを思いつかなかった。
function! amake#fizzbuzz() abort
for i in range(1, 100)
call s:judge_fizzbuzz(i)
endfor
endfunction
function! s:judge_fizzbuzz(i) abort
if a:i % 15 == 0
echo "FizzBuzz"
elseif a:i % 3 == 0
echo "Fizz"
elseif a:i % 5 == 0
echo "Buzz"
else
echo a:i
endif
endfunction
Linter
普段はALEに任してしまっています。せっかくの機会なので、Linterをamakeの写経に足していく形で実装しました。
JS限定で:w
するたびにエラーをQuickFixに出してくれます。
こちらを参考に実装。
autoload/amake.vim
function! amake#eslint()
let result = split(system('yarn eslint ' . bufname("")), '\n')
let errors = []
for r in result
if r =~ '\<error\>' && r !~ 'Command failed with exit code'
let info = { 'filename': bufname("") }
let splited_error_line = split(r, 'error')
let lnum_col = split(splited_error_line[0], ':')
let info.lnum = trim(lnum_col[0])
let info.col = trim(lnum_col[1])
let info.text = trim(splited_error_line[1])
call add(errors, info)
endif
endfor
call setqflist(errors, 'r')
cwindow
silent! doautocmd QuickFixCmdPost make
endfunction
autocmd! BufWritePost *.js :call amake#eslint()
ErrorだけでWarningが拾えてないとか同期処理なのででかいファイルをlintするとしばらく固まるとかまだまだな部分は多いですが、一応、動くものになりました。
:h <something>
が早い上に、分かりやすいというのは衝撃的な事実でした。
普段は、詰まったらGitHubのドキュメント->ダメならissueなりstackoverflowなりを漁るので、公式のヘルプが丁寧かつ分かりやすく書いてあるのは最高かな?と思いました。
やはり、Vimは最高だった。
レポジトリです。
https://github.com/sasurau4/vim-amake
最後に
本当は、BufferとかText Editorっぽいものを盛り込んで自作プラギンを作りたかったんですが、
Vim力と愛が足りませんでした。でも、quickfix使えたので満足しました。
Dark Vimmerになるために精進します。