Atom のカーソル上下移動を改良するパッケージを作った

相変わらず Atom の環境を整備し続けています.

というわけでまたパッケージを作りました.

atom.io

カーソルを上下に動かしたとき, デフォルトではこんな感じに全角文字などが間に入るとカーソルの水平位置がぐちゃぐちゃと動いてしまいます (水平位置を文字数 (正確には code unit 数) で見ているため).

f:id:susisu:20170320185200g:plain

この動作を修正して見た目通りの位置に移動させるというものです.

f:id:susisu:20170320185204g:plain

ちなみにこれは Atom がエディタを自前で描画しているためで, Sublime Text をはじめ大体のテキストエディタはデフォルトで修正後のような動作のはずです.

パーサコンビネータを高速化した

例のアレです. 式年遷宮したときの話はこちら.

github.com

最初は軽い気持ちで細々とした最適化をしていたんです.

ちなみにどう最適化するかというと V8 のプロファイラを使って適当に遅そうなところに目星をつけて色々試します.

そんなこんなで Parsimmon*1 より妙に遅い原因を探していたら, ap, left, right (Parsec*2 でいうところの <*>, <*, *>) の実装の効率が悪く, これが主な原因であることがわかりました.

その後, 比較用の JSON パーサ実装を (Parsimmon のものと同等になるように) 改良した結果がこれです.

このあたりで長いこと不明だった諸悪の根源を見つけられてほぼ満足していますが, さらに細々とした最適化を続けました.

処理系によりそうな話になってきたのでこのへんで終わり.

以上です.

*1:先行の JS のパーサコンビネータライブラリ https://github.com/jneen/parsimmon

*2:Haskell のパーサコンビネータライブラリ https://github.com/aslatter/parsec/ 機能はほぼこれのパクリ