![]() |
第I部〜秀丸エディタQ&A集
|
[HMM0051A]
●version キーワードの使い道は?
![]() | 秀丸マクロの新しいバージョンの機能を実装しているかどうか調べるために version キーワードを使ってみましたが、文法エラーが回避できません。 |
![]() | version キーワードを使って、あるバージョンから実装されたマクロ命令を使うかどうか振り分けることは、できそうに思えますができません。秀丸は少なくとも現在の仕様では、マクロを実行前に一旦すべて文法チェックする仕様のようなので、version を使っても、バージョン判別ルーチンが実行されること無く、文法エラーがあるというダイアログを出して止まってしまいます。
では version の使い道が無いかというとそうでもなく、あるバージョンの秀丸で当該のマクロ実行に致命的なバグがあることが既に分かっている場合に、そのバージョンの秀丸での実行を禁止させるために使うことができます。 |
[HMM0052A]
●秀丸95のレジストリ操作と16bit版秀丸の共通化
![]() | 16bit版秀丸ではhidemaru.iniに設定が保存されていましたが、秀丸95ではレジストリに保存されるようになりました。どちらの秀丸でも動作できる方法はありますか? |
![]() | getinistr/getininum 等で、ファイル名を "hidemaru.ini" にすると、秀丸95ではレジストリに対して読み書きをします。秀丸95と16bit版秀丸両用のマクロを作る場合や、レジストリについてよく分からない人(^^;)は、これらのマクロ命令を使うようにします。秀丸マクロヘルプの getinistr/getininum のところに記述があります。 |
[HMM0053A]
●ワードラップと折り返し
![]() | 秀丸によって折り返し文字数のところで折り返された行頭のところで空白を挿入しようとしても、挿入されないことがあるようなのですが……。 | |
![]() | ワードラップ機能によって折り返されている場合は、挿入した空白が前行の行末に付きますので、それが正常な動作です。ワードラップの設定がされているかどうかはキーワードでは分からないので、以下のように設定ファイルから参照します。
|
[HMM0054A]
●16bit版秀丸のmovetolinenoのバグ
![]() | 16bit版秀丸で、movetolineno 文でテキストの最終行に飛ばすように指定しても、その1つ前の行に飛んでしまいます。 | |
![]() | これは16bit版秀丸の一部のバージョンにあったバグです。秀丸95では起きないのですが、秀丸95でも16bit版秀丸でも動作する汎用のマクロを作ろうとすると避けて通れません。(^^;)
このバグの回避方法の例を以下に示します。
|
[HMM0055A]
●文章作成日時を挿入するには?
![]() | 編集中のファイルに現在の日時を挿入したいのですが、何か簡単な方法はないでしょうか?(手で書くのでは不便です) | |
![]() | 以下のようなマクロを使えば簡単に実現できます。
|
[HMM0056A]
●複数のウィンドウ間を移動したい
![]() | openfile 文でファイルを開くと、その後の処理は今開いたファイルに対して行われますが、元のファイルに戻るにはどうしたらよいのでしょうか? | |
![]() | 既に開かれている秀丸のウィンドウをアクティブにする(画面の一番手前に持ってくる)には、setactivehidemaru 文を使います。
※ hidemaruhandle() 関数についてはマクロヘルプの「秀丸管理」の説明と「●setactivehidemaru 文の引数」を参照して下さい。 |
[HMM0057A]
●秀丸ウィンドウを閉じたい
![]() | マクロから開いたウィンドウを閉じて元のウィンドウに戻りたいのですが。 | |
![]() | 手順としては、元のウィンドウに戻ってからウィンドウを閉じる、となります。下記のサンプルを参考にして下さい。
|
[HMM0058A]
●setactivehidemaru 文の引数
![]() | setactivehidemaru 文を使って編集ウィンドウを切り替えたいのですが、使い方がよく分かりません。 | ||||
![]() | setactivehidemaru 文には秀丸ウィンドウの「番号」か「ウィンドウハンドル」を指定します。
[解説]
|
[HMM0059A]
●ウィンドウを見えなくしたい
![]() | マクロから別のウィンドウを開いているのですが、そのウィンドウを見えなくする事は可能でしょうか? | |
![]() | 起動オプションの「ステルス起動(/h)」を使えばできます。
なお、ステルスウィンドウに対する findwindow() 関数は失敗する場合が多いので、なるべく開いた「直後」に hidemaruhandle( 0 ) でウィンドウハンドルを取得しておきましょう。 |
[HMM0060A]
●「キーワード」とは?
![]() | 現在マクロを実行しているウィンドウに関する情報を取得したいのですが。 |
![]() | 秀丸マクロにはそのような情報を格納している「キーワード」と呼ばれる特殊な変数が用意されています。マクロヘルプの「式について」→「内部的な値を表現するキーワード」を参照して下さい。
※ なお、キーワードの値は「ウィンドウ」毎に定義されています。
|
[HMM0061A]
●「キーワード」の使い方
![]() | 「キーワード」の使い方がよくわかりません。 | |
![]() | 「キーワード」の使い方は普通の変数("$"または"$$"で始まる文字列変数、"#"または"##"で始まる整数型変数)の使い方と同じです。つまり、文字列操作関数の引数に使用したり、算術式の中に入れたり、別の変数への代入等ができます。但し「キーワードへの代入」はできません(以下の例を参照して下さい)。
(例)ファイル名を変えるのに filename というキーワードの値を変えようとした。
|
[HMM0062A]
●フォルダの存在を確認したい
![]() | existfile() 関数を使えばファイルの存在を確認できるようですが、フォルダの存在を確認する事はできないですか? | ||
![]() | existfile() 関数の引数にフォルダ名+"nul"を指定すればよいです。
以下はそのサンプルです。
|
[HMM0063A]
●メニュー項目を揃えたい
![]() | menu 文等で各項目をきちんと揃えて表示したいのですが? | |
![]() | ワープロソフトでやるような自由な「タブ指定」はできませんが、以下の様なやり方で何とか(^^;揃える事はできます。
|
[HMM0064A]
●メニューに色を付けたい
![]() | menu 文等で、項目の文字列の色を変える事はできますか? |
![]() | できません(裏ワザを知ってる方はご一報下さい(^^;)。 |
[HMM0065A]
●menuarray 文の引数を自由に設定したい
![]() | menuarray 文等で、第1引数の配列の指定を途中(ex. $a[2])からしたり、途中で止めたりする事はできませんか? | |||
![]() | まず、
[参考]
|
[HMM0066A]
●Windows3.1で動いたマクロがWindows95で動かない?
![]() | Windows3.1では正しく動いていたマクロを秀丸95で実行したら「バッファが溢れた」と言われ、動かすことが出来ません。秀丸マクロは上位互換のはずですが…。 |
![]() | 秀丸95のごく初期のバージョンでは、マクロ言語の内部処理が32bit化されたのにバッファ量がそのままだったので、実質的にバッファが狭くなっていたようです。Ver.2.13 以降ではバッファのサイズが倍増されおり、まったく問題はありません。 |
[HMM0067A]
●マクロで引用符を取得するには
![]() | 秀丸マクロの中で、秀丸で設定されている引用符を文字列として取得したいのですが、どうすればいいですか? | |
![]() | 以下のマクロ例を参考にしてください。
[解説]
|
[HMM0068A]
●マクロ中の演算子の意味は?
![]() | 秀丸マクロに使える演算子がヘルプに書いてありますが、私はC言語を知らないので、演算子の意味がわかりません。(^^;) |
![]() | 以下の表とマクロ例を参考にしてみてください。
|
算術演算子 + 加算 - 減算 * 乗算 / 除算(商) % 剰余(MOD) 論理演算子 <= (右辺)は(左辺)以上 >= (右辺)は(左辺)以下 < (右辺)は(左辺)より大きい > (右辺)は(左辺)より小さい != (右辺)は(左辺)と違う == (右辺)は(左辺)と同じ && AND:(左辺)かつ(右辺) || OR:(左辺)または(右辺) ! NOT:(右辺)ではない ビット演算子 | OR & AND ^ XOR
- 算術演算子の例
秀丸の数値変数は整数型なので、/(除算)は余りを切り捨てた商の値になります。
// 除算のマクロ例(ここから)
#a = 17;
#b = 5;
#c = #a / #b;
#d = #a % #b;
message str(#c); // 3が表示される
message str(#d); // 2が表示される
endmacro;
// (ここまで)+(加算)は文字変数にも使えます。ということは、秀丸マクロ言語は文字変数についてはC言語よりも BASIC 等に近いと言えます。
// 文字列加算のマクロ例(ここから)
$a = "秀丸がインストールされているフォルダは、";
$b = hidemarudir;
$c = $a + $b;
message $c;
endmacro;
// (ここまで)
- 論理演算子の例
// 論理演算子のマクロ例(ここから)
// 現在のカーソル位置の文字種を判定します。
#c = code;
if (#c > 0xff) {message "2バイト文字です";} else if (#c == 32) {message "半角スペースです";} else if ((#c >= 0x41) && (#c <= 0x5a)) {// #cが41(16進)以上、かつ#cが5a(16進)以下} else {
message "半角アルファベットの大文字です";message "その他の1バイト文字です";}
endmacro;
// (ここまで)比較演算子は文字変数に対しても使うことができます。
// 論理演算子のマクロ例2(ここから)
// 現在のカーソル位置の文字種を判定します。
$c = char(code);
if ($c == " ") {message "半角スペースです";} else if (($c >= "A") && ($c <= "Z")) {message "半角アルファベットの大文字です";} else {message "その他の文字です";}
endmacro;
// (ここまで)
- ビット演算子の例
// ビット演算子の例(ここから)
// 現在の文字コードを判定します。
#c = charset & 63;
if ((#c == 0) || (#c == 1)) {message "SHIFT-JISです";} else {message "SHIFT-JIS以外の文字コードです";}
endmacro;
// (ここまで)
[HMM0069A]
●マクロ処理中にダイアログボックスを出す方法
![]() | マクロ処理中にダイアログボックスを出して、「処理中です」と表示させたいのですが?。 | |
![]() | 全ての場合についてできるわけではないですが、while ループかなんかで処理をするような場合については「秀まるおのマクロサーバ」を使って以下の様な感じで何とかなるんじゃないでしょうか?
以下の例では、"0"〜"9"の文字を繰り返し1000個まで表示させます。「中止」ボタンをクリックすると処理を中断します。
|
[HMM0070A]
●入力チェック、変数チェックを簡単に行う方法
![]() | 入力チェック、変数のチェックを行うとき if の文が複雑になります。それをできるマクロの関数はありますか ? | ||
![]() | チェック専用の関数はありませんが、入力チェックをするときに、色々な値がある場合には、if で strstr 関数を使用すると文が簡単になります。
この a1.mac と a2.mac は同じ結果となります。"|" は、一般的には区切文字 (区切記号) と呼ばれ、入力文字としてありえない文字を使用すると文が見やすくなります。全角文字 (Shift-JIS の場合) を処理するときには、! - / などの 0x40 (16 進数) より小さな文字を区切文字にします。 全角半角の文字が混在するときは完璧なチェック方法にはなりませんが、実用レベルには耐えるでしょう。 |
[HMM0071A]
●入力が数値、整数であるかのチェック方法
![]() | 簡単なニューメリックチェック法(入力が数値、整数であるかのチェック)はありませんか ? | |
![]() | 入力がニューメリック(数値、整数)であるかのチェックは厳密に行うと複雑なロジックになりがちです。ここでは簡単なチェック方法を示します。
入力文字列を、val 関数で数値にして、次に str 関数で文字列にして、最初の入力文字列と比較しています。完璧なチェック方法ではありませんが、実用レベルには耐えるでしょう。この例では、+ 符号、全角文字 (数字) の考慮はありません。 |
[HMM0072A]
●2バイト文字の判断方法
![]() | カーソル位置にある文字が、1バイト文字か2バイト文字かを判断するにはどうしたらいいでしょうか? | |
![]() | 秀丸の内部キーワード「code」を使い、ビット演算を使って2バイト文字かどうかを判断することで、可能です。
文字列変数の中の文字列をバイト単位ではなく文字単位で扱いたい場合は、[HMM0073A] ●文字列をバイト単位ではなく文字単位で扱う を参照して下さい。 |
[HMM0073A]
●文字列をバイト単位ではなく文字単位で扱う
![]() | 「strlen」等の文字列操作関数はバイト単位となっていますが、文字単位で扱うことはできないでしょうか?1バイト文字と2バイト文字が混在している時に、とても困ります。 | |
![]() | 秀丸の関数「ascii」は先頭文字が2バイト文字の場合に値を2バイトで返すので、ビット演算を使って2バイト文字かどうかを判断することで、可能です。
なお、秀丸マクロでは文字コードをSHIFT-JISで扱っているため、文字列中の任意の場所の文字コードを判別するには、文字列の先頭から順番に検索する必要があります。
|
[HMM0074A]
●文字列の後方から文字列を検索
![]() | 文字列の後方から文字列を検索する方法はありますか?ロングファイル名での拡張子取得で、「.」を後方から検索したいのですが。 | |
![]() | 文字列の先頭から文字列が見つからなくなるまで複数回検索することで可能です。
|
[HMM0075A]
●浮動小数点数版秀丸との互換性
![]() | 浮動小数点数バージョンの秀丸でマクロを実行すると、これまで通常の秀丸で動作していたマクロの一部が誤動作するのですが、互換性が無いのでしょうか?。 | |
![]() | 浮動小数点数バージョンの秀丸は、秀丸マクロの数値型変数に、浮動小数点数を格納できるようにしたものです。
マクロの文法は、数値 (リテラル) の書き方以外は100%互換がありますが、
前者は比較的単純な話で、例えば、 #i = 1.5 ;というのは浮動小数点数版では正常なコーディングですが、通常版ではエラーになります。 また、通常版秀丸では、4 バイトの符号付き整数(-2147483647〜+2147483648) なので、極端に大きい/小さい値を扱っている場合、浮動小数点版では問題ないが通常版秀丸では値がおかしくなります。 後者の例としては、/ (除算)の演算結果を変数に格納すると、通常版秀丸では整数の商が入り、余りが切り捨てられます。しかし、浮動小数点数版秀丸では、小数まで含んだ解が入ります。
以下の例は、#space個の半角スペースを$spaceに格納する例です。単にループして半角スペースを1個ずつ足していくよりも、以下のようにしたほうが秀丸マクロでは実行速度が出ます。
通常版も浮動小数点数版も同様に動作させるための方法は、意図している動作とロジックの関係で、必ずしも一概にはいえませんが、この例の場合、while文を while (#sp1 >= 1) {と変更することで、通常版も浮動小数点数版でも同様に動作するようになります。 あるいは、常に整数の商を得るため、 #sp1 = (#space - (#space % 80)) / 80;としてもよいでしょう。 |
[HMM0076A]
●重複行の削除
![]() | 重複行の削除はできませんか?。 | |
![]() | 1 行の長さが改行を含め (半角で) 8191 文字以内なら下記のマクロで可能です。
|