light log

学んだこととか

AtomのVim Modeを使いやすくする

何日か前からAtomVim Modeを使い始めた。

vim-mode

Atomの前はVimを使っていたので、結構快適になった。ガチのVimmerの人たちには物足りないかもしれないけど、自分程度のなんちゃってVimmerは特に不満なく使ってる。

ただ、以下の二つがあればもっと使いやすいと思った。

  1. ノーマルモードに入るときに自動でIMEがオフになる
  2. Atomから離れるときに自動的にノーマルモードに戻る

どっちもAtomのinit.coffeeになんか書くことで実現できないかなと思って調べ始めた。

結論から言うと、1.はKarabiner(旧KeyRemap4MacBook)の設定で実現できた。

2.についてはinit.coffeeでやろうとしたけど、中途半端なところで諦めた。

以下で詳しく書く。

ノーマルモードに入るとき自動でIMEオフ

ググったらすでにやってる人の記事が簡単に見つかって、その人はKarabinerでやってた。

Atomをmarkdownエディタとして使い始めたのでメモ - Qiita

ということで、これを真似て、Karabinerのprivate.xmlを書いた。書き方は一部自分好みに変えた。

<?xml version="1.0"?>
<root>
    <appdef>
        <appname>ATOM</appname>
        <equal>com.github.atom</equal>
    </appdef>
    <item>
        <name>Leave InsertMode With Eisuu For Atom Vim Mode</name>
        <identifier>private.app_atom_esc_with_eisuu</identifier>
        <only>ATOM</only>
        <autogen>
            --KeyToKey--
            KeyCode::ESCAPE,
            KeyCode::ESCAPE, KeyCode::JIS_EISUU
        </autogen>
        <autogen>
            --KeyToKey--
            KeyCode::BRACKET_LEFT, VK_CONTROL,
            KeyCode::ESCAPE, KeyCode::JIS_EISUU
        </autogen>
        <autogen>
            --KeyToKey--
            KeyCode::C, VK_CONTROL,
            KeyCode::ESCAPE, KeyCode::JIS_EISUU
        </autogen>
    </item>
</root>

identifierの内容が微妙なのは否めない。

上記リンクと、以下の本家のドキュメントを参考にした。

How to add your own settings / Karabiner - Software for OS X

ドキュメントを参考にxmlを編集してリロードして、チェックボックスをオンにするとすぐに使えるようになる。便利。

今のところ意図通りに動いていて、ノーマルモードで意気揚々とキーを叩いたら日本語入力になっててあれれってのがなくなった。とても快適。

Atomから離れるときに自動的にノーマルモードに戻る

こっちはググっても見つけられなかったので、init.coffeeをいじって実現できないか試してみることにした。

まずAtomAPIから、フォーカスを失ったときというかアクティブじゃなくなったときというか、そういう感じのイベントが無いか探してみた。

Atom API(やっぱりやたら重い)

で、たぶん無かった。

じゃあ逆にアクティブになったときにノーマルモードに戻せばいいんだと思って、今度はそういうイベントが無いか探した。

そしたらPaneオブジェクトにonDidActivateというイベントが見つかったので、以下を参考にinit.coffeeに追記してみた。

Atom API / Pane#instance-onDidActivate

A1.1 Upgrading to 1.0 APIs : Upgrading Your Package

init.coffee

pane = atom.workspace.getActivePane()
disposable = pane.onDidActivate ->
    editor = atom.workspace.getActiveTextEditor()
    editorElement = atom.views.getView(editor)
    atom.commands.dispatch editorElement, 'vim-mode:reset-command-mode'
# Atomの0.194.0ではこのコード片がinit.coffeeにあると、Atom起動時にTypeError例外が発生します

ActivePaneのonDidActivateイベントに、'vim-mode:reset-command-mode'を呼び出すコードを登録する。

(ちなみに前回init.coffeeについて書いた記事では、新しいAPIでのコマンドの実行方法が分からないと書いたんだけど、普通に上のリンクの2つ目(前回も貼り付けた)に載ってた。atom.commands.dispatchでできる。)

これでうまくいくはず!と思って試したら、

  1. Pane間の移動時にしか発火されない
  2. 起動時のActivePaneでしか有効じゃない

2.についてはコード書いてるときから気付いてて、何かしら対処はできそうだと思った。

問題は1.の方で、他のPaneから戻って来たときにはイベントが発火されてノーマルモードになるけど、他のアプリからAtomに戻ったときには発火されなかった。

今回はアプリの切り替え時にノーマルモードにすることを想定していたので、これが無理となるとやる気がなくなって2.の方もどうでもいいやとなってしまった。

しかも、コード内にコメントで示した通り、コードを書きながらリロードしてテストしている間は気が付かなかったけれど、いったんAtomを終了して再起動すると例外が発生して使えなくなったので、今結局コメントアウトしてる。

しかし、エディタを離れたときにノーマルモードに移るっていうのは、ググっても本家Vimに対しての情報もあんまりヒットしないんだけど、そういう要望はあんまりないのだろうか。それとも調べ方が悪いのかな。

もし調べ方が悪いのではなく要望がないのだとしたら、熟練のVimmerは、

  • 必ずノーマルモードにしてVimを離れる
  • Vimに移ったときに、最初に必ずESC等を押して確実にノーマルモードにしてから操作を始める
  • Vimに移ったときに、必ずモードを確認する

のどれかなのだろうか。わからない。

まとめ

  • 結局やりたかったことの片方しかできなかったけど、まあまあ満足
  • Vim Mode使いやすい
  • Atom力低いのでがんばる