Kesinの知見置き場

知見を共有していきたいじゃないですか

ベターVimとしてAtomを使う

この記事はATOM-editor Advent Carendar 2015の15日目の記事です。

f:id:Kesin:20151214234544p:plain

2016/03/01 追記

vim-mode-plus, vim風キーマッピングの発見により色々追記しました。

はじめに

どうも、Vimの方からやってきました。
様々なエディタやIDEにVimプラグインがあることから分かるように、どんな環境に移ろうともVimと共に生きるVim愛好者は世界中にたくさんいるようです。
自分もそのうちの一人でメインエディタはVimを使い、IDEを使うときもVimプラグインが手放せなかったのですが、さすがに2015年にもなったし流行りのエディタも試してみたいということで今年からAtomに入門してみました。
Atomにも例に漏れずVimプラグインがあるので初日からVim化に挑戦するも、色々と足りない機能に納得できずSublimeのときのように諦めかけていたのですが、パッケージを色々探したところ大体自分が満足するところまでVim化することができました。今回はそのときに見つけたパッケージを紹介したいと思います。

*ほとんどのパッケージのページにgifアニメがありますので、ぜひリンクを覗いてみてください。

自分の紹介より見たほうが分かりやすいかと思います。

Vim標準機能を実現するパッケージ

vim-mode

2016/03/01 追記
vim-modeから色々機能が拡張されているvim-mode-plusに乗り換えました

まずはこれを入れないと始まらないです。

機能 キー
カーソル移動 h, j, k, l, gg, G, ctrl+j, ctrl+k
インサートモード i, I, o, O
ビジュアルモード v, V
ヤンク y, yy, yaw, yiw
削除 d, dd, daw, diw(削除しつつinsertモードにする'c'も使用可能)
ペースト p, P
undo/redo u, R
検索 /, * (検索後のn, Nも可能)
Paneの移動 ctrl+h,j,k,l
数値のインクリメント/デクリメント ctrl+a, ctrl+x
繰り返し .(コロン)

実現できている機能一覧ページが見つからなかったので、どこまで本家Vimの挙動をカバーできているのか正確には分かりませんがこのあたりの基本操作は抑えているようです。
vimで検索結果をハイライトさせるhlsearch機能が無いことが個人的には非常に惜しいのですが、Pull requestを見る限り精力的に開発が続けられているのでそのうち実現されるでしょう。

ex-mode

2016/03/01 追記
vim-modeからvim-mode-plusに乗り換え、ex-modeが使えなくなったので代わりにキーマッピングを使う方法を追記しました

vimという名前が付いていないので最初は気が付きませんでした。vimのexモードを実現するパッケージです。

‘:'を入力することで本家Vimと同じように:w, :wq, :q, :sp, :vspなどが使えます。
vimで作業(特にコードリーディング)するときはガンガン画面分割をしてカーソル移動させまくっているので、ex-modeを入れることでatomでも同じことができるのが感動的でした。

ちなみに:s, :%sによる置換も一応可能なのですが、自分で試したところ以下の機能が実装されていないため残念ながら実用的とは言い難いです。

  • 検索結果を使った省略記法(fooを検索後にbarに置換したい場合、本家vimであれば:s//bar/で置換できる)
  • カーソル上の単語をテキストボックスにペースト(本家vimでのctrl+r, w)
  • 置換オプションのg, c
  • ビジュアルモードでの選択範囲限定での置換

vim-mode-visual-block

2016/03/01 追記
vim-mode-plusには元々ビジュアルモードが組み込まれているので自分は不要になりました。

本家vimでの矩形ビジュアルモードを実現するパッケージ。神。

矩形モード選択からの'I'や'A'でinsertモードに移行した一括編集も実現してます

cursor-history

vim-mode-visual-blockと同じt9mdさんによる本家vimのctrl-oを実現するパッケージ。神。

Highlight Selected

元々はSublimeTextで単語をダブルクリックすると同じ単語を全てハイライトしてくれるという機能のコピーのようですが、 vim-modeでは現状検索結果のハイライトができないのでその代わりとして使っています。

sort-lines

選択した範囲の行をソートしてくれます。
たまにお世話になるvimの:sortと同じですね。

有名なVimプラグインの代替

linterç³»

Vimだと: syntastic

lintでパッケージ検索すると各言語用のlinter-**がたくさん見つかります。
syntasticは非同期にチェックできなかったので巨大なファイルだと保存時に固まるという問題がありましたが、atomのlinterは非同期にチェックが走っているので非常に快適です。

autocompleteç³»

Vimだと: neocomplcache, neocomplete

linter同様、autocompleteで検索すると各言語用のパッケージが色々見つかります。
autocomplete-pathと自分が使う言語用のものをインストールしてしまえば入力補完で困ることはほぼ無いと思います。

status-barç³»

Vimだと: powerlineあたり
(ちなみに自分はlightline.vimを愛用してました)

vimにはステータスバーにgitブランチ情報や文字コードを表示させるpowerline系のプラグインが色々ありましたが、atomではそのあたりの情報はデフォルトでステータスバーに表示されてます。

clip-history

vimだと: yankringあたり (ちなみに自分はyankround.vimを愛用してました)

いわゆるクリップボード拡張系のパッケージ。
vimモードに関係なくatomのパッケージに色々ありますが貼り付けるときにいちいち候補を選ぶUIが余計で、yankround.vimでctrl+pだけで済んでいた操作性に比べるとイマイチっぽかったです。
clip-historyはyankround.vimをそのままatomに移植してきたという感じで非常に使いやすいです。

ちなみに作者はvim-mode-visual-block, cursol-historyと同じt9mdさんです。いつもお世話になっております。

script

vimだと: vim-quickrun

開いているスクリプトを実行して、実行結果をatomに表示してくれます。 試行錯誤しながら書いているときに非常に便利。

vim-modeでのキーマッピング

vim-modeを入れるとatomのキーマッピング設定にvimでのnormalモードや、insertモード中かの条件分けができます。

'atom-text-editor.vim-mode.normal-mode':
  'ctrl-i': 'cursor-history:next'
  'ctrl-o': 'cursor-history:prev'
'atom-text-editor.vim-mode:not(.insert-mode)':
  'ctrl-p': 'clip-history:paste'
  'ctrl-P': 'clip-history:paste-last'
  'ctrl-n': 'clip-history:paste-newer'

上は自分のkeymap.csonの一部です。
カーソル移動系のcursor-historyはnormalモード、ペースト拡張系のclip-historyはinsertモード以外、というように各モードごとにキーマッピングが可能になっています。
今後別のパッケージをマッピングしたいということになってもコンフリクトを減らせそうですね。

おわりに

ここまで紹介したパッケージを導入したことでVimで実現できていたことをAtomでも実現できるようになり、今では快適なVim生活をAtom上でおくれています。

じゃあVimでよくない?という意見をもらうことが多いのですが、何度かvimscriptにもチャレンジしたもののvimscriptの基本的な挙動について自分が知りたい情報を見つけるのがしんどすぎるのと、業務用に書いた簡単なプラグインを数ヶ月後に自分で見返した際にvimscriptで何が書いてあるのかさっぱり分からなかった(自分が書いたにも関わらず)のがキッカケで本格的にAtomに移行を始めようと思いました。

Atomでのパッケージ作成は勉強し始めたばかりですが、それなりに慣れ親しんだCoffeeScriptで書けるのと、そもそもAtomのほとんどの基本機能がパッケージで提供されていて参考にできるサンプルが多いのでVimを本格的にカスタマイズするよりは障壁がだいぶ低い感じです。

2016年もベターVimとしてAtomを使っていこうと思います。

2016/03/01 追記

記事を書いてからさらにベターVIm化を進めることができたので紹介します

vim-mode-plus

t9mdさんによるvim-modeの拡張版。 詳しい説明は22日目のAdventCalendarにご本人による紹介記事があります。 どのような機能が追加されているのかは、公式のgifアニメを見るのが一番理解が早いと思います。 vim-modeとはパッケージ名が変わっているのでキーマップを変える必要がありますが、これも公式でサンプルが用意されているので必要なところを自分好みに書き換えるだけで乗り換えられると思います。

個人的には/検索の強化が一番感動しました。vim-modeでも/による検索はできましたが、インクリメントサーチとハイライトが効かなかったので、本家Vimに比べると片手落ち感が否めませんでした。 vim-mode-plusはこの点が改善されていて、この機能だけでも乗り換える価値がありました。

キーマッピングによるex-modeの置き換え

自分はこのキーマッピングを追加することでex-modeが不要になりました。

# emulate vim ex-mode
# https://github.com/atom/vim-mode/issues/50
'.editor.vim-mode-plus:not(.insert-mode)':
  ': w enter': 'core:save'
  ': q enter': 'core:close'
  ': s p enter':  'pane:split-down'
  ': v s p enter':  'pane:split-right'
  'g c c': 'editor:toggle-line-comments' # emulate tomtom/tcooment_vim

vim-mode-plusに乗り換えたことでex-modeと連携できなくなり、色々探していたらvim-modeのissueからこのコメントを発見しました。 キーマッピングで:wを再現するというもので、見つけた時に「その発想は無かった!」と感激しました。

置換だけはやはり本家Vimの再現はできなかったのですが、もうAtomの元々の置換機能でいいかなという感じになってきました。

2016/02時点の自分の設定

自分のdotfilesの.atomディレクトリにキーマップもパッケージ一覧も置いてあるので、よければ参考にしてみてください。