LoginSignup
9
9

More than 5 years have passed since last update.

quick-highlight つくった

Last updated at Posted at 2015-05-11

quick-highlight

Vim を使っていた頃(まだ平行して使ってますが) vim-quickhl を作って、使っていた。
使用頻度は割と高く、コードリーディングや、ライティング時に重宝していた。

Atom を使い始めて、似たようなのがなく、作った。

gif

使い方

コマンドパレットから、

  • 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 では :syntaxmatchadd() でこれをやれた。)
これはコードから動的に Grammar を生成して、ロードすれば良い。
ただ難度も高そうだし、頻繁に更新する quick-highlight のようなプラグインには不向きなので、不採用。
参考: Automatically Update to Dynamic Grammar

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9