ブックマーク情報が消えてしまう
-
別トピックで話がふくらんでしまったので、新規トピックに移動します。
元のトピック:
『アウトラインペインの表示設定について』
https://www.haijin-boys.com/discussions/4171#discussion-4206以下の引用は、元トピックでの kuro さんのコメントです。
> ブックマークが復元されないパターンを見つけました。
>
> ①ファイルを保存してないとき
>
> ブックマークが保存されるのはファイルが保存された時、またはファイルが変更されていない状態 (タイトルバーに * が付いてない状態) でファイルを閉じた時なので、例えば、ファイルを開いてブックマークを設置して編集して、保存せずに閉じてしまうと保存されませんが、これは仕様です。
>
> (変更状態で閉じたときにブックマークを保持してもあまり意味がないため)
>
> ②ファイルを読み直したとき
>
> ファイルを開いてブックマークを設置した後に [読み直し] をするか、別のエディタでそのファイルを編集して、Mery 側の変更通知に従って再読み込みを行うとブックマークが消えてしまいます。
>
> これは Ver 2.6.9 で「読み直しの際に、できるだけスクロールバーの位置を保持するようにした」際に、「別エディタで編集したんだからもうブックマーク情報いらなくね?」と思って、スクロール位置の復元を優先させてカーソル位置とブックマーク情報を読まないようにしたんです。
>
> 別のエディタで編集した場合の Mery 側での再読み込みは、そもそもブックマークの情報が意味をなさないので必要ないと思いますが、メニューから [読み直し] を実行した場合はブックマークも読み直したほうが良さそうですね。
>
> いずれの場合も、Mery の外でファイルが変更されてしまっているとブックマークの位置はズレてしまいますが、それは仕方ないということで、一応、ブックマークを読むだけ読むかたちにしてみます。(以前の仕様に戻るだけですが)| sukemaru | 返信 -
>> Kuro さん
「ブックマークが消えてしまう」の発生条件を整理していただきありがとうございます。私のほうで「ブックマークが消えてしまう」のは ② に絡んで発生していたようです。
タブの「未保存 *」マークが消えている状態での「書き換え禁止」OFF → ON の切り替え操作が原因ではないかと(ほかのエディタを開いてファイルに二重アクセスをかけたりはしていません)。[読み直し] コマンドは使用していませんが、ファイルを編集後にすぐに閉じないことも多く、そのさいは上書き保存後にステータスバー右隅の「書禁」のダブルクリックリックで(またはショートカットキーで)「書き換え禁止」を ON にしておくのですが、この操作によってファイルが「読み直し」されてブックマーク情報が消えてしまうようです。
この操作手順は自作マクロのメンテ/デバッグでよくやっていますので、前トピックで挙げた「検索ジャンプ」や「ひらけゴマ」マクロの JS ファイルでブックマークが消えてしまうのは、ほぼ ② のパターンに付随して発生しているものと考えられそうですね。ソースコード(JS ファイル、HTML ファイルなど)や保存用のメモ(Tips・リファレンスのコピペを集めた覚え書きなど)、ソフトウェアの readme.txt などは "基本的に閲覧専用のファイル" 扱いとして、イベントマクロ「編集モードの自動選択」で書き換え禁止 ON にしているのですが、readme 以外のものは書き換え禁止 ON/OFF を切り替えて再編集することもあるので、「読み直し & ブックマーク」の使用の変更(ロールバック)はありがたいです。 :)
ちなみに、2.6.9 以前は「ブックマーク」機能を利用していませんでした。 2.6.9 で「変更行の強調表示」機能が付いたり、その頃からマクロの自作と編集モードの拡張をはじめたりして、エディタに色を付けることへの抵抗感がなくなってきて、やっと「ブックマーク」使い出した次第です。 ← それまでは「エディタは "色なし" がデフォ」でした。 XD当面は ② に気をつけて運用するようにして、仕様の再変更後にも問題が発生したり、別の再現条件を見つけたさいにはご報告いたします。
| sukemaru | 返信 -
新しいディスカッションの作成と、動作検証、ありがとうございました。
なるほど、書き換え禁止の切り替えは、確かに再読み込みが発生します。
詳細な情報ありがとうございます。頂いた情報のおかげでほぼ原因は特定できましたので、次のバージョンでは対応できると思います。> 「読み直し & ブックマーク」の使用の変更(ロールバック)はありがたいです。 :)
そうなんです。ロールバックなので、今度はスクロール位置が復元できなくなる可能性があるのですが、なんとかブックマーク位置、カーソル位置、スクロール位置をすべて復元できる方法を模索してみようと思います。> 当面は ② に気をつけて運用するようにして、仕様の再変更後にも問題が発生したり、別の再現条件を見つけたさいにはご報告いたします。
ご協力ありがとうございます。せっかくトピックを立てていただいたので、ついでに申し上げておきますと、ブックマークの機能はもともとエディタエンジンに付いていたものをそのまま使っていたのですが、これがどうも設計がよろしくなくて、行数の増加とブックマークの数に比例してどんどん重くなっていくんです。
将来的には、ちょっと仕様変更 (Undo 情報にブックマークを含めない) など、検討していきたいなーと思っています。
| Kuro | 返信 -
ありがとうございます。
Kuro さんに整理していただいた ① ② のとおりの操作によるものであれば、ファイル操作としてイレギュラーなので仕方のないところですが、「書き換え禁止」ON/OFF は "マイナー" だけど "イレギュラー" ではないというところですよね。 「XP 案件」でご迷惑をかけてしまったわけではなくてホっとしました。 :)| sukemaru | 返信 -
ご返信ありがとうございます。
おっしゃる通り、通常の操作における不具合ですね。ブックマーク機能は、次回、実装予定のスクロールバーにマーカー描画機能で使う予定なので、なるべく改善できるようにがんばってみます。
> 「XP 案件」でご迷惑をかけてしまったわけではなくてホっとしました。 :)
いいえ、お気遣いなく。XP 対応の件は、一応まだ対応する方向ですから、お気づきの点などございましたら教えていただけると助かります。| Kuro | 返信 -
> ブックマークの機能はもともとエディタエンジンに付いていたものをそのまま使っていたのですが、これがどうも設計がよろしくなくて …
>
> 将来的には、ちょっと仕様変更 (Undo 情報にブックマークを含めない) など、検討していきたいなーと思っています。
なるほど、いまさらながら意味がわかりました。① 任意の行の文字列を入力する
② 他の行でブックマークを 設定/解除 する
③ undo する(1回)③ の操作で、① の文字列操作と ② のブックマークの両方が消えてしまいますね。
「ブックマーク一覧ジャンプ」マクロの改造を終え、本格的にブックマークを活用しはじめたばかりですが、ブックマークってなかなか気難しい。ロースペ PC なので、「タブの切り替えでもたつくアウトラインよりも、ブックマークと『ブックマークジャンプ』マクロで運用するほうが捗りそう」とおもっていたら、ほかにも気をつけないといけないことがあるようで。 :(> お気づきの点などございましたら教えていただけると助かります。
とりあえず他に気がついたところとして、置換ダイアログの「すべて置換」を実行すると、置換対象の文字列がない行でもブックマーク情報が消えてしまいます。
正しくは「置換対象をふくむ行にはさまれた行のブックマーク情報がおかしくなる」ということになるでしょうか。
置換ダイアログの「置換」ボタンでひとつずつ置換するぶんには問題ないようですが、「すべて置換」だとブックマーク座標の pos が一気に変わるからダメということのようですね。
正規表現オプション有効で \n を置換対象や置換文字列にふくめている場合なら仕方ないのかもしれませんが、ドキュメント全体の行数が変化しない置換処理でまでブックマークが消えてしまうのは使いづらいような…。
素人考えだと、pos ベースの座標ではなく論理行番号 y でブックマーク情報を保存するほうがよいのでは? と単純に考えてしまうところです。document.Text = document.Text.replace( /foo/g, "bar" ); みたいなマクロを使うと、ブックマークはほぼ壊滅!
(さすがに ↑ これ ↑ は予想の範囲内でしたし、そもそもこれをやると「変更行の強調」マーキングが全行につくので、こういう大雑把なコードは使いづらかったりもします)また、下のようなマクロをブックマーク行にたいして実行したときには、ブックマーク設定が別の行に移動?してしまうようです。
将来的にブックマークの仕様を変更するさいには、あわせてご検討ください。
/** * こちらの場合、ブックマーク行が「hoge」を含んでいなくても * ブックマークが次の行にズレる。 */ document.selection.SelectLine(); document.selection.Text = document.selection.Text.replace( /hoge/, "fuga" ); /** * こちらの場合、ブックマーク行が「hoge」を含んでいなければ * 置換が空振りして、ブックマークもズレない。 * 「hoge」を含んでいると、ブックマークが下の行にズレる */ s.SelectLine(); var st = document.selection.Text.replace( /hoge/, "fuga" ); if ( document.selection.Text != str ) { document.selection.Text = str; } /** * 選択範囲の複数行全体を対象に replace() したときも * ブックマークがあらぬところに一つだけ残ってしまうようです。 * ( → 選択範囲外の上の行?) * ※ g フラグの有無は関係なし */ var str = document.selection.Text.replace( /hoge/, "fuga" ); if ( document.selection.Text != str ) { document.selection.Text = str; }
| sukemaru | 返信 -
ご報告ありがとうございます。
そうですね、動作につきましても不備は多いようです。
そもそも論理行単位ではなく文字の位置でデータを保持していることが大きな問題なので、これの仕様変更をすることで大幅な高速化が可能となります。> 正しくは「置換対象をふくむ行にはさまれた行のブックマーク情報がおかしくなる」ということになるでしょうか。
置換は、行単位で行っているわけではなく、置換対象の範囲をすべて置換しますのでこういった動作になってしまいますね。これはブックマークの仕組みを変更することで改善できる可能性があります。> > 将来的には、ちょっと仕様変更 (Undo 情報にブックマークを含めない) など、検討していきたいなーと思っています。
しかしながら↑で申し上げた通り、ブックマークの仕様変更にともない Undo にブックマークを含めない方向で検討していますので、行を削除したりして消えてしまったブックマークは Undo で復元されないようになります。Visual Studio やほかのテキストエディタでも Undo で消えたブックマークは復元されないような仕様なので、この部分は一長一短です。
> 素人考えだと、pos ベースの座標ではなく論理行番号 y でブックマーク情報を保存するほうがよいのでは? と単純に考えてしまうところです。
はい、私もそのような仕様にしたいと思っており、すでに試作品もできてはいるのですが、現在のブックマークのデータと互換性が失われてしまうので、今までブックマークを使っていた人はバージョンアップするとブックマークが消えてしまうという点が大きな問題です。> (さすがに ↑ これ ↑ は予想の範囲内でしたし、そもそもこれをやると「変更行の強調」マーキングが全行につくので、こういう大雑把なコードは使いづらかったりもします)
このあたりの仕様も Visual Studio に準拠してますね。行変更のマークは付きっぱなしですけど、マイクロソフトがそれで良いって言うのですからそういうものなのでしょう (w> 将来的にブックマークの仕様を変更するさいには、あわせてご検討ください。
仕組みとしては現在の「変更行」と同じ仕組みを検討していますので、上記の問題は改善されると思います。| Kuro | 返信 -
ご返信、ありがとうございます。
> > > 将来的には、ちょっと仕様変更 (Undo 情報にブックマークを含めない) など、検討していきたいなーと思っています。
> しかしながら↑で申し上げた通り、ブックマークの仕様変更にともない Undo にブックマークを含めない方向で検討していますので、行を削除したりして消えてしまったブックマークは Undo で復元されないようになります。
> Undo で消えたブックマークは復元されないような仕様。
ブックマークの設定/解除がトグルコマンドになっていてマクロに SetBookmark() / RemoveBookmark() のようなメソッドがなかったり、置換や undo でブックマークが意図せずに消えたりということからして、ブックマーク機能と編集履歴とはなにかと相性が悪いみたいですね。
先の全置換のような操作でブックマークがふっ飛んでしまってから「しくじったわ!」とか声をあげながら undo してもブックマーク設定が戻らなくなるというのはちょっときつい気がしますので、ブックマークを操作履歴に結びつける妙案があるといいのですが…。全置換をともなう複雑な編集作業というと "使い捨て" のマクロに正規表現を書いてゴニョゴニョ、というのをたまにやっていましたが、ks さんの「選択範囲を上へ移動」マクロのようにブックマーク情報の退避/復旧用のコードも用意しないといけないのかしら? いままでブックマーク操作のコードを考えたことがないので難しそう。 :(
たぶん編集操作の内容にあわせて、ブックマークを上下にずらすコードとかも必要になったり、想像するだにややこしそうですね。
ブックマークとの付き合いを始めたばかりなので、いろいろと研究しないとなりませんね。> そもそも論理行単位ではなく文字の位置でデータを保持していることが大きな問題なので、これの仕様変更をすることで大幅な高速化が可能となります。
まだブックマーク情報が操作や描画処理の足を引っぱるレベルまで使いこんでいないので、高速化の恩恵を想像できないです。 :D
先日「ブックマークジャンプ」マクロを改造するさいに、 NextBookmark(); GetLine( GetActivePointY() ); のループではなく、Mery.his から情報を読み込んで SetActivePos(); GetLine( GetActivePointY() ); で… とかおもったのですが、あまり意味がありませんでした。ブックマーク情報が論理行番号になればキャレットの移動なしで GetLine( y ) できそうですね(Mery.his を読み込むコストを考えると、あまり意味なさそうかも?)。> 現在のブックマークのデータと互換性が失われてしまうので、今までブックマークを使っていた人はバージョンアップするとブックマークが消えてしまうという点が大きな問題です。
もしも座標の取り方を変えるとなるとそうなってしまうような予想をしていたのですが、やはり…。
マクロで pos 位置座標を論理行/表示行でのケタ・行数 x, y にするコードを作ることを断念した苦い記憶があるので個人的には「何とかしてください」と言いづらいのですが、「それは困る」という人もいるかもしれませんね。
Mery.his にブックマーク情報のあるドキュメントを読みこんで一括変換するようなプラグインか外部 exe を… 、神様。> 仕組みとしては現在の「変更行」と同じ仕組みを検討していますので、上記の問題は改善されると思います。
これまであまり取り沙汰されてこなかったということは、ブックマークを活用している人が少ないということなのでしょうか。それとも、暗黙的な仕様を理解して開発者様のご迷惑にならないよう、沈黙を貫いているのでしょうか。
「ブックマーク一覧」マクロが使いやすくなったので、これからはブックマークを最大限まで利用しようとおもっています。将来の仕様変更に期待して、楽しみに待たせていただきます。 :)| sukemaru | 返信 -
ご返信ありがとうございます。
> ブックマークの設定/解除がトグルコマンドになっていてマクロに SetBookmark() / RemoveBookmark() のようなメソッドがなかったり、置換や undo でブックマークが意図せずに消えたりということからして、ブックマーク機能と編集履歴とはなにかと相性が悪いみたいですね。
ブックマーク機能は、エディタエンジン TNotePad の作者様の開発日誌に、バグだらけでいろんな機能と相性が悪いので廃止したいと書かれていますからね ^^;もともとエディタエンジンが論理行の扱いが苦手な設計になっていたので、ブックマーク機能の実装は非常に苦労されたのだと思います。
現在の Mery のエディタエンジンは、「変更行の強調表示機能」のときに論理行を高速に扱える仕組みを実装しましたので、ブックマーク機能もその仕組みを利用したものに置き換えたいなーと思っています。
> undo してもブックマーク設定が戻らなくなるというのはちょっときつい気がしますので、ブックマークを操作履歴に結びつける妙案があるといいのですが…。
そうなんですよね。Undo にブックマークを含めることは技術的に不可能なわけではないのですが、論理行ベースの仕組みは裏でブックマークのアリ・ナシをすべての行に対して保持しておく必要があり、一文字変更があるたびにそれを Undo データに保存していくことになるので、Undo データがメモリを食いまくるというのが問題なんです。高速にデータを圧縮する方法や、メモリ効率の良いデータ保持の仕組みが思いつけばなんとか何とかなりそうな気もしますが…。
ちなみに、秀〇さんや E〇Editor さんは行削除のあとに Undo するとブックマークは復元されないですね。
> たぶん編集操作の内容にあわせて、ブックマークを上下にずらすコードとかも必要になったり、想像するだにややこしそうですね。
変更行の強調を開発するにあたってそのようなコードを作成しましたが数か月かかりました (w> まだブックマーク情報が操作や描画処理の足を引っぱるレベルまで使いこんでいないので、高速化の恩恵を想像できないです。 :D
100 万行ぐらいのテキストにブックマークを 10 個ぐらい付けると、ブックマークの追加や削除が非常に遅くなります ^^;> (Mery.his を読み込むコストを考えると、あまり意味なさそうかも?)。
コードはシンプルになりそうですね。> もしも座標の取り方を変えるとなるとそうなってしまうような予想をしていたのですが、やはり…。
ブックマークを使っているユーザさんは少なそうなので、Mery.his のほうはそれほど問題ないかもしれませんが、ワークスペース機能のほうで保持される Undo データのファイルがバイナリ形式なので、仕様変更するとバイナリを読み込むときにエラーが出てしまうという点がやっかいです。ベータなんだから仕方ないでしょ。という強気なスタイルもアリかもしれませんが (w
> Mery.his にブックマーク情報のあるドキュメントを読みこんで一括変換するようなプラグインか外部 exe を… 、神様。
論理座標への変換だから、Mery エンジン搭載のコンバータを作らないと無理っぽいですねぇ…。> これまであまり取り沙汰されてこなかったということは、ブックマークを活用している人が少ないということなのでしょうか。それとも、暗黙的な仕様を理解して開発者様のご迷惑にならないよう、沈黙を貫いているのでしょうか。
「バグだらけであるはずの真魚のしおりに、今まで文句が付いたことないのは、
やはり、しおりを使ってる人がいないと言うことだろう」と、エディタエンジンの作者様のブログに書かれていましたから、そういうことなのでしょう…。ちなみに、私は 1 度も使ったことありません (´・ω・`)
| Kuro | 返信 -
追伸です。
論理行ベースのブックマーク機能で試しに Undo にデータを保持してみたところ、100 万行のテキストだと、1 Undo (1 文字入力するごと) に 1MB ぐらいメモリ食ってました…。やっぱ 1 行ごとにブックマークのオン・オフ (1 バイト) を保持するのはちょっと無理がありました。
でも、sukemaru さんの貼ってくれた hoge のマクロは、一番下の選択範囲リプレイス以外は、論理行ブックマークは正常に動作していますので、何とか論理行ブックマークを実現したいですね。
しばらく考えてみます。
| Kuro | 返信 -
さらに追伸です。
Undo データの圧縮をダメもとで試してみたところ、予想以上に高速で 100 万行のテキストでも実用レベルでした。これなら実装できそうです。
あとは、従来のバージョンとの互換性の問題だけですが、ブックマーク機能を使っているユーザさんが少ないという理論に基づいて、「互換性失われちゃった、テヘペロ (๑´ڡ`๑)」で許されるかどうか… ^^;
ブックマークの数をいくら増やしても動作速度に影響がない仕組みなので、いつかは切り替えないといけないわけですが…。
| Kuro | 返信 -
> > たぶん編集操作の内容にあわせて、ブックマークを上下にずらすコードとかも必要になったり、想像するだにややこしそうですね。
> 変更行の強調を開発するにあたってそのようなコードを作成しましたが数か月かかりました (w
うぐぅ…。 X(
先日「行を複製(複数行可)」マクロのブックマーク対応ができたのですが、昨夜は「行を上に移動」「行を下に移動」マクロ(※ ks さんのではなく自作・非公開バージョン)のほうを弄ってみたものの、わけが分からなくなって… undo を叩きまくり、改造前の状態まで差し戻しました。 :(
ブックマーク状態の取得方法が NextBookmark() と GetActivePointY() でのループしかないので、末尾改行をはぶいたさいしょの選択範囲や、上/下の1行を拡張した選択範囲などをいちいち退避/復旧させなければならず、ロースペックな我が脳内 CPU が焼けて耳から出そうになりました。 キャレットの移動なしで "ブックマークの ON/OFF 状態を取得する" ためのメソッド(プロパティ)か、"ブックマークされた論理行番号の配列" を生成するメソッド(プロパティ)が欲しいところです。
(※ ks さんの「行を上下に移動」マクロは、undo するとキャレットがすっ飛んだり、undo のかわりに「上に移動」→「下に移動」を連続で実行しようとすると範囲選択状態がおかしくなってダメだったりするようなので、ちょっと扱いづらい感じでした。あとから "ブックマーク非対応" のコードを投稿するのもどうかとおもって、自作バージョンは公開にいたっていません)「行を複製(複数行可)」マクロのコードもブックマークに対応するために s.Text = s.Text + "\n" + s.Text; で複製するのをやめて、 s.Collapse( meCollapseEnd ); s.Text = "\n" + s.Text; または s.Collapse( meCollapseStart ); s.Text = s.Text + "\n"; で複製テキストを挿入するかたちにしたために、undo すると選択範囲が解除されるさびしい仕様になってしまったので、やはり "ブックマーク状態を取得する" ためのメソッドが欲しいです。
(または Mery の [編集] コマンドに、ブックマークと複数行選択に対応した「行の複製」「行を上/下に移動」コマンドを標準搭載していただければ… )> Undo データの圧縮をダメもとで試してみたところ、予想以上に高速で 100 万行のテキストでも実用レベルでした。これなら実装できそうです。
すごい! すごすぎて理解が追いつきません。 :o
そもそも 5000 行以上のドキュメントをさわることが少ないので想像もつきませんし、うちのロースペPCだと2万行以上のドキュメントをいじるのはきついので…。
将来の仕様変更の検討どころか、そう遠くない更新バージョンで新仕様のブックマークを利用できそうですね。 :)> あとは、従来のバージョンとの互換性の問題だけですが、ブックマーク機能を使っているユーザさんが少ないという理論に基づいて、「互換性失われちゃった、テヘペロ (๑´ڡ`๑)」で許されるかどうか… ^^;
> ブックマークの数をいくら増やしても動作速度に影響がない仕組みなので、いつかは切り替えないといけないわけですが…。
私のわがままのせいではなく、将来的に必要な仕様変更ということのようですので、いたし方ないのではないでしょうか。
ver 2.6.7 からずいぶん機能が増えていることですし、スクロールバーの仕様変更のあたりで 2.7.0 にしてしまおうという方向で「互換性? ゴメンね。 テヘペロ :P」しちゃってください。 :)将来のブックマークの仕様変更は、地味~に「その他の更新内容」あたりに入れられるのでしょうが、素敵な更新として私の脳内ストレージに記憶させます。 :D
p.s. 「SetBookmark() / ClearBookmark() メソッド」はちゃんとありましたね。見落とし、すいませんでした。
p.s.2 開発室の改修、おつかれさまでした。
マクロリファレンスに ChangeCase( meCaseCapitalize ) パラメータや LineEnding() メソッド (※ベータ ver 2.6.10以降) を追加するのは、つぎの正式リリースバージョンが出てからでしょうか?| sukemaru | 返信 -
マクロの開発、お疲れ様です。
> 改造前の状態まで差し戻しました。 :(
私も Mery の開発中はしばしば全戻ししますが、ダメージは大きいですね ^^;> キャレットの移動なしで "ブックマークの ON/OFF 状態を取得する" ためのメソッド(プロパティ)か、"ブックマークされた論理行番号の配列" を生成するメソッド(プロパティ)が欲しいところです。
ブックマーク機能の需要の少なさと、従来の仕様だと論理行にかかわるメソッドの動作速度の問題もありましたので、ブックマーク機能の改善後に、改めて検討してみたいと思います。> (または Mery の [編集] コマンドに、ブックマークと複数行選択に対応した「行の複製」「行を上/下に移動」コマンドを標準搭載していただければ… )
行の上下移動はあっても良いかもしれませんね。> 将来の仕様変更の検討どころか、そう遠くない更新バージョンで新仕様のブックマークを利用できそうですね。 :)
次のバージョンで予定しているスクロールバーへのマーカー描画でブックマークも対象になっているので、できることなら次のバージョンにねじ込みたいところです。> ver 2.6.7 からずいぶん機能が増えていることですし、スクロールバーの仕様変更のあたりで 2.7.0 にしてしまおうという方向で「互換性? ゴメンね。 テヘペロ :P」しちゃってください。 :)
ですねー。なんとか互換性を維持しようと、コンバーターを内蔵する実験をしてみましたが、半日費やして中途半端なものしかできず、本体に無駄な機能が実装されて動作が不安定になっただけというね…。結局、全戻ししました ( ;∀;)2.7.0 にして仕様変更のお知らせを書いて許してもらう方向で行こうと思います。
一応、把握している影響範囲は...
▼ Mery.his の互換性が失われる
→ ブックマークの位置が変わったりするわけではなく、消えるだけなので、まぁ許容範囲でしょう。▼ワークスペース機能
→ 旧バージョンの Workspace.ini や Undo データのブックマークが論理行として認識されてしまうので、新しいバージョンの Mery で旧バージョンのワークスペースのデータを読むと、ブックマークの位置がおかしなことになりますから、手動でブックマークのクリアをしてもらわないといけません。ワークスペース機能はベータ版以降の機能ということで、仕様変更による互換性の問題は勘弁してもらえるような気もします。
> 将来のブックマークの仕様変更は、地味~に「その他の更新内容」あたりに入れられるのでしょうが、素敵な更新として私の脳内ストレージに記憶させます。 :D
ブックマークは、従来は動作速度の問題や不安定という問題もあって、あまり表向きには宣伝していなかった機能なので使っている人が少ないのかもしれません。新しいブックマーク機能はいくつ設置しても動作速度に影響を及ぼさないですし、新機能のスクロールバーマーカーと合わせて使うとブックマークの位置が非常にわかりやすくなりますので、使っていなかった人にも再評価されるかもしれません ^^
> p.s.2 開発室の改修、おつかれさまでした。
ありがとうございます。こっそりメモ的に使っています (w> マクロリファレンスに ChangeCase( meCaseCapitalize ) パラメータや LineEnding() メソッド (※ベータ ver 2.6.10以降) を追加するのは、つぎの正式リリースバージョンが出てからでしょうか?
ご指摘ありがとうございます。
meCaseCapitalize は追加しておきました。Document の LineEnding はメソッドではなくてプロパティのほうにすでにありました。| Kuro | 返信 -
> 行の上下移動はあっても良いかもしれませんね。
これが実現すると、喜ぶ人はけっこう多いかもしれませんね。
私の「行を上/下に移動」マクロの改造も手付かずのままなので、標準コマンドとして実装されるのを期待させていただければ? :P> > キャレットの移動なしで "ブックマークの ON/OFF 状態を取得する" ためのメソッド(プロパティ)か、"ブックマークされた論理行番号の配列" を生成するメソッド(プロパティ)が欲しいところです。
> ブックマーク機能の需要の少なさと、従来の仕様だと論理行にかかわるメソッドの動作速度の問題もありましたので、ブックマーク機能の改善後に、改めて検討してみたいと思います。
YES! よろしくお願いします。
もしかすると「ブックマークジャンプ」マクロって "いらないコ" になっちゃいそうですか? X(
> 新しいブックマーク機能はいくつ設置しても動作速度に影響を及ぼさないですし、新機能のスクロールバーマーカーと合わせて使うとブックマークの位置が非常にわかりやすくなりますので、使っていなかった人にも再評価されるかもしれません ^^
そもそも、"ブックマーク機能を活用するマクロ" というと ks さんの「ブックマーク系コマンド集」でだいたいそろっている気もしますが、今後また新たな活用法も生まれるかもしれませんね。 :D> 次のバージョンで予定しているスクロールバーへのマーカー描画でブックマークも対象になっているので、できることなら次のバージョンにねじ込みたいところです。
おお。なんかすごい急展開で話がすすんで、こわいくらいですね。> 2.7.0 にして仕様変更のお知らせを書いて許してもらう方向で行こうと思います。
> ▼ Mery.his の互換性が失われる
> → ブックマークの位置が変わったりするわけではなく、消えるだけなので、まぁ許容範囲でしょう。
「ブックマークを復元する」マクロ(試作品)を作ってみました。 :)※ Mery.his のバックファイル "Mery.his.old" が必要になるので、ユーザーが「テヘペロ :P」バージョンにアップデートする前(新バージョンを起動する前)に、自分でバックアップファイルを作らなければならないという制限があります。
#title = "ブックマークを復元" #tooltip = "履歴のバックアップファイルからブックマークを復元する" /** * Mery ver. 2.7.0 (2.6.X ?) 以降は * 従来のブックマーク情報との互換性がなくなるので、 * Mery.his ファイルのバックアップファイルから * 旧ブックマーク情報を復元する機能を提供します。 * * ブックマークを復元したいドキュメントをアクティブにして * このマクロを実行してください。 * * ※ Mery.his ファイルのバックアップファイルの名前は * "Mery.his.old" としてください(二重拡張子にする)。 * * ※ Mery ベータバージョン 2.6.X に更新してから * 対象のドキュメントを編集(文字数や行数の変更)していると、 * ブックマーク行がズレてしまうことがあります。 * * ※ ブックマークの復元操作は "アンドゥ" できません。 */ { RestoreBookmark(); Quir(); } /** * 関数 RestoreBookmark() * Mery.his.old ファイルを読みこんで、ブックマークを復元する */ function RestoreBookmark() { if ( ! Confirm( "・ドキュメントが編集(文字数や行数の変更)されていると、 \n" + " ブックマークの行番号が正しく復元されないかもしれません。 \n\n" + "・ブックマークの復元操作は \"アンドゥ\" できません。 \n\n" + " ブックマークの復元を実行してもいいですか? " ) ) { Quit(); } var docuPath = editor.ActiveDocument.FullName; if ( ! docuPath ) { AlertAndQuit( " このドキュメントではブックマークの復元ができません。 " ); } // Mery.his.old ファイルのパス var oldHisPath = editor.FullName.replace( /\.exe$/i , ".his.old" ); var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( ! Fso.FileExists( oldHisPath ) ) { AlertAndQuit( " ''Mery.his.old'' ファイルがありません。 " ); } // Mery.his.old ファイルを読みこむ var Adodb = new ActiveXObject( "ADODB.Stream" ); var adTypeText = 2, adReadAll = -1; Adodb.Type = 2; Adodb.Charset = "UTF-8"; Adodb.Open(); Adodb.LoadFromFile( oldHisPath ); var oldHisText = Adodb.ReadText( -1 ).replace( /\r\n?/g, "\n" ); Adodb.Close(); // Mery.his.old からドキュメントの履歴情報を参照する var escapedPath = docuPath.replace( /[.+^=!${}()[\]\/\\]/g, '\\$&' ); var section = oldHisText.search( new RegExp( "^\\[" + escapedPath + "\\]", "im" ) ); // OutputBar.Writeln( escapedPath ); if ( section < 0 ) { AlertAndQuit( " このドキュメントの履歴情報がありません。 " ); } // ブックマーク情報の開始位置 var bmTop = section + oldHisText.slice( section ).search( /^0=\d+$/m ); // OutputBar.Writeln( bmTop ); // ブックマーク情報の終了位置 var bmBottom = section + oldHisText.slice( section ).search( /\n{2}/ ); // OutputBar.Writeln( bmBottom ); if ( bmTop > bmBottom ) { AlertAndQuit( " このドキュメントのブックマーク情報がありません。 " ); } // ブックマーク情報を配列形式で取得する var bookmarkArray = oldHisText.slice( bmTop, bmBottom ) .replace( /^\d+=(\d+)\r?/gm, "$1" ) .split( "\n" ); OutputBar.Writeln( "\n\"" + docuPath + "\" のブックマークを復元" + "ブックマーク情報: [ " + bookmarkArray + " ]" + "ブックマーク件数: " + bookmarkArray.length + " 件" ); // すべてのブックマークをクリア MEID_EDIT_CLEAR_BOOKMARK = 2129 editor.ExecuteCommandByID( 2129 ); Redraw = false; var s = document.selection; var pos = s.GetActivePos(); var sx = ScrollX, sy = ScrollY; // ブックマークを復元する for ( var i = 0, len = bookmarkArray.length; i < len; i ++ ) { s.SetActivePos( bookmarkArray[i] ); if ( s.GetActivePos() > document.Text.length ) { Alert( "最終行です。" ); break; } s.SetBookmark(); OutputBar.Writeln( "pos = " + s.GetActivePos() + " のブックマークを復旧" ); } s.SetActivePos( pos ); ScrollX = sx, ScrollY = sy; Redraw = false; } /** * 関数 AlertAndQuit( str ) * 警告ダイアログをだしてマクロを終了する */ function AlertAndQuit( str ) { Alert( str ); Quit(); }
| sukemaru | 返信 -
> 「ブックマークを復元する」マクロ(試作品)を作ってみました。 :)
Mery.his のバックアップファイル内に「ブックマーク情報がない」パターンをきちんと取得できていなかったので修正しました。 あと、Quit のスペルミスも ← 前回のコードをログから削除したい。 X(
このマクロに意味があるか分かりませんが… 一応これで完成かしら?#title = "ブックマークを復元" #tooltip = "履歴のバックアップファイルからブックマークを復元する" /** * 「ブックマークを復元」 2019/04/01, sukemaru * * Mery ver 2.7.0 (beta 2.6.x ?) 以降は * 従来のブックマーク情報との互換性がなくなるので、 * Mery.his ファイルのバックアップファイルから * 旧ブックマーク情報を復元する機能を提供します。 * * ※ Mery.his ファイルのバックアップファイルの名前は * "Mery.his.old" としてください(二重拡張子にする)。 * * ブックマークを復元したいドキュメントをアクティブにして * このマクロを実行してください。 * * ※ Mery ver 2.7.0 (beta 2.6.x ?) に更新してから * 対象のドキュメントを編集(文字数や行数の変更)していると、 * ブックマーク行がズレてしまうことがあります。 * * ※ ブックマークの復元操作は "アンドゥ" できません。 */ // ---------- ▼ 設定項目 ▼ ---------- // ■ アウトプットバーにログを出力する? var outputEnable = true; // ---------- ▼ 実行コード ▼ ---------- { RestoreBookmark(); Quit(); } // ---------- ▼ 関数 ▼ ---------- /** * 関数 RestoreBookmark() * Mery.his.old ファイルを読みこんで、ブックマークを復元する */ function RestoreBookmark() { var docuPath = editor.ActiveDocument.FullName || "「無題」 ドキュメント"; // if ( ! editor.ActiveDocument.Saved || ! docuPath ) { // AlertQuit( "ドキュメントを保存してから実行してください。 " ); // } // 「ブックマークを復元」の実行前の確認ダイアログ if ( ! Confirm( docuPath + " \n\n" + " ・ドキュメントが編集(文字数や行数の変更)されていると、 \n" + " ブックマークの行番号が正しく復元されないかもしれません。 \n\n" + " ・ブックマークの復元操作は \"アンドゥ\" できません。 \n\n" + "「ブックマークの復元」 を実行しますか? " ) ) { Quit(); } // Mery.his.old ファイルのパス ※ 仮に「Mery.his.old」としておく // var hisPath = editor.FullName.replace( /\.exe$/i , ".his.old" ); var hisPath = editor.FullName.replace( /\.exe$/i , ".his" ); // 動作確認用 ※「Mery.his」 var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( ! Fso.FileExists( hisPath ) ) { AlertQuit( "Mery フォルダに ''Mery.his.old'' ファイルがありません。 " ); } // Mery.his.old ファイルを読みこむ var Adodb = new ActiveXObject( "ADODB.Stream" ); var adTypeText = 2, adReadAll = -1; Adodb.Type = adTypeText; Adodb.Charset = "UTF-8"; Adodb.Open(); Adodb.LoadFromFile( hisPath ); var hisText = Adodb.ReadText( adReadAll ).replace( /\r\n?/g, "\n" ); Adodb.Close(); // Mery.his.old からドキュメントの履歴情報を参照する // ドキュメントの履歴情報を参照する var escapedPath = docuPath.replace( /[.+^=!${}()[\]\/\\]/g, "\\$&" ); Output( "\nドキュメントのパス: \"" + docuPath + "\"\nMery.his.old から \"" + escapedPath + "\" を検索 ..." ); var hisSection = hisText.search( new RegExp( "^\\[" + escapedPath + "\\]", "im" ) ); Output( "\thisSection:\tpos = " + hisSection ); if ( hisSection < 0 ) { Output( "Error: ∵ hisSection < 0 \t(履歴情報なし)" ); AlertQuit( " ''Mery.his.old'' ファイルに \n このドキュメントの履歴情報はありません。 " ); } // ブックマーク情報の開始位置と終了位置 var bmTop = hisSection + hisText.slice( hisSection ).search( /^0=\d+$/m ); Output( "\tbmTop:\t\tpos = " + bmTop ); // ブックマークがなければ search() の戻り値は -1 var bmBottom = hisSection + hisText.slice( hisSection ).search( /\n{2}/ ); Output( "\tbmBottom:\tpos = " + bmBottom ); // ブックマークがなければ bmBottom < bmTop if ( bmTop < hisSection || bmTop > bmBottom ) { Output( "Error: ∵ " + ( bmTop < hisSection ? "bmTop < hisSection" : "" ) + ( bmTop > bmBottom ? "bmTop > bmBottom" : "" ) + "\t(ブックマーク件数: 0 件)" ); AlertQuit( " ''Mery.his.old'' ファイルに \n このドキュメントのブックマーク情報はありません。 " ); } // ブックマーク情報を配列形式で取得する var bookmarkArray = hisText.slice( bmTop, bmBottom ) .replace( /^\d+=(\d+)/gm, "$1" ) .split( "\n" ); if ( ! bookmarkArray[0].length ) { bookmarkArray.shift(); } var bmCount = bookmarkArray.length; Output( "\tブックマーク情報: [ " + bookmarkArray + " ]" + "\n" + "\tブックマーク件数: " + bmCount + " 件." + "\n\n" + "\tブックマークを復元 ..." ); // if ( ! bmCount ) { // AlertQuit( " ''Mery.his.old'' ファイルに \n このドキュメントのブックマーク情報はありません。 " ); // } // 念のため // すべてのブックマークをクリア MEID_EDIT_CLEAR_BOOKMARK = 2129 if ( Confirm( "バックアップファイルに " + bmCount + " 件のブックマーク情報があります。 " + "\n" + "復元する前に現在のブックマークをすべて解除しますか? " + "\n\n" + "・[OK] なら、現在のブックマーク設定をすべて解除してから " + "\n" + " バックアップファイルのブックマーク情報を復元します。 " + "\n\n" + "・[キャンセル] なら、現在のブックマーク設定に " + "\n" + " バックアップファイルのブックマーク情報を追加します。 " ) ) { editor.ExecuteCommandByID( 2129 ); // MEID_EDIT_CLEAR_BOOKMARK = 2129 } // キャレット位置を保存 var s = document.selection; var act = s.GetActivePos(); var sx = ScrollX, sy = ScrollY; Redraw = false; // ブックマークを復元する for ( var i = 0, y = 0; i < bmCount; i ++ ) { if ( ! ( /^[0-9]+$/ ).test( bookmarkArray[i].toString() ) ) { Output( "Error: " + ( i + 1 ) + " 件目:\t∵ \"" + bookmarkArray[i] + "\" is NOT a pos Number" + " \t(ブックマーク情報ではない)" ) break; // 念のため } s.SetActivePos( bookmarkArray[i] ); if ( s.GetActivePointY( mePosLogical ) == y ) { Output( "\t" + ( i + 1 ) + " 件目のブックマークを設定できません. \t\t\t\t\tpos = " + bookmarkArray[i] ); Alert( "最終行まで復元しました。 " ); break; } s.SetBookmark(); y = s.GetActivePointY( mePosLogical ); Output( "\t" + ( i + 1 ) + " 件目\tのブックマークを設定: " + "\t論理行 No. = # " + y + "\t\tpos = " + bookmarkArray[i] ); } Status = " " + i + " 件のブックマークを復元"; // キャレット位置を復帰 s.SetActivePos( act ); ScrollX = sx, ScrollY = sy; Redraw = false; } /** * 関数 AlertQuit( str ) * 警告ダイアログをだしてマクロを終了する */ function AlertQuit( str ) { if ( str ) { Status = " " + str.replace( /[\n\t ]+|[ ]{2,}/g, " " ); Alert( str ); } Quit(); } /** * 関数 Output( string ) * アウトプットバーに結果を出力する */ function Output( str ) { if ( outputEnable ) { // 出力許可フラグ OutputBar.Writeln( str ); } }
| sukemaru | 返信 -
…そういえば、Mery.his ってインストーラ版では %APPDATA%\Mery フォルダに保存されているのでしね。
前までに貼ったソースコードは Mery.exe のあるフォルダにバックアップファイルがある前提で書いちゃいましたが、%APPDATA%\Mery や任意のフォルダに対応できるように直して、マクロライブラリに投稿しました。
一応、「ブックマークを復元」マクロも実用レベルになったようにおもうので、もしも ver 2.7.0 以降で旧ブックマーク情報を読みこめるようにならないのでしたら( & リリースまでに間に合うのでしたら)、以下のような機能追加を提案いたします。① 2.7.0 以降のバージョンでは Mery.ini にプログラムバージョンを保存する INI キーをあらたに設ける。
② 2.7.0 以降の Mery 起動時には Mery.ini にバージョン情報があるかないかをチェックするようにして、「バージョン情報がない & Mery.his ファイルがある」ときは自動的に Mery.his の複製バックアップファイルをつくる(e.g. "Mery.his.old")。
③ 「必要なら『ブックマークを復元』マクロでなんとかしてね」 :P『ブックマークを復元(Mery 2.7用) - MeryWiki』
https://www.haijin-boys.com/wiki/ブックマークを復元(Mery_2.7用)| sukemaru | 返信 -
マクロのご投稿ありがとうございます。
『ブックマークを復元(Mery 2.7用) - MeryWiki』を使って Ver 2.6.15 の Mery.his を、新しいブックマークの概念を導入した Mery Ver 2.7.0 で Mery.his.old にリネームして試してみましたところうまくいきました。
あ、でもなんか画面が固まった感じになったのでマクロを確認してみましたところ、226 行目付近の Redraw = false は Redraw = true の誤りではないでしょうか?
// キャレット位置を復帰 s.SetActivePos( act ); ScrollX = sx, ScrollY = sy; Redraw = false; // ←ここ
Ver 2.7.0 でも旧ブックマーク情報を読み込めるようにできることはできるのですが、ファイルを開くたびに Mery.his から新ブックマークと旧ブックマークの 2 つの存在確認をしなきゃいけない (つまり Mery.his の全行サーチが 2 回走る) ので、いずれ旧バージョンを使わなくなった時にも無駄な全行サーチが走るという悲しさがあります。
> ① 2.7.0 以降のバージョンでは Mery.ini にプログラムバージョンを保存する INI キーをあらたに設ける。
これは、将来を見据えて Ver 2.6.12 ぐらいから実装しています。キーが存在しない場合は INI バージョン 0 ですね。用意はしていますがまだ使っていません。> ② 2.7.0 以降の Mery 起動時には Mery.ini にバージョン情報があるかないかをチェックするようにして、「バージョン情報がない & Mery.his ファイルがある」ときは自動的に Mery.his の複製バックアップファイルをつくる(e.g. "Mery.his.old")。
> ③ 「必要なら『ブックマークを復元』マクロでなんとかしてね」 :P
ブックマークを復元マクロは保険として使わさせていただくかたちで、いただいたご意見を参考に Ver 2.7.0 の実装は以下のようなものを考えてみました。現在、Mery.his のブックマークのデータって "0=256" みたいに連番と文字位置がセットで記録されていますが、Ver 2.7.0 からは "Mark0=256" みたいに形式を変更します。
こうすることで旧ブックマークのデータとの区別ができるようになりますので、ファイルを開くときに Mery.his に新ブックマークのデータ "Mark0=256" の存在をチェックして、存在していれば新ブックマークとして読み込む。
存在しなくて "0=256" みたいな旧ブックマークのデータがあれば旧ブックマークをコンバートして読み込む。
この仕様なら一応実装はできますが、冒頭で申し上げた通り、いずれ旧バージョンを使わなくなった時にも旧バージョンのデータを検索するために無駄なサーチが一発走りますので、Ver 2.7.0 以降が普及してきたころにはこの処理を外さないといけないっていうのを、私が忘れてしまいそうな点が気がかりではあります (w
| Kuro | 返信 -
ご返信ありがとうございます。
新バージョンの公開間際になって色々と注文をつけてはお手を煩わせてしまい、申しわけない気持ちです(エイプリルフール企画のすぐあとに更新かな、とおもっていたので "すでに遅し" かもとおもっていました)。> 『ブックマークを復元(Mery 2.7用) - MeryWiki』を使って Ver 2.6.15 の Mery.his を、新しいブックマークの概念を導入した Mery Ver 2.7.0 で Mery.his.old にリネームして試してみましたところうまくいきました。
> あ、でもなんか画面が固まった感じになったのでマクロを確認してみましたところ、226 行目付近の Redraw = false は Redraw = true の誤りではないでしょうか?
ありがとうございます。ソースコードを修正して書庫を更新しました。> Ver 2.7.0 でも旧ブックマーク情報を読み込めるようにできることはできるのですが、ファイルを開くたびに Mery.his から新ブックマークと旧ブックマークの 2 つの存在確認をしなきゃいけない (つまり Mery.his の全行サーチが 2 回走る) ので、いずれ旧バージョンを使わなくなった時にも無駄な全行サーチが走るという悲しさがあります。
>
> この仕様なら一応実装はできますが、冒頭で申し上げた通り、いずれ旧バージョンを使わなくなった時にも旧バージョンのデータを検索するために無駄なサーチが一発走りますので、Ver 2.7.0 以降が普及してきたころにはこの処理を外さないといけないっていうのを、私が忘れてしまいそうな点が気がかりではあります (w
スクロールバーの刷新とからめてのブックマーク機能の動作速度の改善と安定が目的でもあることを考えると、本末転倒になってしまいますよね。 Kuro さんが先に言われたような長大なファイルの場合とか…。
強気の「テヘペロ」をする Kuro さんを見れなくなってしまうというのも残念です。 :)
マクロは救済策的な外部の保険でしかありませんが、ブックマーク機能をおもいきり良く仕様変更するお役に立つかと思いますので、強気で GO!
_ ∩
( ゚∀゚)彡 加速!加速!
⊂彡> 現在、Mery.his のブックマークのデータって "0=256" みたいに連番と文字位置がセットで記録されていますが、Ver 2.7.0 からは "Mark0=256" みたいに形式を変更します。
マクロのコードが新ブックマークを誤って読みこんでしまう心配もなさそうですね。 必要性はないでしょうが、検索用の正規表現を書き換えれば新仕様のブックマークにも使えそう。 :)
最大 5000 行程度のファイルに 10~30 件程度のブックマークしかあてていませんが、ブックマーク機能が安定して使えるようになるというのが何よりのギフトです。
おもえば Shift+Ctrl+Down の「次の文字列を検索」が便利すぎて、これを上手に運用して見出し語を追っかけたりすればブックマーク代わりにもなるから、ブックマークが流行らないことに追い討ちをかけているのかもしれませんね。トピックのさいしょの話にもどってベータ ver 2.6.15 でブックマークが消えてしまう件ですが、②に気をつけているつもりでもまだブックマークが飛ぶことがあるので何でだろうと考えてみたら「編集モードの自動選択(書き換え禁止で開く)」イベントマクロが「書き換え禁止」を ON にするのがダメだったみたいです。 (ワークスペース機能の ReadOnly=0/1 とイベントマクロがケンカしてたり …ということではないですよね?)
あと、このマクロで拡張子 JS のファイルを「書き換え禁止」にするようにしてあるのですが、複数の JS ファイルをいっぺんに開いたときにはさいごのタブの JS ファイルしかイベントが適用されないことが多いようです。 うちのPCのスペックが低すぎるせいかもしれませんが、一応イベントの取りこぼし(?)ということで、この場にてご報告させていただきます。
| sukemaru | 返信 -
ご返信ありがとうございます。
> 新バージョンの公開間際になって色々と注文をつけてはお手を煩わせてしまい、申しわけない気持ちです(エイプリルフール企画のすぐあとに更新かな、とおもっていたので "すでに遅し" かもとおもっていました)。
なはは…、当初はその予定でエイプリルフールネタ動画の最後に「4/2 公開!」と出していたのですが、間に合わなくなってしまい、あわてて「Coming Soon」に書き直しました (w> ワークスペース機能の ReadOnly=0/1 とイベントマクロがケンカしてたり …ということではないですよね?
マクロはあくまでも操作を自動化するための機能ですから、標準機能とユーザさんが作成されたマクロとの整合性までは保証できませんので、その点はご理解いただけると幸いです。もちろん、マクロの仕様に問題がある場合は対応させていただきますが、ユーザさんの作成されたマクロを私のほうでチェックしたりなどのサポートまでは手が回らないのでその点はご容赦いただけると幸いです。
> 一応イベントの取りこぼし(?)ということで、この場にてご報告させていただきます。
マクロイベントの「ファイルを開いたとき」イベントは、ファイルを開いたときに発動するよ。というイベントですから、PC が一通り処理を終えてアイドル状態になったあとに発動します。開いたファイルごとにマクロを適用できるわけではありません。というのも、複数のファイルを開いている処理中にマクロから Documents オブジェクトへアクセスされたりすると整合性が取れなくなって動作不良の原因になりますからね。
ファイルを開くときにマクロを適用させたい場合は、コマンドラインオプションの /mf で対応可能です。こちらは複数のファイルを開く際にマクロをそれぞれに適用させられるような仕様になっています。
| Kuro | 返信 -
ご返信、ありがとうございます。
> マクロはあくまでも操作を自動化するための機能ですから、標準機能とユーザさんが作成されたマクロとの整合性までは保証できませんので、その点はご理解いただけると幸いです。
> もちろん、マクロの仕様に問題がある場合は対応させていただきますが、ユーザさんの作成されたマクロを私のほうでチェックしたりなどのサポートまでは手が回らないのでその点はご容赦いただけると幸いです。
諒解いたしました。> マクロイベントの「ファイルを開いたとき」イベントは、ファイルを開いたときに発動するよ。というイベントですから、PC が一通り処理を終えてアイドル状態になったあとに発動します。開いたファイルごとにマクロを適用できるわけではありません。
> というのも、複数のファイルを開いている処理中にマクロから Documents オブジェクトへアクセスされたりすると整合性が取れなくなって動作不良の原因になりますからね。
こちらも諒解いたしました。たしかに連続的に Documents や Editors にアクセスするとなると問題ありそうですね。「編集モードの自動選択(書き換え禁止)」マクロの「include版」を作ってみて動作テストしましたが、「ファイルを開いた時」と
「文書を閉じた時」の両方にイベントを仕掛けても、一応動いてくれました。制限事項はいくつかありますが、とりあえずマクロライブラリに投稿済みです。
「いっぺんにファイルを開いたとき」についてはご説明いただいた仕様にしたがって問題なさそうですが、「連続でタブを閉じたとき」については Editors や Documents をループ処理してファイルリストを生成する仕組みなのでちょっと不安…。「折り返しトグル」マクロの連打のように、環境によってはエラーを出したり Mery の動作を不安定にしたりして?p.s.
このイベントマクロは "D:\free application\Mery\Macros\階層化マクロメニュー\ファイル\10.編集モードの自動選択.js" に保存して Mery の「マクロのカスタマイズ」に非表示扱い(チェックOFF)で登録しているのですが、JSON のファイル名を定義するさいに var json = ScriptName.replace( /\.js$/i, "" ); とすると、どういうわけか別のマクロ xxx.js のベース名になってしまいました。 ← Alert( json ); や Alert( ScriptName ); Alert( ScriptFullName ); などでも別のマクロの名前 xxx やパスに。
かといって、おなじディレクトリで同様の命名規則の "非表示" マクロ(イベント)や、他のディレクトリのマクロで Alert( ScriptName ); をすると正しい名前を返してくれるので再現条件が分かりません。 表示/非表示 の問題ではないようですし、PCのリブートでもダメでした…。
「オマ環」事案かもしれませんが、とりあえず var json = "編集モードの自動選択"; として問題を回避しています。| sukemaru | 返信 -
ご返信ありがとうございます。
> 「文書を閉じた時」の両方にイベントを仕掛けても、一応動いてくれました。制限事項はいくつかありますが、とりあえずマクロライブラリに投稿済みです。
この辺りはマクロの内容によっては動かないものもありそうですが、そこまでの動作検証は無理なので、動かなかったら動かなかったときに考えるスタイルで (w> 「折り返しトグル」マクロの連打のように、環境によってはエラーを出したり Mery の動作を不安定にしたりして?
その可能性はありますね。Excel や Word でもそうですが、マクロって操作を自動化するためのもので、プログラミング言語ではないので、アプリケーション側の状態によってはうまく動かないことってよくあります。このあたりは臨機応変に…。> p.s.
> どういうわけか別のマクロ xxx.js のベース名になってしまいました。
試してみましたところ、確かに再現できました。
どうやら、ScriptName と ScriptFullName は [マクロ] メニューの [実行] の項目に表示されているファイル名を取得しているようです。マクロをイベントから起動した場合もそのファイル名が返ってくるのでダメですね。これは実行中のマクロのファイル名が返ってくるように修正しておこうと思います。
あ、でも #include でインクルードしているときに、#include 側で ScriptName を呼ばれてもそのファイル名が返ってくるわけではなく、おおもとの実行元マクロのファイル名が返ってくる感じになると思います。
| Kuro | 返信 -
ご返信、ありがとうございます。
> 動かなかったら動かなかったときに考えるスタイルで (w
> このあたりは臨機応変に…。
自分のPC、自分の使い方だとふつうに動いちゃってるから厄介なはなしです。 :D> 試してみましたところ、確かに再現できました。
> どうやら、ScriptName と ScriptFullName は [マクロ] メニューの [実行] の項目に表示されているファイル名を取得しているようです。
> ...
ありがとうございます。 :D
「開いた/閉じた」ときだけのイベントマクロですが、JSON 読み書きをさせること自体に無理があったのかとおもっていました(var jason = "編集モードの自動選択" だと問題なかったので、まったくダメということではなかったのでしょうが)。
Alert( ScriptName ) で返ってくるマクロの名前がちょこちょこ変わっていたのはそういうことだったんですね。
for 文の記述に失敗して無限ループにハマったりして頭のてっぺんが「イィーッ!」ってなっていましたので、そこに思い至ることができませんでした...。
MacroSettings フォルダに「なんでこんなにウジャウジャと JSON ファイルがいっぱいあるんじゃい!?」っていうぐらい溜まっていたのも、Alert( ScriptName ) で「行コメント」が返ってくる確率が高かったのも納得です。| sukemaru | 返信 -
「ブックマークを復元」マクロについてですが、現状(Mery 2.6.15)での「書き換え禁止 ON」(読みなおし)操作でブックマークをふっ飛ばしてしまったときのブックマークの復旧にとても役立っています。
書き換え禁止を ON にするのは基本的にファイルが保存されている状態のとき(タブの保護が目的)なので、エディタ上でブックマークが消えてしまっても Mery.his はファイルを保存したときのブックマーク情報を保持しているようで、履歴ファイルにhisPath = editor.FullName.replace( /\.exe$/i , ".his" );
を指定(ポータブル版)してマクロを実行すれば高い確率で成功します。
複数タブ対応の「編集モードの自動選択」マクロや「ファイルの読み直し」マクロの動作テストで開いているタブのブックマークを何度も吹き飛ばしてしまいましたが、そのたびに「ブックマークを復元」マクロが助けてくれました。
マクロライブラリでは「Mery_2.7用」とうたっていますが、「~ Mery_2.6.x用」でのほうが利用価値があるかもしれません。 :)
作ってよかったー。| sukemaru | 返信 -
Mery 2.7.x beta ~ で旧バージョンからのブックマークの移行に何ら問題ないようでしたので、マクロライブラリのトップページから上出のマクロのページへのリンクは削除しました。
別トピックではインデント操作や一括変換操作でもぶくっマークを保持するように対応していただいたので、ブックマーク機能を振る活用させていただいています。 :D…ところが、以下のごとくブックマークに関しての不自然な挙動に気付きましたので、あらためてご報告させていただきます。
【発生条件】
ブックマークされている行が「折り返し」を含む長い行であるとき【異常な挙動】
Mery (32bit) 2.8.5 ポータブルモード × Win XP にて、以下のようなパターンを確認しました。• 折り返しのある行の「行頭位置」で改行するとブックマークが解除される
(※ 折り返し ナシ なら、ちゃんと改行前の行にブックマークが残る)• 折り返しのある行で「折り返しを含む選択範囲」を編集(文字列の上書き、改行、切取り、貼付け、置換 など)するとブックマークが解除される
(※ TAB キーだとブックマークは解除されずにインデントされた)• 折り返しのある行の「途中(折り返し位置よりも前)」で改行するとブックマークが下の行に移動する
どうやら「折り返しを含む範囲」への編集操作で何らかの条件(?)がマッチすると異常な挙動が起きるようで、キーボードでの手動操作とマクロによる文字列操作の両方で発生しました。
これらは、選択範囲なし、改行以外のキー操作でポチポチと文字入力している場合には発生しませんでした。
「すべて置換」などの自動操作で条件にマッチしてしまった場合、ブックマーク状態の変化に気付きづらいかもしれないですね…。また、「行の表示方法」においては "論理座標"/"表示座標" の両方で起きるようですが、"表示座標" での検証には自信ありません(私は論理行で表示がデフォなので)。
あと、Ctrl+Z で元に戻すと編集操作前の状態に復旧できますが、「少し便利な Undo」マクロだとブックマーク状態は復旧されません…。 なんでだろ~? XD
https://www.haijin-boys.com/wiki/ファイルへ移動(物理座標ジャンプ)
これは別件の実験マクロですが、
> 折り返しの多いファイルではうまく機能しないので、なにか失敗しているっぽい?
> とくに「指定文字数で折り返し」のばあい、論理行でジャンプしたまま終わってしまいます。
> GetActivePointY() の mePosView/mePosLogical が同じ値を返してきますし、すでに開いているファイルへの実行ならきちんと表示行でジャンプするので、よくわかりません。 :(
「折り返し」を有効にしている場合の不自然な挙動というのは他にもあるかもしれませんね。----
【余談】
ブックマークと関係ないですが…TAB キー入力って、選択範囲が改行を含んでいなくても「表示行数で複数行をまたいでいる」ならインデントなんですね。
「行の表示方法」で挙動が変わる分にはまだしも、おなじ選択範囲にたいして「折り返し方法」の状態でキー操作の作用がちがうというのは不自然な気がしました。• TeraPad、notepad++ は「改行を含んでいなければ」タブ文字で上書き(← コレが好き)
• サクラ、gPad は Mery とおなじく「折り返しを含んでいるなら」インデント
• MS Word 2003 でも Mery と似たような挙動でしたが、なぜかバグっているようで「選択範囲 Delete」+「行頭でインデント」の2アクションが同時に発生… (→ 元に戻すのも 2-UNDO)行の途中をタブ文字に置きかえたいときに折り返し部分にマッチしてしまうと…とか、ちょっと不便な気もしますが、基本的な操作としてこの仕様で定着しているでしょうから、今さらかしら?
Delete >> Tab の2キー操作をすればいいだけの話ですよね。 :| sukemaru | 返信 -
ご報告ありがとうございます。
> • 折り返しのある行の「行頭位置」で改行するとブックマークが解除される
> (※ 折り返し ナシ なら、ちゃんと改行前の行にブックマークが残る)確認してみましたところ、折り返しのある行のブックマークが解除されるわけではないようですが、下の行に移動しますね。
折り返しなしの行と折り返しありの行で動作を統一したほうが良さそうですね。
> • 折り返しのある行で「折り返しを含む選択範囲」を編集(文字列の上書き、改行、切取り、貼付け、置換 など)するとブックマークが解除される
これは再現しました。対策を調査してみますね。
> • 折り返しのある行の「途中(折り返し位置よりも前)」で改行するとブックマークが下の行に移動する
これも再現しました。ブックマーク機能はかなり無理してるのでなかなか安定しませんね ^^; ご不便をおかけして申し訳ございません。
> あと、Ctrl+Z で元に戻すと編集操作前の状態に復旧できますが、「少し便利な Undo」マクロだとブックマーク状態は復旧されません…。 なんでだろ~? XD
軽く眺めてみましたが謎ですね。マクロの解析となると非常に時間がかかります。すみませんが、ユーザ作成のマクロの調査はサポート外とさせていただいていますのでご了承ください。でも原因がわかったら教えてくれると嬉しいです (w
> TAB キー入力って、選択範囲が改行を含んでいなくても「表示行数で複数行をまたいでいる」ならインデントなんですね。
そうですね、確かに改行を含んでいないのにインデントされるのはなんとなく違う気はしますが、秀〇さんがこの仕様なんですよねぇ。
Mery 的にはどちらでも技術的に可能ですが、特にご要望などをいただいたことはないので私が愛用していた秀〇さんをベースにしています。
個人的には TAB をインデント以外で使う機会はほぼないので、どちらでも構わないのですが ^^;
たぶん仕様変更しても誰も気づかないレベルでしょう…。
| Kuro | 返信 -
ご返信、ありがとうございます。
>> • 折り返しのある行の「行頭位置」で改行するとブックマークが解除される
>> (※ 折り返し ナシ なら、ちゃんと改行前の行にブックマークが残る)
> 確認してみましたところ、折り返しのある行のブックマークが解除されるわけではないようですが、下の行に移動しますね。
すいません。「解除される」ではなく、意味的には3点目と同じみたいですね。異常の発生には少し前から気付いていたのですが、再現条件を確定してご報告するまでが遅くなってしまいました。
条件が分かっていれば使用上どうということもないことではありますが、対策よろしくお願いします。
(ブックマーク機能の側だけではなく、折り返し側もなにかを孕んでいそうな?)> 「少し便利な Undo」マクロ
コード内の do - while 条件つきループ部分はややこしいですが、「操作」メソッドは Undo() と SetActivePos/SetAnchorPos() だけっぽいんですよね。
Document.Undo(); だけのテストマクロで「元に戻す」ぶんには(必要に応じて連打)ブックマークも復旧されるので、「少し便利な Undo」マクロでなにが障害になっているのかは謎です。
どなたか分かる方に降臨していただけるとよいのですが、「ブックマーク」ネタのトピックを読む人がいるかどうか…。 :D>> TAB キー入力
> Mery 的にはどちらでも技術的に可能
> 個人的には TAB をインデント以外で使う機会はほぼないので、どちらでも構わないのですが ^^;
> たぶん仕様変更しても誰も気づかないレベルでしょう…。
私の場合、Mery の前には TeraPad を使っていたので馴染めなかった部分です。 :(
すこし前までは「折り返しも複数行扱いになる」ことに気付いてなくて、どういう条件で別の動作になるのかも分かっていませんでした。コードなどを投稿するさいにタブ文字を使えない掲示板などでは代用として 【TAB】 と書いてある場合があって、そういうコードをコピペしてからタブ文字で上書きするさいなどに「!?」となることがしばしばありました。
また、手直し作業のときなど右手がマウスに乗っていると左手で Delete/BackSpace と Tab を叩くのが億劫で、マクロの自作をはじめてから早い段階で「インデント/逆インデント」に着手したという経緯があります…。 :)
「インデント」マクロの設定項目には色々な使い方を想定して tabEnable = 0~3 の変数を用意してありますけど、「分かっていなかった」から、論理行ベースでのみ 1行/複数行 かでの振り分けをできるようにしてあって、「折り返し」までは考慮していませんね。 :|| sukemaru | 返信 -
ご返信ありがとうございます。
すみません、時間が取れなくてまだ詳細までは調査できていないのですが、次のバージョンには修正を含められるようにがんばってみます ^^;
> 私の場合、Mery の前には TeraPad を使っていたので馴染めなかった部分です。 :(
TeraPad さんはシンプルで素敵なエディタですね。まさに理想的なテキストエディタだと思います。
このトピックを見てくれている人からもご意見を頂ければ、多数決で仕様変更も考えますが… (見てる人いない? ^^;
私個人の意見としては、どっちでもいいです (w
| Kuro | 返信 -
> このトピックを見てくれている人からもご意見を頂ければ、多数決で仕様変更も考えますが… (見てる人いない? ^^;
見てますよーでも触りたくなかったっていうか……
うーん、おかしなところばかりで納得できる要素が1つもないですね
私は反対です、現状維持に一票です| シリル | 返信 -
> 多数決で仕様変更も考えますが…
ながらく定着している操作方法でしょうし、ふだんの「行の表示方法」が論理行か物理行かで捉え方がちがってくる部分だとおもいますから、まるっと「仕様変更」はよろしくなさそうですよね。
私としては、もし INI オプションで切り替えられるようにしていただけるなら TeraPad 式を使いたいですが、物理行ベースの「折り返しまたぎで動作が変わる」ということが確認できましたので今のままでも大丈夫ですよ。 :)| sukemaru | 返信 -
>> シリル さん
現状維持に 1 票、ありがとうございます。確かに、この仕様につきましては Mery 公開以来 10 年以上、仕様変更のご要望をいただいたことがなかったので、多くのユーザさんは現状の仕様で特に不都合がないということなのでしょうね ^^;
>> sukemaru さん
> ながらく定着している操作方法でしょうし、ふだんの「行の表示方法」が論理行か物理行かで捉え方がちがってくる部分だとおもいますから、まるっと「仕様変更」はよろしくなさそうですよね。そのようですね。標準仕様としての実装はやめておこうと思います。
> 私としては、もし INI オプションで切り替えられるようにしていただけるなら TeraPad 式を使いたいですが、物理行ベースの「折り返しまたぎで動作が変わる」ということが確認できましたので今のままでも大丈夫ですよ。 :)
とりあえず現状維持とさせていただきますね。
オプションでの切り替えにつきましては、ご要望が多ければ検討してみたいと思います。
| Kuro | 返信 -
> 次のバージョンには修正を含められるように
Ver 2.8.6 ベータ版、更新おつかれさまです & 修正ありがとうございます。
ブックマーク機能が手放せなくなっているので、修正していただけたこと、大変うれしいです。 :D
ブックマークをつけたドキュメントが増えて、他のエディタで修正・編集しちゃいけなくなっていますし、マクロ/アイコン漬けの状態にはまっちゃっていますから、リッチテキスト以外はすっかり Mery 1本での運用体制です。 :)| sukemaru | 返信 -
ご確認ありがとうございます。
なかなか深い部分の修正だったので時間がかかってしまいましたが、うまく動いているようで安心しました。
| Kuro | 返信