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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
   scintilla 中的代码折叠功能的使用收藏

 | 旧一篇:  如何在 Windows 环境下使用 Scintilla 编辑控件?

本文翻译自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(CDocumentWindowCDocumentWindowsBaseClass)
  ON_NOTIFY(SCN_MARGINCLICK, WINDOW_ID, OnMarginClicked)
END_MESSAGE_MAP()


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

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

  SendEditor(SCI_SETLEXERSCLEX_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_SETMARGINWIDTHNMARGIN_SCRIPT_FOLD_INDEX, 0);

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

  SendEditor(SCI_SETMARGINTYPEN,  MARGIN_SCRIPT_FOLD_INDEXSC_MARGIN_SYMBOL);
  SendEditor(SCI_SETMARGINMASKNMARGIN_SCRIPT_FOLD_INDEXSC_MASK_FOLDERS);
  SendEditor(SCI_SETMARGINWIDTHNMARGIN_SCRIPT_FOLD_INDEX, 20);


设置一些其他的选项

  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDERSC_MARK_PLUS);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDEROPENSC_MARK_MINUS);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDERENDSC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDERMIDTAILSC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDEROPENMIDSC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDERSUBSC_MARK_EMPTY);
  SendEditor(SCI_MARKERDEFINESC_MARKNUM_FOLDERTAILSC_MARK_EMPTY);

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


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

  SendEditor(SCI_SETMARGINSENSITIVENMARGIN_SCRIPT_FOLD_INDEX, 1);


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

afx_msg void
CDocumentWindow::OnMarginClick(NMHDRnmhdrLRESULTresult)
{
  SCNotificationnotify = (SCNotification*)nmhdr;

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

  switch (margin)
  {
    case MARGIN_SCRIPT_FOLD_INDEX:
    {
      SendEditor(SCI_TOGGLEFOLDline_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_TOGGLEFOLDline_number, 0);

修改为: 
      MarginClick(positionmodifiers);


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

  bool MarginClick(int positionint modifiers);
  void Expand(int &linebool doExpand,
              bool force = falseint visLevels = 0, int level = -1);
  void FoldAll();

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

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

 SendEditor(SCI_ENSUREVISIBLEENFORCEPOLICYline_number);
 SendEditor(SCI_GOTOLINEline_number);


就这些了,enjoy.

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

 libbyliugang translate to chinese.

 

发表于 @ 2007年12月17日 17:59:00|评论(0)|编辑

 | 旧一篇:  如何在 Windows 环境下使用 Scintilla 编辑控件?


http://blog.csdn.net/libbyliugang/archive/2007/12/17/1944046.aspx

文本编辑器Scite源代码阅读过程(一) scintilla是一个免费的源代码编辑控件,完全开放源代码。同时提供了demo例子scite,scite是一个文本编辑器,有使用Win32开发的版本,对于学习Windows编程有一定作用。      scintilla目前提供了Win32版本和Linux版本。是一个跨平台控件。ScintillaWindows版本是一个窗体控件,主要的编程接口就是通过窗体消息来发送。要实现什么功能,向控件发送 阅读详情

相关推荐

基于Qt的组件,Qscintilla代码编辑器。支持5种配色方案 本代码自定义的代码编辑器

基于Qt的组件,Qscintilla代码编辑器。支持5种配色方案 本代码自定义的代码编辑器,可应用与任何语言、语法对以下源代码的更新进行说明 [功能] #1.支持自定义快捷键 #2.支持自定义皮肤 #3.代码高亮:支持自定义高亮规则,关键词等 #4.自动补全:支持自动补全列表定义,可添加小图标 #5.代码行号显示:根据行号文字大小自动改变栏目宽度,保证完全显示 #6.断点调试:左侧栏可显示断点,和运行小图标 #7.书签功能:可添加书签 #8.支持列选,列修改,多选,多修改 #9.支持代码注释,可选多段 #

m0_64715870的博客 1030

notepad2:Notepad2 是一款基于 Scintilla 的轻量级 Windows 文本编辑器,具有语法高亮代码折叠、自动完成和 API 列表,可用于大约 80 种编程语言文档,并与文件浏览器插件元路径和深色主题捆绑在一起

Notepad2 和元路径 Notepad2是的修改版本(fork)。 metapath是原始的错误修复版本。 二进制文件 最新发布的: 和上提供了最新的开发版本(每个编译器和平台的 Release 配置中的工件)。 或者您可以从源代码构建,请参阅 。 GitHub 操作(MSVC、Clang、GCC) AppVeyor (MSVC, Clang) 与官方或Notepad2-mod相比的变化: 支持书签 标记一个词或选择的所有出现的选项,并显示匹配的计数 增强了单词和函数的自动完成功能 某些单词的基于上下文的自动完成 增强的自动缩进 大括号、方括号和引号的自动完成 语法高亮代码折叠和 API 列表(参见内置文件扩展名列表): 纯文本 ABAQUS ActionScript 3 和 4 的 ActionScript。 Android Smali,截图 Java 茉莉花 AN

Scintilla 在MFC中的简易使用(动态、静态)

Scintilla 在MFC中的简易使用(动态、静态)  Scintilla是一个开源的源代码编辑组件。在这里记录下它在MFC中的简易使用Scintilla 3.24在MFC中的使用(动态、静态) 一文使用的别人封装过的类。至于怎样去封装,没有详细说明。 下面将简单介绍在MFCSDI框架下如何封装Scintilla,提供一个玩具级的演示示例。本文使用的是Scintil

flyear_cn 1514

notepad++ V8.3.3源码

notepad++ V8.3.3版本源代码,经典工具源码学习。

scintilla 中的代码折叠功能使用

本文翻译自http://sphere.sourceforge.net/flik/docs/scintilla-folding.html使用 scintilla 中的代码折叠功能scintilla 是一个脚本编辑组件,您可以到 http://www.scintilla.org 这个网站上看看。--------------------------------------------------

libbyliugang的专栏 3383

Scintilla加入代码折叠功能

Scintilla加入代码折叠功能 来自http://www.cppprog.com/2009/1111/176_2.html 前面曾说过当编辑器有代码折叠功能时,25号到31号这7个标记是作为代码折叠专用标记的。在scintilla.h中,我们可以找到它们的定义: #define SC_MARKNUM_FOLDEREND 25 //折叠状态(多级中间) #define SC_MARK...

yntcsb的专栏 907

Scintilla的高级技法

Scintilla的高级技法

chenshuixian2的专栏 1999

如何在 Windows 环境下使用 Scintilla 编辑控件?

 http://www.scintilla.org/http://scintilla.sourceforge.net/index.html如何在 Windows 环境下使用 Scintilla 编辑控件?收藏新一篇: scintilla 中的代码折叠功能使用 | 旧一篇: 插件及可扩展性请注意:此文翻译自http://scintilla.sourceforge.net/Steps.html。Sc

skyremember的专栏 1490

如何在 Windows 环境下使用 Scintilla 编辑控件?收藏

 如何在 Windows 环境下使用 Scintilla 编辑控件?收藏新一篇: scintilla 中的代码折叠功能使用 | 旧一篇: 插件及可扩展性请注意:此文翻译自http://scintilla.sourceforge.net/Steps.html。Scintilla 控件可以在网站http://scintilla.sourceforge.net/index.html上获取。如何在 Wi

skyremember的专栏 1046

Scintilla开源库使用指南

Scintilla开源库使用指南

mmqqyyqqyyq的博客 696

如何在 Windows使用 Scintilla 编辑控件

以下是在 Windows 环境中使用 Scintilla 的分步说明。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 741

掌握Scite与Scintilla:源代码编辑器与文本组件库的深度应用

Scite是一个轻量级的源代码编辑器,它使用Scintilla作为其文本编辑组件。Scite不仅提供了代码编写的基本功能,还通过插件系统提供了许多高级功能,如语法高亮代码自动完成等。它的跨平台特性使其能够运行在多种操作系统上,包括Windows、Linux和macOS。用户可以自定义Scintilla的许多UI元素,如滚动条、光标样式等。这通过调用等函数实现。visible:布尔值,决定是否显示垂直滚动条。curs:指定了光标的类型。

weixin_30248619的博客 1379

Scintilla文本编辑组件应用与实践

Scintilla 是一个功能丰富的源代码编辑控件,广泛应用于各种开发环境中。它支持语法高亮代码折叠、自定义样式等多种特性,让开发者可以享受快捷和高效的编辑体验。在本章中,我们将简要介绍 Scintilla 的核心特性,并剖析它在文本编辑方面的强大功能。Scintilla 控件由 Neil Hodgson 开发,以其轻量级和可定制性而著称。作为开发者,深入理解 Scintilla 的特性和使用方法,将有助于提升开发工具的用户体验。

weixin_42527665的博客 1376

Haystack 集成指南:使用 DDGSWebSearch 实现免 API Key 的多引擎网页搜索

DDGSWebSearch 是 Haystack 生态中的免密钥(keyless)网页搜索组件,底层基于 ddgs(Dux Distributed Global Search)元搜索库,聚合 DuckDuckGo、Google、Bing、Brave 等多个后端的结果并转换为 Haystack `Document` 对象。阅读本文后,你将掌握该组件的安装方式、`__init__`/`run`/`ru

gitblog_01167的博客 398
上一篇: 完全用Linux工作
下一篇: 如何在 Windows 环境下使用 Scintilla 编辑控件?收藏
skyremember
博客等级 码龄20年 203粉丝 484原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值