ひとモノBLOG

09 « 2017 / 10 » 11
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
profile
SHOO
  • SHOO
  • 機械系の学生。の割にプログラミングとかのほうが得意だったり。
  • RSS
links
BLOG内検索
Adds by DTI Blog

D言語のIDE?そんなもんいらねぇ!Ginnieで十分だ!
2008/07/01(火) [06:32:16]

D言語のIDEが渇望される昨今ですが、いかがお過ごしでしょうか。
SHOOです。

まぁ、なんていうか、あれです。
Ginnie やべぇ。
面白い!(便利だし!)
最近、なんかソフトウェアを使いこなす習慣に突入しているらしい俺の、今回のターゲットはGinnieです。
マクロでJScriptやPerl、Ruby、Pythonなどが使えるようで、とりあえずJScriptでこちゃこちゃ書いてみました。

Dスタイルコメント補助イベントマクロ


スクリプトは以下。
/*******************************************************************************
 * Dスタイルコメント補助イベントマクロ
 * 
 * C形式、D形式のブロックコメント、Javadoc式のブロックコメントをサポートします
 * ←行頭がこれで始まっていて、
 * コメントの最初が /* や /+ になっている場合にのみ動作します。
 * 改行すると、
 * ←のような[ * ]を行頭に自動的に挿入します。
 * あと、最後のコメント閉じを行う場合、*と/の間に空白があっても
 * 自動的に詰めてくれます。
 * 汎用性は低いながら、あると嬉しくなります。
 * ドキュメント化コメントなんかのお供にどうぞ。
 * ……なに? descent? そんなん知らん!
 * 
 * Licence: NYSL (http://www.kmonos.net/nysl/)
 * Author:  SHOO (http://shoo.s20.xrea.com/shoo)
 */
function onDocumentKeyPress(tabIndex, key)
{
    switch (key)
    {
    case 0x0d:
        return (function()
        {
            var doc = Documents.NewDocument(tabIndex);
            if (doc.DocumentType != "D"return key;
            var caret = doc.Caret;
            if ( caret.Selected ) return key;
            var dString = caret.Text.length ? caret.LineString(caret.Line).slice(0, caret.Col) : "";
            // 現在行が * が先頭に来ている。
            var dCommentLineHeadString = null;
            if ((dCommentLineHeadString = dString.match(/^(s**)s*/)) != null)
            {
                var dLineHead = dCommentLineHeadString[1];
                var dInsertString = dCommentLineHeadString[0];
                
                // マッチしたならば、前の行が
                // 1. 先頭行より手前に戻ろうとしている
                // 2. /**... が含まれており、それ以降に */ が含まれていない
                // 3. その行の行頭と同一の文字列から始まっている
                // 4. それ以外
                // 1の場合、マッチせず。
                // 2の場合、マッチ。
                // 3の場合、もう一行前を同様にちぇっくする
                // 4の場合、マッチせず。
                if ( ! (function(){
                    var dLineString = null;
                    for (pos = caret.Line-1; pos >= 0; --pos)
                    {
                        dLineString = caret.LineString(pos);
                        if ( dLineString.match(//*+?/) != null)
                        {
                            if (dLineString.match(//*+.**//) == null) return true;
                            return false;
                        }
                        else if (dLineString.indexOf(dLineHead) != -1)
                        {
                            continue;
                        }
                        return false;
                    }
                
                })() ) return key;
                
                // 次の行に、現在行の先頭と全く同じものを挿入する
                caret.SelText  = "n" + dInsertString;
                return 0;
            }
            else if ((dCommentLineHeadString = dString.match(/^(s*+)s*/)) != null)
            {
                var dLineHead = dCommentLineHeadString[1];
                var dInsertString = dCommentLineHeadString[0];
                
                // マッチしたならば、前の行が
                // 1. 先頭行より手前に戻ろうとしている
                // 2. /++... が含まれており、それ以降に +/ が含まれていない
                // 3. その行の行頭と同一の文字列から始まっている
                // 4. それ以外
                // 1の場合、マッチせず。
                // 2の場合、マッチ。
                // 3の場合、もう一行前を同様にちぇっくする
                // 4の場合、マッチせず。
                if ( ! (function(){
                    var dLineString = null;
                    for (pos = caret.Line-1; pos >= 0; --pos)
                    {
                        dLineString = caret.LineString(pos);
                        if ( dLineString.match(//++/) != null)
                        {
                            if (dLineString.match(//++.*+//) == null) return true;
                            return false;
                        }
                        else if (dLineString.indexOf(dLineHead) != -1)
                        {
                            continue;
                        }
                        return false;
                    }
                
                })() ) return key;
                
                // 次の行に、現在行の先頭と全く同じものを挿入する
                caret.SelText  = "n" + dInsertString;
                return 0;
            }
            else if ((dCommentLineHeadString = dString.match(/^(s*///)s*/)) != null)
            {
                var dLineHead = dCommentLineHeadString[1];
                var dInsertString = dCommentLineHeadString[0];
                // マッチしたならば、前の行が
                // 1. 先頭行より手前に戻ろうとしている
                // 2. ////... が含まれている
                // 3. その行の行頭と同一の文字列から始まっている
                // 4. それ以外
                // 1の場合、マッチせず。
                // 2の場合、マッチ。
                // 3の場合、もう一行前を同様にちぇっくする
                // 4の場合、マッチせず。
                if ( ! (function(){
                    var dLineString = null;
                    for (pos = caret.Line-1; pos >= 0; --pos)
                    {
                        dLineString = caret.LineString(pos);
                        var regex = new RegExp("^" + dLineHead + "/");
                        if ( regex.exec(dLineString) != null)
                        {
                            return true;
                        }
                        else if (dLineString.indexOf(dLineHead) != -1)
                        {
                            continue;
                        }
                        return false;
                    }
                
                })() ) return key;
                
                // 次の行に、現在行の先頭と全く同じものを挿入する
                caret.SelText  = "n" + dInsertString;
                return 0;
            }
            return key;
        })();
    case 0x2f:
        return (function()
        {
            var doc = Documents.NewDocument(tabIndex);
            if (doc.DocumentType != "D"return key;
            var caret = doc.Caret;
            if ( caret.Selected ) return key;
            var dString = caret.Text.length ? caret.LineString(caret.Line).slice(0, caret.Col) : "";
            // 現在行が * が先頭に来ている。
            var dCommentLineHeadString = null;
            if ((dCommentLineHeadString = dString.match(/^(s**)s*$/)) != null)
            {
                var dLineHead = dCommentLineHeadString[1];
                
                // マッチしたならば、前の行が
                // 1. 先頭行より手前に戻ろうとしている
                // 2. /**... が含まれており、それ以降に */ が含まれていない
                // 3. その行の行頭と同一の文字列から始まっている
                // 4. それ以外
                // 1の場合、マッチせず。
                // 2の場合、マッチ。
                // 3の場合、もう一行前を同様にちぇっくする
                // 4の場合、マッチせず。
                if ( ! (function(){
                    var dLineString = null;
                    for (pos = caret.Line-1; pos >= 0; --pos)
                    {
                        dLineString = caret.LineString(pos);
                        if ( dLineString.match(//*+/) != null)
                        {
                            if (dLineString.match(//*+.**//) == null) return true;
                            return false;
                        }
                        else if (dLineString.indexOf(dLineHead) != -1)
                        {
                            continue;
                        }
                        return false;
                    }
                
                })() ) return key;
                
                // 次の行に、現在行の先頭と全く同じものを挿入する
                caret.LineString(caret.Line) = dLineHead + "/" + caret.LineString(caret.Line).slice(caret.Col, caret.LineString(caret.Line).length);
                return 0;
            }
            else if ((dCommentLineHeadString = dString.match(/^(s*+)s*$/)) != null)
            {
                var dLineHead = dCommentLineHeadString[1];
                
                // マッチしたならば、前の行が
                // 1. 先頭行より手前に戻ろうとしている
                // 2. /++... が含まれており、それ以降に +/ が含まれていない
                // 3. その行の行頭と同一の文字列から始まっている
                // 4. それ以外
                // 1の場合、マッチせず。
                // 2の場合、マッチ。
                // 3の場合、もう一行前を同様にちぇっくする
                // 4の場合、マッチせず。
                if ( ! (function(){
                    var dLineString = null;
                    for (pos = caret.Line-1; pos >= 0; --pos)
                    {
                        dLineString = caret.LineString(pos);
                        if ( dLineString.match(//++/) != null)
                        {
                            if (dLineString.match(//++.*+//) == null) return true;
                            return false;
                        }
                        else if (dLineString.indexOf(dLineHead) != -1)
                        {
                            continue;
                        }
                        return false;
                    }
                
                })() ) return key;
                
                // コメント閉じ
                caret.LineString(caret.Line) = dLineHead + "/" + caret.LineString(caret.Line).slice(caret.Col, caret.LineString(caret.Line).length);
                return 0;
            }
            return key;
        })();
    default: ;
    }
    return key;
}


なんか、最近ものすごい勢いでバグ報告と要望を出しまくっているSHOOですけど…いや、なんていうかすんません。この場を借りてすんません。借りるっていうか自分のHPだけど…
作者様にとっては迷惑この上ないことだろうけど、バグの報告や要望に迅速に対応してくれるのは非常にありがたい…

というわけで、ちょっとは貢献できたでしょうか…?
オフィシャルホームページの掲示板にはCスタイルコメントの補完イベントマクロを投稿させていただきました。
明らかにDとかユーザーが少なそうなので、自分のHPで公開という身の程をわきまえた感じの、以下にファイルを示します。

download


rel="prev"<<Windows + Apache2.2.9 + Subversion1.4.6 + Python2.4 + Trac10.5 + FSWiki | ホーム |

この記事に対するトラックバック

この記事のトラックバックURL

この記事に対するコメント

この記事にコメントする

管理者にだけ表示を許可する
| HOME |