scintilla 中的代码折叠功能的使用

2007-12-17 17:59:00 libbyliugang 阅读数 2322

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/libbyliugang/article/details/1944046

本文翻译自http://sphere.sourceforge.net/flik/docs/scintilla-folding.html

使用 scintilla 中的代码折叠功能
scintilla 是一个脚本编辑组件,您可以到 http://www.scintilla.org 这个网站上看看。

--------------------------------------------------------------------------------
下面介绍如何使用 scintilla 的代码折叠功能

--------------------------------------------------------------------------------

首先咋们来创建一些我们稍后会用到的一些常量。
static const int MARGIN_SCRIPT_FOLD_INDEX = 1;

为窗口注册 margin Event (即用户执行折叠和展开代码时,触发的事件)事件(仅用于 windows 环境)

static const int WINDOW_ID = 900;

BEGIN_MESSAGE_MAP(CDocumentWindow, CDocumentWindowsBaseClass)
  ON_NOTIFY(SCN_MARGINCLICK, WINDOW_ID, OnMarginClicked)
END_MESSAGE_MAP()

(这里的 WINDOW_ID 就是我们调用 CreateWindow 创建窗口时经常用到的)

设置我们需要的 lexer(词法识别器,用于识别代码格式)...
(可以直接使用已有的常量,也可以自己手动创建...)

SendEditor(SCI_SETLEXER, SCLEX_CPP);
  SendEditor(SCI_SETSTYLEBITS, 5);

设置我们用到的 lexer 的一些属性

SendEditor(SCI_SETPROPERTY, (WPARAM)"fold", (LPARAM)"1");
  SendEditor(SCI_SETPROPERTY, (WPARAM)"fold.compact", (LPARAM)"0");

(这里的 fold.compact 选项就是折叠必要的代码行;我不太喜欢这个特性,但是这个属性缺省值就是"1")
下面这样也不错:

SendEditor(SCI_SETPROPERTY, (WPARAM)"fold.comment", (LPARAM)"1");
  SendEditor(SCI_SETPROPERTY, (WPARAM)"fold.preprocessor", (LPARAM)"1");

现在让我们将所有的 margins 重置
(可以通过 RecalcLineMargin 函数处理...)

SendEditor(SCI_SETMARGINWIDTHN, MARGIN_SCRIPT_FOLD_INDEX, 0);

接着,设置 margin 类型和 margin 掩码(mask),并重置...

SendEditor(SCI_SETMARGINTYPEN,  MARGIN_SCRIPT_FOLD_INDEX,SC_MARGIN_SYMBOL);
  SendEditor(SCI_SETMARGINMASKN, MARGIN_SCRIPT_FOLD_INDEX,SC_MASK_FOLDERS);
  SendEditor(SCI_SETMARGINWIDTHN, MARGIN_SCRIPT_FOLD_INDEX, 20);

设置一些其他的选项

SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_PLUS);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY);

SendEditor(SCI_SETFOLDFLAGS, 16, 0); // 16   如果没有展开就在折叠行的下面划一条横线

我们注册一下通知事件,这样当用户点击 margin 时,scintilla 就会通知我们。

SendEditor(SCI_SETMARGINSENSITIVEN, MARGIN_SCRIPT_FOLD_INDEX, 1);

响应 SCN_MARGINCLICK 事件...(请注意函数原型)

afx_msg void
CDocumentWindow::OnMarginClick(NMHDR* nmhdr, LRESULT* result)
{
  SCNotification* notify = (SCNotification*)nmhdr;

const int modifiers = notify->modifiers;
  const int position = notify->position;
  const int margin = notify->margin;
  const int line_number = SendEditor(SCI_LINEFROMPOSITION, position, 0);

switch (margin)
  {
    case MARGIN_SCRIPT_FOLD_INDEX:
    {
      SendEditor(SCI_TOGGLEFOLD, line_number, 0);
    }break;
  }
}

有了上面这些应该能够工作了。
You'll want to play around with it until you're happy with the way the folding works,
scintilla seems to use a much more complicated MarginClick...
Luckily harvesting the MarginClick code from scintilla is easy:

首先修改一下 OnMarginClick:

SendEditor(SCI_TOGGLEFOLD, line_number, 0);

修改为: 
      MarginClick(position, modifiers);

接着在你的头文件中...
Then in your header file...

bool MarginClick(int position, int modifiers);
  void Expand(int &line, bool doExpand,
              bool force = false, int visLevels = 0, int level = -1);
  void FoldAll();

接着到 SciTEBase.cxx 中找一些你需要的代码,直接粘贴到你自己的文件中(译者注:没想到作者要我这样写代码:))

对了,你最好赶快更新一下你的 Goto Line 函数...(译者:跳转到某一行功能,可能是这里比较容易出错)

SendEditor(SCI_ENSUREVISIBLEENFORCEPOLICY, line_number);
 SendEditor(SCI_GOTOLINE, line_number);

就这些了,enjoy.

如果对此有什么问题或者建议你可以发邮件到 vascy@hotmail.com

 libbyliugang translate to chinese.

scintilla 中的代码折叠功能的使用相关推荐

  1. vue-codemirror基本用法:实现搜索功能、代码折叠功能、获取编辑器值及时验证

    昨天实现了一些codemirror:基本的编辑代码功能.插入变量功能.codemirror语法验证功能.代码格式化(由于主要是json数据,所以暂时没引用其他组件,如果需要建议引用js-beautif ...

  2. 代码编辑器控件ICSharpCode.TextEditor的关键字高亮以及代码折叠功能

    SharpDevelop (#develop)有很多"副产品",其中最出名的应算SharpZipLib (#ziplib),纯C#的ZIP类库, 而在SharpDevelop (# ...

  3. [APP]- 找回Xcode7的代码折叠功能

    为什么80%的码农都做不了架构师?>>>    原 找回Xcode7的代码折叠功能 升级到Xcode7后,会发现代码折叠功能不见了,这是怎么回事? 其实这个功能还在的,只是苹果默认把 ...

  4. code blocks 代码颜色_vuepress中实现代码折叠、高亮

    最近在vuepress中撰写UI框架文档时发现在组件中插入演示代码没高亮,虽然在文档markdown中写代码有高亮但就无法实现折叠了,而且vuepress没有提供折叠代码的配置,因此实现一个折叠组件外 ...

  5. Keil MDK打开代码折叠功能(代码折叠按钮消失的解决办法)

    这是标题0.0 bug背景 解决办法: bug背景   一般在用Keil MDK软件写程序时,如果代码块内的代码太长,有时会把它折叠起来方便阅读以及快速翻页.但是我最近在写程序时发现代码折叠的按钮突然 ...

  6. MyEclipse IDE中的代码追踪功能

    一.示例代码 package cn.xy.service; public interface IMyService { public int add(int a, int b); } package ...

  7. 让Visual Studio 也支持JS代码折叠 [ Visual Studio | #region | #endregion ]

    前言 Visual Studio的代码折叠功能非常好用,#region #endregion 这个词连搜狗的词库里面都出现了(不含'#'号),可见使用频率很高,但是他不支持js的代码折叠 : ( 最近 ...

  8. vim的代码折叠:设置默认代码不折叠

    有时候看代码时,代码太长看着不方便,特别是阅读源码时,需要把不关心的代码先折叠起来,看自己当前最关注的代码.vim中自带了代码折叠功能. 配置foldmethod可以定义折叠方式,有6种可选方式: 1 ...

  9. eclipse代码折叠/展开之笔记本快捷键设置

    eclipse代码折叠/展开之笔记本快捷键设置<非原创> 首先 在eclipse 中开启设置代码折叠功能 1. windows->perferences->General-&g ...

  10. eclipse linux 代码提示,Linux Eclipse代码提示功能设置(Java C/C++)

    最近在Linux下开发,由于长期使用Visual Studio 2010,对代码提示功能情有独钟,现在在Linux下,使用Eclipse做开发,当然免不了怀念Visual Studio强悍的代码提示, ...

最新文章

  1. Nature:“巨型原子”使芯片同时处理和收发量子信息成为可能
  2. php播放ppt代码,PHP+JavaScript幻灯片代码
  3. 100路监控摄像头需要使用核心交换机吗?
  4. win10: Coursera 视频无法观看问题解决。
  5. 设置 tableview 的背景颜色,总是不生效
  6. 【Python】【Flask】
  7. 线性代数与矩阵论 习题 1.2.2
  8. python相似图片识别_Python+Opencv识别两张相似图片
  9. cf1207解题报告
  10. 初次使用NHibernate遇到的问题
  11. centos 怎样显示metric_centos7系列问题
  12. Android Studio如何Debug对应so文件C/C++代码
  13. Oracle TDE的数据加密示例并用logminer验证加密效果
  14. 【第三课】Arcgis软件详细介绍
  15. 哈夫曼编码(Huffman Coding)原理详解
  16. 软件下载地址链接收藏
  17. Tmux常用命令小结(超全够用)
  18. You have not concluded your cherry-pick
  19. 史上最全软件测试工程师常见的面试题总结(四)【多测师_王sir】
  20. 维特比算法[Wiki]

热门文章

  1. R语言线性混合效应模型实战案例
  2. 用qt编写的解析tiff文件的类
  3. 台式计算机usb口不识别鼠标,答疑解惑:USB鼠标无法被电脑识别怎么办
  4. 计算机主板电源接口8pin,菜鸟老鸟都要知道 电源接口图文全教程
  5. 智慧路灯综合解决方案
  6. python 扫描枪_python实现超市扫码仪计费
  7. Ain_搜索引擎这样用才有效率
  8. 低代码|零代码云快速开发平台测评
  9. HTG评论Kobo Aura HD:不是Kindle,那还行
  10. cpu顶盖怎么看步进_硬核科普丨什么是CPU步进?B0步进和U0步进具体差别有哪些...