🧊

脱VimしようとしてAtomを触ってたけど、やっぱりVimを使うことにした

という事の顛末を、迷えるVimmerに伝えるべく・・。

Vimしようとしたきっかけ

Lintが遅い。

  • eslint
  • flow

Webなフロントエンドの開発をよくやる身としては、

  • この2つのLinterを
  • リアルタイムに
  • エディタ上で

使いたい。

今までずっとSyntasticというプラグインを使ってたけど、デカいプロジェクトだと如実に遅い。

GitHub - vim-syntastic/syntastic: Syntax checking hacks for vim

小さいプロジェクトでも`:w`してから5秒くらい待たされたりしてて、どうにかならんかなーと思ってた。

ESLintに関しては、Lintのサーバーを裏で走らせておいて・・っていうことができる`eslint_d`を使うことでだいぶマシになる。

let g:syntastic_javascript_eslint_exec = 'eslint_d'

けどFlowに関してはどうしようもないっぽく(公式のIssueでも色々でてるけど・・)、遅いのを我慢するか、型チェックはエディタ上でやらないかとか考え始めてて、それならいっそVimを捨てるかなーとか考えてた。

こんにちはAtom

そういう時に、WebStormやらAtomやらVSCodeやら、エディタを使ってる勢の話を聞いてちょっと意識するように。

普段からも、コードじゃないメモとか原稿とかを書くのにはAtomを使ってて(昔はCotEditorやったけどシンタックスハイライトが激重いので捨てた)、コード書く分にもプラグインとかも豊富そうなのでAtomでコード書ける環境を整えてみた。

とりあえずこんなもんで。

よかった

そしたら良いじゃないですかこれー!

  • 素のテキストエディタVimの操作性のいいとこどり
  • Lint速い!
  • Flowも速い!!
  • UIがデフォルトでオシャレで見やすい
  • `:se paste`とかしなくていい!
  • オートインデントも賢い・・!

とかちょっと浮かれてしまった。
けどもちろん惜しいなーとかちょっとなーってとこもあり。

あといっぽ

`vim-mode-plus`には`vim-mode-plus-exmode`っていうプラグインもあって、これをいれると`:w`とか`:vs`とかできるようになる。
けど・・・、

  • `:q!`
  • `:vs filename`

ができなかった・・。

だめだ・・

黒い画面よく使う勢なので、ターミナルといかにシームレスに使えるかも譲れないポイントで。

ターミナル -> Vimの関係性だと、各種コマンドを打ちながらすっとファイルを編集できて、ブラウザとターミナルさえあれば開発が完結する。
これがほんとに身軽で気に入ってるポイントで。

AtomAtomなので、別途ターミナルを用意するか、Atomの中でターミナルを動かすソリューションが必要になる。

`terminal-plus`はなぜか動かなかったので、そのForkであるやつを。

ただこれも惜しい・・。

  • `Ctrl + L`のコンソールのクリアが綺麗に消えない
  • てかターミナルの中にエディタじゃなく、エディタの中にターミナルが気持ち悪い
  • ターミナル専用のタブとか開きたい
    • 現状だと、エディタ内ターミナルなので、レイヤー的にタブと関係ない
  • `tmux`とかも
  • 横に出てるプロジェクトツリー、ターミナルの`pwd`と連動してほしい・・

などなど気になる点がいっぱい出てくる。

`linter-flow`と`linter-eslint`も、マウスでホバーしないとエラー文言がわからないという感じで惜しい。

うう・・Vimが恋しい・・ターミナルだけで完結する世界に帰りたい・・。
VimでさくっとLintするやつさえあれば・・本当にないの?2017年やで?

あった

あったわ・・・!

GitHub - w0rp/ale: Asynchronous Lint Engine

要求するVimのバージョンが8なので、そこだけアップデートしたらすぐ使えた。

Syntasticの時には自前のVim scriptで書いてた「最も近い`.eslintrc`を探す」みたいなコードももちろん実装されてるし、非同期で速い。
てか1文字打つごとに判定してくてウザいくらい速い!(設定で変えられる)

というわけでAtomに乗り換える理由もなくなり、またしばらくVimだけで生きていけそう。

ALEのアレコレ

ファイルタイプを見て勝手にLintしてくれる。
そしてタイプごとに色んな種類のLinterが勝手に動いちゃう。

JavaScriptの場合、

  • eslint
  • jscs
  • jshint
  • flow
  • standard
  • xo

と、やってほしくないのまでやってくれるので、制限する。

let g:ale_linters = {
\   'javascript': ['eslint'],
\}

Lintするのは保存時だけでいいよって場合は、

let g:ale_lint_on_text_changed = 'never'
let g:ale_lint_on_enter = 0

よきVimライフを!