自己开发Visual studio插件-一个nvelocity高亮插件

时间:2022-11-24 19:06:46

首先,有一个项目用到了nvelocity模板引擎,但是用vs开发模板的时候,没有高亮效果,所以非常不方便,鉴于这个,于是有了自己开发插件的念头,但是在vs sdk开发上面,这方面的资料真是少之又少,网上能参考的文章真是寥寥无几。

不过借鉴了几篇文章和参考MSDN后,总算开发出了一款VS插件,目前是支持nvelocity的语法高亮,比如nvelocity的关键字#set #parse等等 还有nvelocity的对象$xxx这样的格式,还有注释## #**#这样的,但是这里出现一个小曲

就是因为我们也知道nvelocity的模板其实大部分都是html的语法,所以如果写nvelocity更多的是写html,所以我们需要保留html的语法高亮还有html的智能提示,同时又要支持nvelocity的语法高亮,这里如果全部都自己来实现,估计是一个

非常大的工程,由于本人时间不是很多,也没这么多的精力和脑力去开发这么一款工具,所以智能另辟路径了,所以这款插件有个不好的地方,就是安装后,所有的文件,比如cs文件 aspx页面 html页面等等只要遇到nvelocity的语法 关键字 都回

被语法高亮了,但是不影响使用的,这点我亲自试过,估计其他的页面很少出现这些语法关键字,就算出现也不妨碍的

下面提示一下开发的思路

首先需要安装vs sdk

还有你的vs 需要是英文版的

我们是在 editor class的模板下面进行开发

关键的一步就算分词了,就算扫描你的代码,检查含有和nvelocity的语法匹配的就进行上色

自己开发Visual studio插件-一个nvelocity高亮插件

我们用到lex分词工具

%option unicode, codepage:raw

%{
        // User code is all now in ScanHelper.cs
%}

%namespace Shane
%option verbose, summary, noparser, nofiles, unicode

%{
    public int nextToken() { return yylex(); }
    public int getPos() { return yypos; }
    public int getLength() { return yyleng; }
%}

//=============================================================
//=============================================================

number ([0-9])+
chars [A-Za-z]
cstring [A-Za-z_]
blank " "
delim [ \t\n]
word {chars}+
singleLineComment "##"[^\n]*
multiLineComment "#*"[^*]*\*(\*|([^*/]([^*])*\*))*\#
velocity \$[!]?[{]?[a-zA-Z\d._]+[}]?

comment {multiLineComment}|{singleLineComment}
keyword #set|#foreach|#if|#elseif|#else|#include|#parse|#macro|#even|#odd|#each|#end|{velocity}

%%

{keyword}            return (int)NvelocityEditor.NvelocityTokenType.Keyword;
{comment}            return (int)NvelocityEditor.NvelocityTokenType.Comment;

%%

 

同时有一点要注意的就是

分词的时候,***不要先所有词语都上色,这样会覆盖了原来html的语法的

using System.ComponentModel.Composition;
using System.Windows.Media;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Utilities;

namespace NvelocityEditor
{
    [Export(typeof(EditorFormatDefinition))]
    [ClassificationType(ClassificationTypeNames = "NvelocityText")]
    [Name("NvelocityText")]
    [UserVisible(true)]
    [Order(Before = Priority.High)]
    internal sealed class NvelocityTextFormatDefinition : ClassificationFormatDefinition
    {
        public NvelocityTextFormatDefinition()
        {
            this.DisplayName = "Nvelocity文本";
            this.ForegroundColor = Colors.Brown;
        }
    }

    [Export(typeof(EditorFormatDefinition))]
    [ClassificationType(ClassificationTypeNames = "NvelocityComment")]
    [Name("NvelocityComment")]
    [UserVisible(true)]
    [Order(Before = Priority.High)]
    internal sealed class NvelocityCommentFormatDefinition : ClassificationFormatDefinition
    {
        public NvelocityCommentFormatDefinition()
        {
            this.DisplayName = "Nvelocity注释";
            this.ForegroundColor = Colors.Green;
        }
    }

    [Export(typeof(EditorFormatDefinition))]
    [ClassificationType(ClassificationTypeNames = "NvelocityKeyword")]
    [Name("NvelocityKeyword")]
    [UserVisible(true)]
    [Order(Before = Priority.High)]
    internal sealed class NvelocityKeywordFormatDefinition : ClassificationFormatDefinition
    {
        public NvelocityKeywordFormatDefinition()
        {
            this.DisplayName = "Nvelocity关键字";
            this.ForegroundColor = Colors.Black;
            this.BackgroundColor = Colors.Yellow;
        }
    }


}

插件下载地址:NvelocityEditor.vsix

 

感谢你的阅读,希望对你有帮助.....