おもいつきでマクロ書いた

久々に思いつきでサクラエディタマクロ×3つほど書いたので晒しときます。

  • tagJumpEx.js

タグジャンプをやるんだけど、その前にいろいろあがいてみるやつ。
タグジャンプのキーと置き換えるとなかなか便利かも。
※2008/12/08修正
thisの使い方間違ってた!!><
ので修正。
※2008/12/21さらに修正
オブジェクトのコピーめんどいので、メソッド追加


// タグジャンプ拡張
// 1→5の順に試行する。
// 1. Grepファイルかチェックしタグジャンプ。(でも範囲選択してたらジャンプしない。)
// 2. 選択文字列でファイルを検索(URL含む)
// 3. pattern 検索
// → ./ + env 展開 + findDirs を使用して action メソッドで検索
// (デフォルトは単純にマッチした文字列で検索。ディレクトリの区切りに /,\ を使用していない場合は、actionメソッドを定義する必要がある。)
// 4. jump で検索し、存在すれば該当行にジャンプ
// 5. タグジャンプする。

var e = Editor;
// ActiveX生成
var fso = new ActiveXObject('Scripting.FileSystemObject')
var sh = new ActiveXObject('WScript.Shell');
var urlregex = /https?:/;

// 設定(拡張子がキーとなる。指定されていない項目は、なくてもそれなりに動くはず。)
var Template = function(){this.initialize.apply(this,arguments);};
Template.prototype = {
initialize: function(){
this.copy('cpp' ,['c','h']);
this.copy('java' ,['jav','jsp','jad']);
this.copy('pl' ,['cgi','pm']);
this.copy('vbs' ,['bas','cls','frm']);
},
cpp: {
pattern: /include\s+["']([^"']+)["']/,
env:['INCLUDE'],
findDirs:['./inc']
},
java: {
patterm: /import\s+["']([^"']+)["']/,
action: function(str, dirs){ // str=pattern.\1, dirs = ./ + env + findDirs
var names = str.split(".");
var bases = e.GetFilename().split('\\');
for (var i=0, dir='', l=bases.length; i

  • Tsv2Array.js

TsvをJavascriptのArrayに変えるもの。
多分ちょっと変えればCとかJavaとかにもできるはず。


// Tsv -> Array
var e = Editor;

main();

function main(){
// 桁位置復元用
e.MoveHistSet();
// 選択範囲がなければ全選択
if (e.IsTextSelected == 0) e.SelectAll();

text = e.GetSelectedString(0).replace(/\r\n/g,"\n").replace(/\r/g,"\n"); // 改行を\nで統一

e.InsText( modifyReturnCode(
convertString(text)
));
// 桁位置を復元
e.MoveHistPrev();
}

// 改行コードを現在の文書に合わせる
function modifyReturnCode(text){
var l = new Array("\r\n","\r","\n");
// return text.replace(/\r\n/g,"\n").replace(/\r/g,"\n").replace(/\n/g, l[e.GetLineCode()]);
return text.replace(/\n/g,l[e.GetLineCode()]);
}

// 文字列生成
function convertString(text){
text = text.replace(/\n$/g,'');
var line = text.split("\n");

if (line.length <= 0) return;
if (line[0].split("\t").length <= 1) return arrayToString(line)+";";

var ret = [];
for (var i=0,l=line.length; i

  • Tsv2JSONArray.js

TSVをJSON形式の配列に変換する。
あんまし需要とかはないかも。


// Array -> JSON + Array
var e = Editor;

main();

function main(){
// 桁位置復元用
e.MoveHistSet();
// 選択範囲がなければ全選択
if (e.IsTextSelected == 0) e.SelectAll();

text = e.GetSelectedString(0).replace(/\r\n/g,"\n").replace(/\r/g,"\n"); // 改行を\nで統一

e.InsText( modifyReturnCode(
convertString(text)
));
// 桁位置を復元
e.MoveHistPrev();
}

// 改行コードを現在の文書に合わせる
function modifyReturnCode(text){
var l = new Array("\r\n","\r","\n");
// return text.replace(/\r\n/g,"\n").replace(/\r/g,"\n").replace(/\n/g, l[e.GetLineCode()]);
return text.replace(/\n/g,l[e.GetLineCode()]);
}

// 文字列生成
function convertString(text){
text = text.replace(/\n$/g,'');
var line = text.split("\n");

if (line.length <= 1) return;
var head = line[0].split("\t");
var ret = [];
for (var i=1,l=line.length; i data.length? data.length: head.length;
for (var i=0; i

いずれも思いつきで作ったのでバグとか結構残ってるかもしれません。
挙動にかんしては、動かして見てください。一応、実行してもCtrl+Zで一発で元のテキストに戻るので。
やっぱJavascriptだとこれくらいのマクロならサクッと書けるので楽としかいいようがない。
LinuxでJSマクロ使えるエディタないかな〜??
できれば今あるJSマクロ(多分80個くらいはある)が全部移行できればなおさらいいけど。


ちなみに80個くらいマクロはどうやって管理しているかというと、適当にフォルダ作ってそんなかにマクロをぶち込み。
自作したActiveXでPOPアップメニューを表示して、選択したやつをEvalするようなマクロで管理してます。もちろんちゃんと動きます。
80個くらいのマクロはほとんどがSQL関連。
SQL整形とか、MYSQLのコンソールの結果表示をTSVにするのとか、あとまぁ、、、いろいろですね。
仕事Hackじゃないけど、基本Excelでそれなりの形にして、エディタにペースト→マクロで変換系のパターンが多いです。
逆もまたしかり。でもすげー仕事がはかどってる気がします。
2次元(not アニメ)の形が一番頭の整理がつきやすいんですよね。だからJava周りのXMLは嫌い。笑


それにしても、WSH書いたの久しぶりだけど、forEach/mapあたりがないのはやっぱめんどいですね〜
prototypeで拡張してもいいけど、いちいちめんどくさいから早く標準で対応して欲しいです。
でも、MozillaXPCOMよりはActiveXのCOMのがわかりやすい、というか書きやすいですね。C++とかでの実装はActiveXも結構めんどいけど。笑


なんかいろいろ書いたら長くなってしまった。
これじゃ、ソース貼り付けじゃなくてどっか適当にうpできるスペース探した方がいいかもしれんですね。