.NET中用ICSharpCode.TextEditor自定义代码折叠与高亮

前言

ICSharpCode.TextEditor 是一款非常不错的.NET代码编辑控件,内置了多种高亮语言支持,同时完美支持中文,非常赞!

先来看一下运行效果:

一、项目结构

这里需要注意lib文件夹下导入的类库,这个Demo需要这些dll.

二、代码折叠

需要实现IFoldingStrategy中的 GenerateFoldMarkers 方法,代码如下:

using ICSharpCode.TextEditor.Document;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JackWangCUMT.WinForm
{

 /// <summary>
 /// The class to generate the foldings, it implements ICSharpCode.TextEditor.Document.IFoldingStrategy
 /// </summary>
 public class MingFolding : IFoldingStrategy
 {
  /// <summary>
  /// Generates the foldings for our document.
  /// </summary>
  /// <param name="document">The current document.</param>
  /// <param name="fileName">The filename of the document.</param>
  /// <param name="parseInformation">Extra parse information, not used in this sample.</param>
  /// <returns>A list of FoldMarkers.</returns>
  public List<FoldMarker> GenerateFoldMarkers(IDocument document, string fileName, object parseInformation)
  {
   List<FoldMarker> list = new List<FoldMarker>();
   //stack 先进先出
   var startLines = new Stack<int>();
   // Create foldmarkers for the whole document, enumerate through every line.
   for (int i = 0; i < document.TotalNumberOfLines; i++)
   {
    // Get the text of current line.
    string text = document.GetText(document.GetLineSegment(i));

    if (text.Trim().StartsWith("#region")) // Look for method starts
    {
     startLines.Push(i);

    }
    if (text.Trim().StartsWith("#endregion")) // Look for method endings
    {
     int start = startLines.Pop();
     // Add a new FoldMarker to the list.
     // document = the current document
     // start = the start line for the FoldMarker
     // document.GetLineSegment(start).Length = the ending of the current line = the start column of our foldmarker.
     // i = The current line = end line of the FoldMarker.
     // 7 = The end column
     list.Add(new FoldMarker(document, start, document.GetLineSegment(start).Length, i, 57, FoldType.Region, "..."));
    }
    //支持嵌套 {}
    if (text.Trim().StartsWith("{")) // Look for method starts
    {
     startLines.Push(i);
    }
    if (text.Trim().StartsWith("}")) // Look for method endings
    {
     if (startLines.Count > 0)
     {
      int start = startLines.Pop();
      list.Add(new FoldMarker(document, start, document.GetLineSegment(start).Length, i, 57, FoldType.TypeBody, "...}"));
     }
    }

    // /// <summary>
    if (text.Trim().StartsWith("/// <summary>")) // Look for method starts
    {
     startLines.Push(i);
    }
    if (text.Trim().StartsWith("/// <returns>")) // Look for method endings
    {

     int start = startLines.Pop();
     //获取注释文本(包括空格)
     string display = document.GetText(document.GetLineSegment(start + 1).Offset, document.GetLineSegment(start + 1).Length);
     //remove ///
     display = display.Trim().TrimStart('/');
     list.Add(new FoldMarker(document, start, document.GetLineSegment(start).Length, i, 57, FoldType.TypeBody, display));
    }
   }

   return list;
  }
 }
}

三、高亮配置

拷贝CSharp-Mode.xshd为 JackCSharp-Mode.xshd ,将其中的名字修改为: SyntaxDefinition name = "JackC#" ,并添加高亮关键字,如下:

这样代码中出现的JackWang就会高亮。下面的代码片段将自定义高亮文件进行加载,并用SetHighlighting进行设置,这里一定注意目录下必须有xshd的配置文件,否则高亮将失效。

textEditor.Encoding = System.Text.Encoding.UTF8;
 textEditor.Font = new Font("Hack",12);
 textEditor.Document.FoldingManager.FoldingStrategy = new JackWangCUMT.WinForm.MingFolding();
 textEditor.Text = sampleCode;

 //自定义代码高亮
 string path = Application.StartupPath+ "\\HighLighting";
 FileSyntaxModeProvider fsmp;
 if (Directory.Exists(path))
 {
  fsmp = new FileSyntaxModeProvider(path);
  HighlightingManager.Manager.AddSyntaxModeFileProvider(fsmp);
  textEditor.SetHighlighting("JackC#");

 }

为了保持代码适时进行折叠,这里监听文本变化,如下所示:

   private void TextEditor_TextChanged(object sender, EventArgs e)
   {
    //更新,以便进行代码折叠
    textEditor.Document.FoldingManager.UpdateFoldings(null, null);
   }

最后说明的是,我们可以定义一个格式化代码的类,来格式化C#代码:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • C#的四种基本数据类型

    字符类型 char ,存储用''(单引号)括起来的一个字符,例如: char sex='男';//存储性别 字符串类型 string ,存储用""(双引号)括起来的一串字符,例如: string address="北京市宣武区牛街北口";//存储地址 整数类型 int ,存储整数,例如: int age=23;//存储年龄 双精度浮点型 double ,存储小数,例如: double salary=7991.63;//存储工资 以上四种是最常用的数据类型. 需要注意

  • C# 基础入门--变量

    使用变量分为3步:声明.赋值.使用. 声明变量的语法:数据类型 变量名: 给变量赋值的语法:变量名=值: namespace Test { class Program { static void Main(string[] args) { int age;//声明变量,类型为int,变量名为age age = 18;//给变量age赋值为18 Console.WriteLine("我今年"+age="岁");//打印age age = 19;//修改了变量age的值

  • C# 基础入门--注释

    注释,是代码中的一些"说明性文字".注释本身不会参与程序的编译和运行,仅仅供程序员阅读. 注释分为:单行注释.多行注释.文档注释. 单行注释的符号是2条斜线"//",2条斜线右侧的内容就是注释,左侧的代码不会受影响. 多行注释以"/*"开始,以"*/"结束,之间的内容就是注释,可以包含多行. 文档注释写在类.方法或属性的前面,它的符号是3条斜线"///". namespace Test { /// <

  • c#消息提示框messagebox的详解及使用

    C#消息提示框messagebox的详解及使用 消息对话框是用messagebox对象的show方法显示的.MessageBox对象是命名空间System.Windows.Forms的一部分,Show是一个静态方法,意思是说,不需要基于MessageBox类的对象创建实例,就可以使用该方法.而且该方法是可以重载的,即方法可以有不同的参数列表形式. 返回结果:DialogResult dr1=MessageBox.Show(text,caption,buttons,icon,defaultbutt

  • C# 基础入门--常量

    常量,顾名思义,就是"不会改变的量". 我们平时书写的数字(比如12.85).字符(比如'F').字符串(比如"谢谢"),它们都属于"字面常量". 有一些常量既重要又容易出错,比如圆周率π的值为3.1415926......,所以,我们常常会使用自定义常量.如: namespace Test { class Program { static void Main(string[] args) { const double PI = 3.141592

  • C# 基础入门--关键字

    例子: using System; using System.Collections.Generic; using System.Text; namespace Test { class Program { static void Main(String[]args) { Console.WriteLine("Hello World!"); } } } 1.关键字 class ,这个关键字的用途是声明类,是C#程序最小单元,比如上面例子中,类名叫做Program. 2.关键字 name

  • C#中new的几种用法详解

    在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型. new 修饰符(C# 参考) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员.隐藏继承的成员意味着该成员的派生版本将替换基类版本.在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告.使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实. 若要隐

  • C# Rx的主要接口深入理解

    C# Rx的主要接口深入理解 IObservable / IObserver 接口在.NET Framework 4.0基类库中可用,并且它们包含在可以安装在.NET 3.5,Silverlight 3和4以及JavaScript中的包中. IObservable/IObserver Rx将异步和基于事件的数据源公开为基于推送的可观察序列,由.NET Framework 4.0中的新IObservable 接口抽象. 这个IObservable 接口是用于基于拉的,可枚举集合的熟悉的IEnume

  • C#中partial关键字的作用

    1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文件中实现. (2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起. (3) 需要多人合作编写一个类. 局部类型是一个纯语言层的编译处理,不影响任何执行机制--事实上C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类. public partia

  • .NET中用ICSharpCode.TextEditor自定义代码折叠与高亮

    前言 ICSharpCode.TextEditor 是一款非常不错的.NET代码编辑控件,内置了多种高亮语言支持,同时完美支持中文,非常赞! 先来看一下运行效果: 一.项目结构 这里需要注意lib文件夹下导入的类库,这个Demo需要这些dll. 二.代码折叠 需要实现IFoldingStrategy中的 GenerateFoldMarkers 方法,代码如下: using ICSharpCode.TextEditor.Document; using System; using System.Co

  • iOS Xcode自定义代码块及迁移的实现方法

    前言 文中将要介绍以下四点内容 代码块的意义 自定义代码块入口 代码块迁移 代码块的编写 下面话不多说了,来一起看看详细的介绍吧 一 . 意义在于节约时间成本 like 我在编译器键入 strong, 回车 自动生成 @property (nonatomic, strong) <#Class#> *<#object#>; 二 . 如何自定义代码块 如下图所示 选中一行代码右键 crate code snippet 右上角方框快速进入 图1 下图填入描述, 以及快捷方式 图2 三 .

  • Visual Studio 中自定义代码片段的方法

    第一步.打开 Visual Studio Code,按Ctrl + Shift + P,输入:Configure User Snippets,选择 Preferences:Configure User Snippets. 第二步.回车后,选择一个配置文件,或者新建一个配置文件,我选择的是 HTML 配置文件. 第三步.按照示例添加吧,JSON 格式. 我增加了两个,一个是 style 的,一个是 script 的,如下: { "Add style tag": { "prefi

  • 在python中利用pycharm自定义代码块教程(三步搞定)

    当我们在使用pycharm时,输入特殊的关键字会有提示,然后按enter就可以自动补全,如果我们经常需要输出重复的代码时,能否也利用这种方法来自动补全呢? 下面我们就来利用pycharm自定义代码块: 1.打开pycharm中file下的setting,找到Editor下面的Live Templates ,右侧就会出现各种语言的代码块,我们选择Python,点击右侧的"+",选择Live Template 2.Abbreviation就是你自定义代码块的名字,Description是描

  • Pycharm编辑器功能之代码折叠效果的实现代码

    1.主题 在一些情况下,如果某些代码显得不太重要,我们可以通过Pycharm的代码折叠功能将其折叠为一行.在接下来的部分我们将介绍代码折叠功能基本用法. 2.代码可折叠轮廓线以及折叠开关 首先,我们观察一下代码左侧的折叠线.这条细线显示在代码左侧,标记了代码块区域.当代码处于未折叠状态时,线的开头和结尾分别显示折叠开关和:当代码块折叠之后,两个开关标志将会合并成一个,折叠后的代码只显示第一行,其他行隐藏在三个点号后面.单击这个加号的标志即可将折叠代码展开. 将鼠标指针悬停在折叠线上,折叠线会加粗

  • java中用String.Join美化代码的实例讲解

    我们在java中处理字符串的时候,一般会选择String,在python中同样也是作用于字符串.那么我们今天延伸一下它的用法,只使用String作用于代码,会发生什么样的神奇效果呢?接下来我们使用String.Join对代码进行美化,下面一起看看怎么操作吧. 1.jadk1.8为我们提供了String.join()方法 2.几个使用的例子. 让我们在项目灵活的使用它,使代码更加优美 package com.niu.demo; import java.util.ArrayList; import

  • IntelliJ IDEA自定义代码提示模板Live Templates的图文教程

    打开 File --> Settings --> Editor --> Live Templates 此处添加Java的Live Templates 在Abbreviation处写模板名称 在Template text处写输入模板名称后的提示的模板 这里以syso为例,提示System.out.println(); 然后选择模板使用范围,这里选择"Java",勾选 最后点击Apply应用 在Idea界面中使用syso 到此这篇关于IntelliJ IDEA自定义代码提

  • android使用Ultra-PullToRefresh实现下拉刷新自定义代码

    下拉刷新中Ultra-Pull-To-Refresh一直是我最喜欢用的了,这里自定义一个HeaderView的样式.和普通的样式略微有些区别.先看效果图 一眼看上去和普通下拉刷新样式没啥区别,但仔细看会发现下拉时的头部是盖在内容上的(为了简便,这里整个布局内容就一张图片).而PtrFrameLayout默认布局样式是将header放置在内容上方,下拉时从上到下逐渐显示.要实现这种头部覆盖在屏幕内容上的效果就需要我们另外想办法了. 方案1:修改库文件的,将headerView的显示位置放置在内容上

  • Angular.js中用ng-repeat-start实现自定义显示

    前言 众所周知AngularJS 中可以使用 ng-repeat 显示列表数据,这对大家来说应该都不陌生了, 用起来很简单, 也很方便, 比如要显示一个产品表格, Controller 的 Javascript 代码如下: angular.module('app', []) .controller('MyController', MyController); MyController.$inject = ['$scope']; function MyController($scope) { //

  • Android中用Builder模式自定义Dialog的方法

    前言 我们开发人员在实际项目过程中遇到的需求是多种多样的,有时我们要匹配APP自己的设计风格,有时我们会觉得系统的对话框使用起来不够自由,因此自己定义一个适合自己的Dialog是很有必要的. 为什么要用Builder模式 Builder设计模式是一步步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.它的优点就在于将对象的构建和表示分离从而解耦.我们都知道Android系统自身的对话框如AlertDialog就采用了Builder模式,因此可见

随机推荐