2010年10月14日

EmEditorでファイル名取得と正規表現

 私はエディタとしてEmEditorを使っているが、このマクロも色々作ってて、記録しておきたい事を書いてみる。
 考えたら、EmEditorのマクロについては、まだこのブログで書いてなかったので、これから機会があれば書いてみたいと思う。

 他マクロなど、まとめはこちらLink


EmEditorでファイル名を拡張子無しで取得

 EmEditorでやりたい事があった。それは、

「現在編集中のファイル名を拡張子無しで取得」

 ヘルプを調べたら、「strName = document.Name;」で変数に入れられるが、これでは拡張子が入る。また「document.CopyFullName();」だとクリップボードに入るが、フルパスしかできない。
 さあ困った、と考えて思い付いたのが、

ファイル名をフルパスでコピー
   ↓
新規文書を作って貼付
   ↓
編集してパスと拡張子を消す
   ↓
残ったものを取得
   ↓
その文書を破棄

 つまり、ファイル名取得のために1つ文書を開いて済んだら閉じるという、若干姑息な手段を取る。
 それで作ったものがこれ。
拡張子無しファイル名取得マクロ
document.CopyFullName();          // ファイル名取得
editor.ExecuteCommandByID(4123); // 新規文書に貼付

document.selection.Replace("^.*\\\\","" ,
eeReplaceAll | eeFindReplaceRegExp); // パス削除
document.selection.Replace("\\.[^\\.]*$","" ,
eeReplaceAll | eeFindReplaceRegExp); // 拡張子削除

document.selection.SelectAll(); // 全選択
File_Name = document.selection.Text; // 変数に入れる
editor.ExecuteCommandByID(4120); // 文書を破棄

 パスと拡張子を消す方法として文書の一括置換を使っているが、正規表現でフルパス名から最後の「\」と最後の「.」を判別するようにしている。
 ついでに、これについて書いてみる。

正規表現について

 行頭は「^」、行末は「$」、特定の文字までの範囲を取るために「.*」「[^abc]*」を使うが、例えばaが複数あった場合、「.*a」だと最後のaまで、「[^a]*」だと最初のaまでを範囲として取ってくれる。
 これを利用すれば次の事が可能。

以下の文書を検索した場合、
111a222a333a444a555

行頭から最初のaまで検索:^[^a]*a → 111a222a333a444a555
行頭から最後のaまで検索:^.*a → 111a222a333a444a555
最後のaから行末まで検索:a[^a]*$ → 111a222a333a444a555
最初のaから行末まで検索:a.*$ → 111a222a333a444a555

 でもこの場合、「a」の文字も含まれてしまう。含めたくない場合は、
行頭から最初のa手前まで検索:^[^a]* → 111a222a333a444a555
最後のaの次から行末まで検索:[^a]*$ → 111a222a333a444a555

 行頭から最後のaの手前までは置換に限るが、「.*」「()」を使ったパターンを利用して、
検索文字列:(^.*)(a)
置換文字列:000\2

111a222a333a444a555 → 000a555
 とするのがいいと思う。

( 2012/12/05 追記 )
 この方法は、EmEditorのマクロ命令のみを使用していたのでややこしい事をやっているが、Javascriptの置換「replace」を利用したら、たった1行
// ファイル名を拡張子無しで取得
FileName = document.Name.replace(/\.[^\.]*$/,"");
 これだけで済むので、追記。

( 2012/12/31 追記 )
 更に修正版を追加
EmEditor・検索の正規表現について修正版




posted by 司隆 at 14:39 | Comment(0) | TrackBack(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。