Vim を使っていた頃(まだ平行して使ってますが) vim-quickhl を作って、使っていた。
使用頻度は割と高く、コードリーディングや、ライティング時に重宝していた。
Atom を使い始めて、似たようなのがなく、作った。
使い方
コマンドパレットから、
-
quick-highlight:toggle
でハイライトを toggle. -
quick-highlight:clear
で全ハイライトをクリア
機能
- 見えている Pane(のTextEditor)全部が対象
- バッファのテキストを更新すると
TextEditor::onDidStopChanging
イベントで更新(*1)
*1 シンタックスハイライトで自動で更新している訳ではないので、手動で更新する都合上、こういう実装になる。Vim の matchadd()
みたいに新規に追加した text を自動で色付けはしてくれないので。
キーマップ
デフォルトキーマップは無し。
例)
- general
'atom-workspace atom-text-editor:not([mini])':
'cmd-k m': 'quick-highlight:toggle'
'cmd-k M': 'quick-highlight:clear'
- vim-mode user
'atom-text-editor.vim-mode.command-mode, atom-text-editor.vim-mode.visual-mode':
'space m': 'quick-highlight:toggle'
'space M': 'quick-highlight:clear'
これまで 5つのプラグインを作ったが、全部プラグイン側ではデフォルトのキーマップ設定していない。
私は、大量のキーマップ設定されてるとそのプラグインが嫌いになってしまう。
私はこんな事で他人に嫌われたくないので設定しません。
※ 本当は Atom 側が何らかの解を用意しないと行けないと思う。
※ 各プラグインが「このキーマップは、俺のプラグイン用のものだ」と主張しているようで、醜い取り合いをしているようで悲しい。
こういうディスカッションもある
Key-binding hell
Atom のEmmet Package は素のAtom のデフォルト keymap を奪うので、こんな文句も出ている
Key binding Conflicts #161
うーんよくない。。
TODO
- Refresh only added/deleted decoration for performance.
- Make color configurable.
- Serialize, deserialize
- Highlight with RegExp.
- Show matched count on statusbar?
- Wrap highlight with HTMLElement, to be able to use full color.
- auto highlight for newly added texts while editiong.
- highlight across visible buffer.
- Or some configurable decoration style like outline, underline.
Decoration の色付けについての制限事項(覚え書き):
Atom の Decoration は View エンティティではなく、直接的に Text と色を指定できない。
指定できるのはバックグラウンドの色のみなので、透過させるか、box 形式で囲むかにしないとだめ。透過色にしないと Text の色が指定した background-color とかぶった時に、文字が背景に同化して見えなくなってしまう。
対策をざっと調べてみたのでメモを残しておく。
ちなみにどちらの対策も大変そうなのと、処理が重くなりそうなので、ひとまず見送り。
対策1: HTMLElement で Wrap する
pigments では、HTMLElement で wrap して、text を div
で囲い、更にテキストを色付けしている Syntax Grammar の style に負けないように、z-index
を駆使してテキストの色を指定している。
重たそうなので、とりあえず見送り。
参考: Editor marker CSS
対策2: Grammar を動的に生成してシンタックスハイライトに任せる
もう一つの対策としては、一時キーワードを Grammar にしてしまって、Syntax ハイライトとして色がつくようにすれば、Marker で目印を付けて色付けしたり、消したり、リフレッシュしたり、といった Marker 管理をしなくて良くなる。(Vim では :syntax
や matchadd()
でこれをやれた。)
これはコードから動的に Grammar を生成して、ロードすれば良い。
ただ難度も高そうだし、頻繁に更新する quick-highlight のようなプラグインには不向きなので、不採用。
参考: Automatically Update to Dynamic Grammar