[ 新規に投稿する ]

自動マーカー機能を実現できるマクロNo.08559
石田 さん 17/09/20 18:54 [ コメントを投稿する ]
  先日、青空文庫からダウンロードしたロマン・ロランの著作を
フリーのエディタで読んでいました(秀丸を使うのは勿体ない)。
テキストを読みながら何気なく「ベートーヴェン」という文字列を
マウスでなぞってみたら、そのファイルにある「ベートーヴェン」と
いう文字列がすべて、別色表示されたのに驚きました。
そのエディタを詳しく調べてみたら「自動マーカー機能」というので
動作しているようでした(オフにしたら動作しない)。

普段は秀丸ネットモニタのログ表示に利用しているだけのソフトですが、
秀丸マクロで、同じような機能をもったマクロはないでしょうか。
[ ]
RE:08559 自動マーカー機能を実現できるマクロNo.08560
vscode-life さん 17/09/20 22:47 [ コメントを投稿する ]
  今ver8.75 β2以上の秀丸を要すると思います。

(なぜなら、たとえ実現出来ても「マクロ実行しっぱなし」とかだと、全く無意味なので)

15分ぐらいで出来るかな、家に帰ったら作ってもよいですよ。
[ ]
RE:08560 自動マーカー機能を実現できるマクロNo.08561
vscode-life さん 17/09/20 23:58 [ コメントを投稿する ]
  簡易版できました。

https://github.com/vscode-life/hidemaru-net/blob/master/win-hidemaru-app/hm_selctedtextautohighlighter.src/HmSelctedTextAutoHighlighter.zip

(ソースとか)
https://github.com/vscode-life/hidemaru-net/tree/master/win-hidemaru-app/hm_selctedtextautohighlighter.src/HmSelctedTextAutoHighlighter.src


動作には、

・秀丸エディタ 8.75 のβ2以上が必要と思います。(β3?)

・hm.NET必要です(最新)
 http://秀丸マクロ.net/?page=nobu_tool_hm_dotnet



HmSelctedTextAutoHighlighter.macを一度実行した後は、
そのファイル(厳密にはそのプロセス)については、
選択した文字と同じものがハイライトされるようになります。

初回起動がちょっと遅い時は、NGenすれば早くなりますが、
まぁ今回はβに対するものとなるので、サンプルの域を出ないので
これで。

HmSelctedTextAutoHighlighterはパブリックドメインとしておきますので、好きにしてください。


もし、もともと秀丸に「常に選択した文字列と同じ文字列をハイライトする」みたいなオプションがあるのであればマクロでも出来るでしょうが、(あるのかもしれませんが)
そうでないなら「選択文字列内容の常時監視型」になるので、秀丸マクロだけでの実装は「現実的ではない」かと思われます。
[ ]
RE:08561 自動マーカー機能を実現できるマクロNo.08562
ヒラメ さん 17/09/21 00:25 [ コメントを投稿する ]
  こんばんは。

面白そうだったのでマクロ組んでみました。

既にvscode-lifeさんが作成してくださっていますが、私も組んで
しまったので折角ですから投稿します。

自動起動マクロのカーソル移動後タイマーに適当なディレイを入れて
設定してください。

特定パス名が含まれている場合のみ動作するようにしていますので、
ご希望に合わせて※1の行の"\\desktop"部分を書き換えてみてください。
(なにがなんでも動作させたい場合は※2の行を消してしまうといいです。)

アウトライン解析の枠を表示して「検索文字列を強調されている箇所」
をONにしておくと更に便利なのかもしれません。



// ========マクロここから===================================
//選択範囲の文字列を「検索文字列を強調」する簡易マクロ。
//自動起動マクロのカーソル移動後タイマーにセットする想定。
setcompatiblemode 0x20000;
setcompatiblemode 0x0003|0x000c|0x00000200;
if(strstr(filename,"\\desktop")==-1){ //※1
  //特定フォルダ以下のファイルでなければ何もしない方がよい?
  endmacro; //※2
}
if(!selecting){
  //何も選択していなければ何もしない
  endmacro;
}else{
  if(seltoplineno!=selendlineno){
    //改行を含んで選択していたら何もしない
    endmacro;
  }else{
    $1=gettext2(seltopcolumn,seltoplineno,selendcolumn,selendlineno,1);
    setsearch $1,0x00000800;
    hilightfound 1;
  }
}
// ========マクロここまで===================================
[ ]
RE:08561 自動マーカー機能を実現できるマクロNo.08563
vscode-life さん 17/09/21 16:55 [ コメントを投稿する ]
  変なフォルダ名にアップしていたのでフォルダ名を変更しました。
(ソースや名前ミスも整理したもの)

https://github.com/vscode-life/hidemaru-net/blob/master/win-hidemaru-app/hm_selectedtextautohighlighter/HmSelectedTextAutoHighlighter.zip

https://github.com/vscode-life/hidemaru-net/tree/master/win-hidemaru-app/hm_selectedtextautohighlighter/HmSelectedTextAutoHighlighter.src

おこなっている指針や概要を記載しておきます。

■指針
 ・マクロを頻繁に実行しない
  マクロは全秀丸プロセスで1つしかない。
  しかもキューとして蓄積されない。
  即ち、他のマクロが実行中だと、単純に実行できない。

  よって全てのマクロは頻繁に実行しない実装が望ましい。
  できれば起動時に「一瞬だけマクロが自動実行」され、
  そのマクロからプログラムをプロセスに常駐させ、
  処理はその常駐したプログラムが常時状況に対処するのが理想。

■呼び出し想定

 ・プロセスが開かれた時、最初に1回 HmSelectedTextAutoHighlighter.mac が呼び出されることを想定
   

■.macの処理

 ・HmSelectedTextAutoHighlighter.mac は単純に
  HmSelectedTextAutoHighlighter.dll の「1メソッド」を呼び出す。
  (途中終了を含め)秀丸を閉じた場合に備えたメソッドも割り当てる


■.dllの処理

  ・HmSelectedTextAutoHighlighter.dllは 「秀丸 32bit」「秀丸 64bit」共通で使える ANY CPU型 dll

  ・HmSelectedTextAutoHighlighter は「秀丸のGUI同期のスレッド」で処理している。

■処理概要

  (*) 基本的なチェック処理を300_秒単位で行う

 (A)「選択文字列」の内容が「変化したか?」 というチェックをする

 (B)「選択文字列」の内容が「安定したか?」 というチェックをする。
   今回の実装では、300_秒ごとに選択文字列が蓄積・チェックされ、
   「最後3回の蓄積が全て同じ文字列選択」状態であれば、「選択文字列が安定した」
  とみなして、次へ進む

  (C)最後にハイライトした文字列内容と現在の選択文字列内容が「異なる」かをチェックする

 (D)のマクロが実行中でないことをチェックする
  他のマクロが実行されてなければ、マクロを実行できる可能性が「高い」
  (※あくまで「高い」だけでマクロが実行出来ると決まったわけではない。)

 (E)選択文字列が無い(非選択)もしくは、選択文字列が100文字を超えるなら
  「ハイライトすべきでない」とみなす。
  そうでなければ、「選択文字列内容と同じ文字列をハイライトすべき」とみなす

 (F)ハイライト処理をすることが「有効なタイミング」であることが
   「ほぼ確定」したので、「ここで初めて秀丸マクロ」をメモリ上で実行する
  ここまで条件を絞ることで、「秀丸マクロの実行頻度を極限まで落とし」、
  他のマクロとの「干渉確率を大きく下げる」。

 (G)「ハイライトの消去」もしくは「ハイライト処理」を行う

 (H)本当に「秀丸は処理を最後まで達成したのか」のチェックを行う
  
 (I) (E)〜(H)の処理において、何かトラブルが発生した場合は、
   (J)が実行されないため、300_秒後に再び更新のチャンスがある(それも失敗した場合は、
     再び300_秒後…と延々と再トライチャンスがある)

 (J)トラブルなく(I)が完了した場合は、(C)で比較するためのハイライト文字列を更新する。

  (K)秀丸を閉じた時、プロセスが終了する直前に、チェック処理を止める。


みたいな感じになっています。
[ ]
RE:08563 自動マーカー機能を実現できるマクロNo.08564
石田 さん 17/09/21 21:07 [ コメントを投稿する ]
  vscode-life さん、ヒラメ さん

わざわざマクロを作ってもらい感謝します。
これからじっくり試してみたいと思います。
この機能は何かに応用できそうな感じがします。

どうも有り難うございました。感謝します。
[ ]

[ 新規に投稿する ]