Browse Source

Merge branch 'cmake-dev' into cmake-plugins-dev

* cmake-dev: (38 commits)
  readme: 更新 MacOS 平台构建说明
  readme: 更新 Windows 平台构建说明
  cmake/platforms: 对 MacOS 平台构建简单支持(CPack)
  提交使用手册。
  repo: 处理 核心编辑器组件 2.11 时期的 master 分支构建
  support high dpi
  核心编辑器组件升级到2.11
  更新2.8以后新插件接口开发说明
  update README.md. 上传银河麒麟效果图。
  更新代码到2.0,更新接口到2.0新接口,让插件可以和最新ndd兼容
  update README.md. 更新macos 2.9 效果图。
  update README.md. 更新mac效果图
  Fix build error under Ubuntu and the shortcut problem
  update README.md.
  提交使用手册。
  update README.md.
  update README.md.
  update README.md.
  update README.md. 提交2.8效果图
  update README.md. 更新UOS效果图。
  ...
zinface 1 year ago
parent
commit
d8aad108f1
100 changed files with 7011 additions and 3571 deletions
  1. BIN
      08281.png
  2. 12 6
      CMakeLists.txt
  3. BIN
      Ndd使用说明.CHM
  4. BIN
      Ndd用户手册带大纲.pdf
  5. 75 14
      README.md
  6. 6 8
      README_EN.md
  7. 8 0
      cmake/modules/QScint.cmake
  8. 78 0
      cmake/platforms/macos-deployqt.cmake
  9. 22 2
      cmake/platforms/macos-universal.cmake
  10. 161 0
      cmake/platforms/macos/cpack/Info.plist
  11. 35 1
      cmake/platforms/utils.cmake
  12. 26 0
      macos.mk
  13. BIN
      png/0412.png
  14. BIN
      png/0803.png
  15. BIN
      png/0809.png
  16. BIN
      png/0828.png
  17. BIN
      png/08282.png
  18. BIN
      png/092601.png
  19. BIN
      png/10.png.png
  20. BIN
      png/100601.png
  21. BIN
      png/100602.png
  22. BIN
      png/11.png.png
  23. BIN
      png/2.8win.png
  24. BIN
      png/9.png.png
  25. BIN
      png/kinly01.png
  26. BIN
      png/kinly02.png
  27. BIN
      png/kinly03.png
  28. BIN
      png/openkylin.png
  29. 60 3
      src/CmpareMode.cpp
  30. 2 1
      src/CmpareMode.h
  31. BIN
      src/RealCompare.rc
  32. BIN
      src/Resources/edit/global/ndd.ico
  33. BIN
      src/Resources/edit/styledark/mark.png
  34. 284 111
      src/cceditor/ccnotepad.cpp
  35. 41 21
      src/cceditor/ccnotepad.h
  36. 3 0
      src/cceditor/ccnotepad.ui
  37. 263 101
      src/cceditor/filemanager.cpp
  38. 6 3
      src/cceditor/filemanager.h
  39. 1 1
      src/columnedit.ui
  40. 10 1
      src/ctipwin.cpp
  41. 1 1
      src/ctipwin.h
  42. 26 2
      src/dectfilechanges.cpp
  43. 9 0
      src/dectfilechanges.h
  44. 4 2
      src/encodeconvert.cpp
  45. 288 0
      src/findresultview.cpp
  46. 49 0
      src/findresultview.h
  47. 190 458
      src/findresultwin.cpp
  48. 17 20
      src/findresultwin.h
  49. 8 25
      src/findresultwin.ui
  50. 234 56
      src/findwin.cpp
  51. 9 1
      src/findwin.h
  52. 80 55
      src/findwin.ui
  53. 3 2
      src/include/pluginGl.h
  54. 5 6
      src/linux/usr/share/applications/NotePad--.desktop
  55. 16 1
      src/main.cpp
  56. 28 0
      src/markdownview.cpp
  57. 17 0
      src/markdownview.h
  58. 65 0
      src/markdownview.ui
  59. 25 0
      src/nddpluginapi.cpp
  60. 37 0
      src/nddpluginapi.h
  61. 17 2
      src/nddsetting.cpp
  62. 6 0
      src/nddsetting.h
  63. 0 62
      src/ndstyleditemdelegate.cpp
  64. 1 1
      src/plugin.h
  65. 1 1
      src/plugin/helloworld/helloworld.pro
  66. 46 17
      src/plugin/helloworld/helloworldexport.cpp
  67. 31 0
      src/plugin/helloworld/instanceobj.cpp
  68. 25 0
      src/plugin/helloworld/instanceobj.h
  69. 20 9
      src/plugin/helloworld/qttestclass.cpp
  70. 3 2
      src/plugin/helloworld/qttestclass.h
  71. 10 5
      src/plugin/test/test.cpp
  72. 4 1
      src/pluginGl.h
  73. 4 0
      src/qscint/scintilla/boostregex/boost/regex/config.hpp
  74. 2087 2086
      src/qscint/scintilla/include/SciLexer.h
  75. 2 1
      src/qscint/scintilla/include/Scintilla.h
  76. 170 109
      src/qscint/scintilla/lexers/LexCPP.cpp
  77. 429 0
      src/qscint/scintilla/lexers/LexGCode.cpp
  78. 362 0
      src/qscint/scintilla/lexers/LexLog.cpp
  79. 20 1
      src/qscint/scintilla/lexers/LexPerl.cpp
  80. 94 91
      src/qscint/scintilla/lexers/LexTXT.cpp
  81. 2 0
      src/qscint/scintilla/src/Catalogue.cpp
  82. 2 0
      src/qscint/scintilla/src/Document.cpp
  83. 7 1
      src/qscint/scintilla/src/EditView.cpp
  84. 32 5
      src/qscint/scintilla/src/Editor.cpp
  85. 1045 0
      src/qscint/scintilla/src/LexHex.cpp
  86. 312 226
      src/qscint/scintilla/src/LineMarker.cpp
  87. 8 5
      src/qscint/scintilla/src/MarginView.cpp
  88. 8 3
      src/qscint/scintilla/src/UniConversion.cpp
  89. 5 2
      src/qscint/scintilla/src/UniConversion.h
  90. 23 20
      src/qscint/src/InputMethod.cpp
  91. 2 2
      src/qscint/src/ListBoxQt.cpp
  92. 2 2
      src/qscint/src/ListBoxQt.h
  93. 2 2
      src/qscint/src/MacPasteboardMime.cpp
  94. 2 2
      src/qscint/src/PlatQt.cpp
  95. 2 2
      src/qscint/src/Qsci/qsciabstractapis.h
  96. 2 2
      src/qscint/src/Qsci/qsciapis.h
  97. 2 2
      src/qscint/src/Qsci/qscicommand.h
  98. 14 2
      src/qscint/src/Qsci/qscicommandset.h
  99. 2 2
      src/qscint/src/Qsci/qscidocument.h
  100. 1 1
      src/qscint/src/Qsci/qsciglobal.h

BIN
08281.png


+ 12 - 6
CMakeLists.txt

@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.20)
 
-project(Notepad-- VERSION 1.23.2)
+project(Notepad-- VERSION 2.0.0)
 
 # -------------- Notepad -- 全局构建配置 ------------- #
 option(USE_QT6 "使用 Qt6 进行编译本项目与随带所有内容" OFF)
@@ -21,6 +21,8 @@ include(cmake/SparkCMakeDebugConfig.cmake)
 if(WIN32)
     add_compile_definitions(_UNICODE= UNICODE=)
 endif()
+# 符合 2.0.0 代码预期的版本处理, 核心编辑器组件 2.11
+add_compile_definitions(TEST_PRE)
 
 # ----------------- 构建 QSci 库 ----------------- #
 if(TRUE)
@@ -48,16 +50,15 @@ option(WINDOWS_DEPLOY_QT6    "通用 Windows 平台指定 Qt6 部署 windeployqt
 option(USE_LINUX_UNIVERSAL   "通用 Linux 平台构建"            OFF)
 option(USE_LINUX_DEBIAN      "通用 Debian Linux 平台构建"     OFF)
 option(USE_LINUX_APPIMAGE    "通用 Appimage Linux 平台构建"   OFF)
-#
 option(USE_LINUX_UOS         "独立 Linux 平台的 Uos 构建"      OFF)
 #
-option(USE_MACOS_UNIVERSAL   "通用 MacOS 平台构建"            OFF)
+option(USE_MACOSX_UNIVERSAL      "通用 MacOSX 平台构建"            OFF)
 
 # 使用 windows.cmake / linux.cmake / macos.cmake 维护构建.
 
     # 在 Windows 中此处将由通用构建、MinGW 构建、MSVC 构建组成
 if(WIN32)
-    
+
     # 通用 Windows 平台构建,一切的起始
     if(USE_WINDOWS_UNIVERSAL)
         include(cmake/platforms/windows-universal.cmake)
@@ -106,10 +107,15 @@ elseif(UNIX AND NOT APPLE AND NOT WIN32 AND NOT ANDROID)
         # include(cmake/platforms/linux-other.cmake)
     endif(USE_LINUX_UNIVERSAL)
 
-    # 通用 MacOS 平台的构建(一个无具体实现的空构建)
+    # 通用 MacOSX 平台的构建
 elseif(APPLE)
 
-    # include(cmake/platforms/macos.cmake)
+    # 通用 MacOSX 平台构建,一切的起始
+    if(USE_MACOSX_UNIVERSAL)
+        include(cmake/platforms/macos-universal.cmake)
+        
+    endif(USE_MACOSX_UNIVERSAL)
+
 endif()
 
 # ----------------- Notepad-- 其它主线构建相关  ----------------- #

BIN
Ndd使用说明.CHM


BIN
Ndd用户手册带大纲.pdf


+ 75 - 14
README.md

@@ -4,11 +4,9 @@
 
 ## 项目简介
 
-这是一个使用C++编写的文本编辑器Notepad--,可以支持Win/Linux/Mac平台。
+Notepad-- 是使用C++编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。
 
-我们的目标是要进行文本编辑类软件的国产可替代,重点在国产Uos/Linux系统、Mac 系统上发展。
-
-一个支持windows/linux/mac的文本编辑器,目标是要国产替换同类软件,来自中国。
+我们的目标:完成文本编辑类软件的国产可替代,重点在国产Uos/Linux系统、Mac 系统上发展。
 
 对比其它竞品Notepad类软件而言,我们的优势是可以跨平台,支持linux mac操作系统。
 
@@ -18,12 +16,9 @@
 
 您可以在这个项目提交bug或反馈问题。
 
-最新版本下载地址:https://gitee.com/cxasm/notepad--/releases/tag/v1.22
-
-最新内测版本下载地址:https://gitee.com/cxasm/notepad--/releases/tag/v1.23
+最新版本下载地址:https://gitee.com/cxasm/notepad--/releases/latest
 
-NDD已初步推出插件编写功能,希望广大的CPP/QT开发者加入我们,插件功能均可以留上您的大名和捐赠渠道,希望
-开发者参与插件功能开发。
+NDD 具备插件编写功能,如果您愿意开发插件,还请提交给我们。
 
 做国人自己的免费编辑器,离不开您的支持,请通过微信捐赠我们。
 
@@ -33,6 +28,42 @@ NDD已初步推出插件编写功能,希望广大的CPP/QT开发者加入我
 
 **CMake工具链编译说明:**
 
+- Windows 系统通用构建 - 基于 Batch 脚本进行构建
+    
+    ```batch
+    ;; 将 Batch 脚本复制到项目目录
+    copy cmake/make-batch-powershell/windows-msvc-ninja.bat .
+
+    ;; 使用脚本进行构建,它将会询问如何进行构建
+    windows-msvc-ninja.bat
+    ```
+
+- Windows 系统 VSCode 构建 - 基于 VSCode 配置模板进行调整构建
+
+    ```batch
+    ;; 拷贝一份 cmake/vscode/windows-vs-2022-cmake-ninja.json 作为你的 .vscode/settings.json
+    ;; 修改配置中的 -DCMAKE_PREFIX_PATH 部分为你的 Qt 路径,或你自行编译的 Qt 路径,
+    ;; 例如:
+    ;;    "-DCMAKE_PREFIX_PATH=C:\\Qt\\Qt5.14.2\\5.14.2\\msvc2017_64",
+    ```
+
+- MacOSX 平台构建方案
+
+    ```shell
+    Build with the following configuration:
+    1. make macosx-universal 
+            通用 MacOSX 平台构建(Debug).
+    2. make macosx-universal-release 
+            通用 MacOSX 平台构建(Release).
+    3. make package 
+            通用 MacOSX 平台构建 CPack 打包.
+
+    # 由 CPack 驱动的打包:
+    # 将在 build/macosx-universal 目录中产生 dmg 文件
+    # 可在 CPack 的生成目录尝试进行手动 macdeployqt 处理
+    # 注:目前M1平台使用原生Qt执行此操作会损坏此包,将需要开发者签证
+    ```
+
 - 当前的 Linux 平台构建方案
 
     ```shell
@@ -153,16 +184,46 @@ yay -S notepad---git
 ```
 ## 联络方式
 
-QQ群:372613546 959439826(已满) 用户群,做NDD的问题反馈、功能建议等。
+QQ群:372613546(已满) 959439826(已满)728578708(空闲) 用户群,做NDD的问题反馈、功能建议等。
 
 QQ群 616606091 开发群,建议懂CPP/QT、愿意参与NDD项目代码贡献的开发人士加入。
 
+## 编译或使用手册
+见build目录下文档 linux开源编译及下载说明.txt
+见本仓库文档 Ndd使用说明.CHM
+
 ## 效果预览
 
-![输入图片说明](png/20221107_160824.png)
+ **windows效果图:** 
+![输入图片说明](png/0828.png)
+
+![深色模式主题](png/2.8win.png)
+
+![编辑修改二进制](png/08282.png)
+
+![文件对比](png/6.png)
+
+ **MacOS 效果图:** 
+
+![输入图片说明](png/100602.png)
+
+![输入图片说明](png/100601.png)
+
+![Mac系统文件对比图](png/%E6%88%AA%E5%B1%8F2023-02-26%2011.45.48.png)
+
+![输入图片说明](png/092601.png)
+
+
+ **Redhat7.x 效果图:** 
+
+![输入图片说明](png/10.png.png)
+
+ **UOS 深度 效果图:** 
+![输入图片说明](png/0809.png)
 
-![输入图片说明](png/6.png)
+ **银河麒麟 开源openkylin amd x64 效果图:** 
+![输入图片说明](png/kinly01.png)
 
-![Mac系统运行图](png/%E6%88%AA%E5%B1%8F2023-02-26%2011.41.20.png)
+![输入图片说明](png/kinly02.png)
 
-![Mac系统文件对比图](png/%E6%88%AA%E5%B1%8F2023-02-26%2011.45.48.png)
+![输入图片说明](png/kinly03.png)

+ 6 - 8
README_EN.md

@@ -4,19 +4,17 @@
 
 ## Project Introduction
 
-Introducing Notepad-- a text editor written in C++ that works seamlessly across Windows, Linux, and Mac platforms. Our aim is to eventually surpass Notepad++, with a particular focus on the Chinese UOS operating system. Unlike Notepad++, our advantage lies in our cross-platform compatibility and support for various OSes.
+Introducing Notepad-- a text editor written in C++ that works seamlessly across Windows, Linux, and Mac platforms. Our goal is to eventually surpass Notepad++, with a special focus on the Chinese UOS operating system. Unlike Notepad++, our advantage lies in our cross-platform compatibility and support for different operating system.
 
-**The purpose of Notepad-- is to counteract some of the misguided remarks made by the author of Notepad++ and to promote a more humble and grounded perspective.** 
+**The purpose of Notepad-- is to counteract some of the misleading statements made by the author of Notepad++ and to promote a more humble and grounded perspective.** 
 
-If you come across any bugs or have any feedback, feel free to share it with us.
+If you come across any bugs or have any feedback, feel free to let us know.
 
-You can download the latest version at https://gitee.com/cxasm/notepad--/releases/tag/v1.21.
+You can download the latest version from https://gitee.com/cxasm/notepad--/releases/tag/v2.0.
 
-The latest development version can be found at https://gitee.com/cxasm/notepad--/releases/tag/v1.22.
+We have recently added the ability to write plugins to Notepad-- and we hope that many CPP/QT developers will join us in this endeavour. If you develop a plugin, you can include your name and a donation channel.
 
-We have recently added the plugin writing feature to Notepad-- and we hope that many CPP/QT developers will join us in this endeavor. If you develop a plugin, you can include your name and a donation channel.
-
-Creating a free text editor requires support from users like you. If you'd like to contribute, please consider donating through WeChat.
+Creating a free text editor requires support from users like you. If you'd like to contribute, please consider donating via WeChat.
 
 ![Input description picture](6688.png)
 

+ 8 - 0
cmake/modules/QScint.cmake

@@ -39,10 +39,18 @@ if(TRUE)
         target_link_qt6_Core5Compat(QSci)
         target_link_qt6_PrintSupport(QSci)
         target_link_qt6_Concurrent(QSci)
+        if(APPLE)
+            # Is there anything missing?
+            # MacExtras?
+        endif(APPLE)
     else()
         target_link_qt5(QSci)
         target_link_qt5_PrintSupport(QSci)
         target_link_qt5_Concurrent(QSci)
+        if(APPLE)
+            find_package(Qt5 COMPONENTS MacExtras)
+            target_link_libraries(QSci Qt5::MacExtras)
+        endif(APPLE)
     endif(USE_QT6)
 endif(TRUE)
 

+ 78 - 0
cmake/platforms/macos-deployqt.cmake

@@ -0,0 +1,78 @@
+# macos-deployqt.cmake
+
+# NOTE: 未提供可用性判断
+
+# option(MACOSX_DEPLOY_QT  "为 MacOS 中构建的应用进行 macdeployqt" OFF)
+# option(MACOSX_DEPLOY_QT5 "为 MacOS 中构建的 QT5 应用进行 macdeployqt" OFF)
+# option(MACOSX_DEPLOY_QT6 "为 MacOS 中构建的 QT6 应用进行 macdeployqt" OFF)
+
+# if(USE_MACOSX_DEPLOY_QT)
+#     if(MACOSX_DEPLOY_QT5)
+#         # 当使用 MACOSX_DEPLOY_QT5 配方时,将使用来源于 Qt5 中提供的路径
+#         set(MACOSX_QT_DIR "${Qt5_DIR}")
+#     elseif(MACOSX_DEPLOY_QT6)
+#         # 当使用 MACOSX_DEPLOY_QT6 配方时,将使用来源于 Qt6 中提供的路径
+#         set(MACOSX_QT_DIR "${Qt6_DIR}")
+#     endif()
+
+#     if (MACOSX_DEPLOY_QT5 OR MACOSX_DEPLOY_QT6)
+
+#         if(USE_QT6)
+#             set(MACOSX_QT_DIR "${Qt6_DIR}")
+#         endif(USE_QT6)
+
+#         #/opt/homebrew/Cellar/qt@5/5.15.10_1/bin/macdeployqt
+#         set(MACOS_APPLICATION_DEPLOY_PATH
+#             ${CMAKE_BINARY_DIR}/macos-deployqt)
+
+#         set(MACOS_APPLICATION_BUNDLE_PATH
+#             ${MACOS_APPLICATION_DEPLOY_PATH}/${PROJECT_NAME}.app)
+
+#         # set_target_properties(${PROJECT_NAME}
+#             # PROPERTIES
+#                 # 可执行文件生成目录
+#                 # MACOSX_BUNDLE TRUE
+#                 # RUNTIME_OUTPUT_DIRECTORY ${MACOS_APPLICATION_DEPLOY_PATH})
+#                 # RUNTIME_OUTPUT_DIRECTORY ${MACOS_APPLICATION_DEPLOY_PATH}/Contents/MacOS)
+
+#         message("MACOS_QT_DIR: ${MACOS_QT_DIR}")
+
+
+#         # install(FILES src/mac.icns
+#         #     DESTINATION
+#         #         ${MACOS_APPLICATION_DEPLOY_PATH}/Contents/Resources)
+
+#         # add_custom_command(TARGET ${PROJECT_NAME}
+#         #     # 在构建之后计划进行执行以下命令
+#         #     POST_BUILD
+#         #         # 即将在构建目录中
+#         #         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+#         #         # COMMAND ${CMAKE_COMMAND} -E make_directory
+#         #             # ${MACOS_APPLICATION_BUNDLE_PATH}/Contents/Resources/
+#         #         # COMMAND ${CMAKE_COMMAND} -E copy
+#         #             # ${CMAKE_SOURCE_DIR}/src/mac.icns
+#         #             # ${MACOS_APPLICATION_BUNDLE_PATH}/Contents/Resources/
+#         #         # 执行以下命令进行 windeployqt
+#         #         COMMAND ${MACOS_QT_DIR}/../../../bin/macdeployqt
+#         #             #
+#         #             ${MACOS_APPLICATION_BUNDLE_PATH}
+
+#         #             # 扫描QML-从目录开始导入。
+#         #             #--qmlimport=${MACOS_QT_DIR}/../../../qml
+#         #             # 部署编译器运行时(仅限桌面)。
+#         #             #--compiler-runtime
+#         #             # 详细级别(0-2)
+#         #             #--verbose=2
+#         #             # 部署运行时使用指定的目录
+#         #             # --dir ${MACOS_APPLICATION_DEPLOY_PATH}
+#         # )
+
+#         if(USE_MAC_DEPLOYQT)
+#             include(cmake/platforms/utils.cmake)
+#             macdeployqt_install(${PROJECT_NAME})
+#         endif(USE_MAC_DEPLOYQT)
+        
+#         include(CPack)
+
+#     endif(MACOSX_DEPLOY_QT5 OR MACOSX_DEPLOY_QT6)
+# endif(USE_MACOSX_DEPLOY_QT)

+ 22 - 2
cmake/platforms/macos-universal.cmake

@@ -1,5 +1,25 @@
 # macos-universal.cmake
 
-if(USE_MACOS_UNIVERSAL)
+# 此构建表示,在 MacOSX 中以通用平台的构建方式进行构建此内容
+# 为 Notepad-- 通用构建的设计安装结构
+# 
+# Contents/             在 MacOSX 中标准的包目录
+#       MacOS/         
+#           Notepad--   在 MacOSX 中标准的程序位置
+# 
+#       Resources/
+#           ...
 
-endif(USE_MACOS_UNIVERSAL)
+if(CMAKE_HOST_APPLE)
+
+    set(CPACK_GENERATOR    "Bundle")
+    set(CPACK_BUNDLE_NAME  ${PROJECT_NAME})
+    set(CPACK_BUNDLE_ICON  ${CMAKE_SOURCE_DIR}/src/mac.icns)
+    set(CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/cmake/platforms/macos/cpack/Info.plist)
+
+    # 程序安装位置
+    install(TARGETS ${PROJECT_NAME} DESTINATION ../MacOS)
+    # 安装 themes
+    install(DIRECTORY src/themes DESTINATION ../MacOS)
+
+endif(CMAKE_HOST_APPLE)

+ 161 - 0
cmake/platforms/macos/cpack/Info.plist

@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleExecutable</key>
+	<string>Notepad--</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Created by zuoweiyin</string>
+    <key>CFBundleDocumentTypes</key>
+    <array>
+    <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>txt</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>txt.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>abc file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>XML</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>cpp</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>cpp.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>cpp file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>xml</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>c</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>c.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>c file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>xml</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>h</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>h.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>h file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>XML</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>html</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>html.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>html file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>XML</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+   <string>ini</string> 
+    <string>go</string> 
+    <string>java</string> 
+    <string>js</string> 
+    <string>json</string> 
+    <string>xml</string> 
+    <string>pro</string> 
+    <string>pri</string> 
+    <string>php</string> 
+    <string>asp</string> 
+    <string>bat</string> 
+    <string>asm</string> 
+    <string>html</string> 
+    <string>yml</string>
+    <string>js</string>
+    <string>sh</string>
+    <string>log</string>
+	<string>csv</string>
+	<string>json</string>
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>*.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>* file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>XML</string>
+    </dict>
+   <dict> 
+    <key>CFBundleTypeExtensions</key>
+    <array>
+    <string>html</string> 
+    </array>
+    <key>CFBundleTypeIconFile</key> 
+    <string>html.png</string> 
+     <key>CFBundleTypeName</key> 
+    <string>html file</string> 
+    <key>CFBundleTypeRole</key>
+    <string>Editor</string>
+    <key>LSTypeIsPackage</key>
+    <true/>
+    <key>NSPersistentStoreTypeKey</key>
+    <string>XML</string>
+    </dict>
+    </array>
+	<key>CFBundleIconFile</key>
+        <string>Notepad--.icns</string>
+	<key>CFBundleIdentifier</key>
+	<string>www.itdp.cn.Notepad--</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>LSMinimumSystemVersion</key>
+        <string>14.1</string>
+	<key>NOTE</key>
+	<string>This file was generated by Qt/QMake.</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+	<key>NSSupportsAutomaticGraphicsSwitching</key>
+	<true/>
+        <key>NSRequiresAquaSystemAppearance</key>
+	<true/>
+</dict>
+</plist>

+ 35 - 1
cmake/platforms/utils.cmake

@@ -5,7 +5,7 @@
     # _VAR          用于存储内容的变量
     # _IS_IS_SHREAD 是否为共享库
     # _LIB          目标名称
-function(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
+    function(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
     set(_LIB_NAME  "")
     if(WIN32)
         set(_LIB_NAME ${_LIB}.lib)
@@ -101,3 +101,37 @@ function(windeployqt_install TARGET)
         "
     )
 endfunction(windeployqt_install TARGET)
+
+# 
+# [UnTested]macdeployqt_install
+    # MacOSX 在 install 目标时进行 macdeployqt 的自动化
+    # 由于
+function(macdeployqt_install _target)
+    set(MACDEPLOYQT_EXECUTABLE "${MACOS_QT_DIR}/../../../bin/macdeployqt")
+    #
+    file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/${_target}_PATH"
+        # CONTENT "$<TARGET_FILE:${_target}>"
+        CONTENT "${CMAKE_BINARY_DIR}/_CPack_Packages/Darwin/Bundle/${_target}-${PROJECT_VERSION}-Darwin/${_target}.app"
+    )
+    install(CODE
+        "
+        file(READ \"${CMAKE_BINARY_DIR}/${_target}_PATH\" _file)
+        execute_process(
+            COMMAND \"${MACDEPLOYQT_EXECUTABLE}\"
+                    # 虚假的运行 macdeployqt 而不复制任何内容
+                    --dry-run
+                    # 扫描QML-从目录开始导入。
+                    #--qmlimport=${MACOS_QT_DIR}/../../../qml
+                    # 部署编译器运行时(仅限桌面)。
+                    #--compiler-runtime
+                    # 以源 目标的输出形成映射关系,以便用于解析内容
+                    #--list mapping
+                    #-no-plugins
+                    #-timestamp
+                    \${_file}
+            OUTPUT_VARIABLE _output
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+        )
+        "
+    )
+endfunction(macdeployqt_install _target)

+ 26 - 0
macos.mk

@@ -1,4 +1,30 @@
 Msg   := 'Build with the following configuration:'
+One   := '1. make macosx-universal'
+Two   := '2. make macosx-universal-release'
+Three := '3. make package'
 
 all:
 	@echo $(Msg)
+	@echo $(One)    "\n\t通用 MacOSX 平台构建(Debug)."
+	@echo $(Two)    "\n\t通用 MacOSX 平台构建(Release)."
+	@echo $(Three)  "\n\t通用 MacOSX 平台构建 CPack 打包."
+
+builddir  := build/macosx-universal
+sourcedir := .
+CMAKE_DEBUG     := -DCMAKE_BUILD_TYPE=Debug
+CMAKE_RELEASE   := -DCMAKE_BUILD_TYPE=Release
+CMAKE_OPTIONS   := -DUSE_MACOSX_UNIVERSAL=ON
+
+CPUS=8
+
+macosx-universal:
+	cmake -B$(builddir) $(CMAKE_OPTIONS) $(CMAKE_DEBUG)
+	cmake --build $(builddir) -- -j$(CPUS)
+
+macosx-universal-release:
+	cmake -B$(builddir) $(CMAKE_OPTIONS) $(CMAKE_RELEASE)
+	cmake --build $(builddir) -- -j$(CPUS)
+
+
+package: macosx-universal-release
+	make -C $(builddir) package

BIN
png/0412.png


BIN
png/0803.png


BIN
png/0809.png


BIN
png/0828.png


BIN
png/08282.png


BIN
png/092601.png


BIN
png/10.png.png


BIN
png/100601.png


BIN
png/100602.png


BIN
png/11.png.png


BIN
png/2.8win.png


BIN
png/9.png.png


BIN
png/kinly01.png


BIN
png/kinly02.png


BIN
png/kinly03.png


BIN
png/openkylin.png


+ 60 - 3
src/CmpareMode.cpp

@@ -992,7 +992,9 @@ CODE_ID CmpareMode::readLineFromFile(uchar* m_fileFpr, const int fileLength, con
 
 
 //扫描文件的字符编码,不输出文件
-CODE_ID CmpareMode::scanFileRealCode(QString filePath)
+//扫描多少行scanLineNum 默认100
+//如果是-1 之前全部扫描
+CODE_ID CmpareMode::scanFileRealCode(QString filePath, int scanLineNum)
 {
 	QFile file(filePath);
 	file.open(QIODevice::ReadOnly);
@@ -1060,8 +1062,10 @@ CODE_ID CmpareMode::scanFileRealCode(QString filePath)
 
 		++lineNums;
 
-		//最多扫描200行,加块速度。速度与精确性的权衡
-		if (lineNums >= 200)
+		//默认最多扫描200行,加块速度。速度与精确性的权衡
+		//对于打开文件,默认扫描前面的200行,加快速度。
+		//对于编码转换,为了精确,默认全部都要处理
+		if ((scanLineNum != -1) && (lineNums >= scanLineNum))
 		{
 			break;
 		}
@@ -1103,3 +1107,56 @@ CODE_ID CmpareMode::scanFileOutPut(CODE_ID code, QString filePath, QList<LineFil
 
 	return code;
 }
+
+//读取文件,并输出
+//bytes charsNums:文件字符个数,不是文件大小
+//20220908 自动判断是否是二进制文件。isHexFile 是输出
+//20230304 新增,一次性读取文件,不检测每行文本,加快速度。existGrbledCode 是否存在乱码
+CODE_ID CmpareMode::scanFileOutPut(QFile& pFile, CODE_ID code, QString filePath, QString& outText, bool & existGrbledCode)
+{
+	QByteArray outTextBytes = pFile.readAll();
+
+	if (outTextBytes.size() == 0)
+	{
+		outText = "";
+		existGrbledCode = false;
+		return CODE_ID::UTF8_NOBOM;
+	}
+
+	if (code == UNKOWN)
+	{
+		code = getTextFileEncodeType((uchar * )outTextBytes.data(), pFile.size(), filePath);
+
+		//编码还是检测失败,这里概率是比较小的。
+		if (code == CODE_ID::UNKOWN)
+		{
+			//无条件按照ANSI/GBK编码打开
+			code = CODE_ID::GBK;
+		}
+	}
+
+	int lineStartPos = 0; //uicode_le前面有2个特殊标识,故跳过2
+
+	if (code == CODE_ID::UNICODE_BE || code == CODE_ID::UNICODE_LE)
+	{
+		lineStartPos = 2;
+	}
+	else if (code == CODE_ID::UTF8_BOM)
+	{
+		lineStartPos = 3;
+	}
+		
+	bool codeSucess = Encode::tranStrToUNICODE(code, outTextBytes.data()+ lineStartPos, outTextBytes.size()- lineStartPos, outText);
+
+	//如果存在乱码,而且不是以gbk编码打开,再无条件尝试ASNI/GBK编码打开。如果是国际版,后续还得完善策略,得无条件以ASNI本地编码打开。
+	if (!codeSucess && (code != CODE_ID::GBK))
+	{
+		code = CODE_ID::GBK;
+		outText.clear();
+		codeSucess = Encode::tranStrToUNICODE(code, outTextBytes.data() + lineStartPos, outTextBytes.size() - lineStartPos, outText);
+	}
+	existGrbledCode = !codeSucess;
+
+	return code;
+}
+

+ 2 - 1
src/CmpareMode.h

@@ -70,8 +70,9 @@ public:
 	static CODE_ID judgeFinalTextCode(CODE_ID code, bool isExistUnKownCode, bool isExistGbk, bool isExistUtf8);
 	static CODE_ID readLineFromFile(uchar * m_fileFpr, const int fileLength, const CODE_ID fileCode, QList<LineFileInfo>& lineInfoVec,int& maxLineSize, int& charsNums, bool &isMaybeHexFile);
 
-	static CODE_ID scanFileRealCode(QString filePath);
+	static CODE_ID scanFileRealCode(QString filePath,int scanLineNum=200);
 	static CODE_ID scanFileOutPut(CODE_ID code, QString filePath, QList<LineFileInfo>& outputLineInfoVec, int & maxLineSize, int & charsNums, bool &isHexFile);
+	static CODE_ID scanFileOutPut(QFile& pFile, CODE_ID code, QString filePath, QString& outText, bool& existGrbledCode);
 
 	static CODE_ID getTextFileEncodeType(uchar* fileFpr, int fileLength, QString filePath="", bool isCheckHead = true);
 	static bool tranUnicodeLeToUtf8Bytes(uchar* fileFpr, const int fileLength, QString& outUtf8Bytes, bool isSkipHead=false);

BIN
src/RealCompare.rc


BIN
src/Resources/edit/global/ndd.ico


BIN
src/Resources/edit/styledark/mark.png


File diff suppressed because it is too large
+ 284 - 111
src/cceditor/ccnotepad.cpp


+ 41 - 21
src/cceditor/ccnotepad.h

@@ -23,6 +23,7 @@
 #include "findwin.h"
 #include "pluginGl.h"
 
+
 //class ScintillaEditView;
 class ScintillaHexEditView;
 class FindRecords;
@@ -33,7 +34,6 @@ class CompareWin;
 struct HexFileMgr;
 struct TextFileMgr;
 struct BigTextEditFileMgr;
-class QtLangSet;
 
 static const char* Tail_Thread = "tailthread";
 
@@ -87,6 +87,7 @@ enum NddDocType {
 //打开模式。1 文本 2 二进制 3 大文本只读 4 文本只读
 //const char* Open_Attr = "openid";
 class FileListView;
+class QtLangSet;
 
 class CCNotePad : public QMainWindow
 {
@@ -102,7 +103,7 @@ public:
 	void setLineEndBarLabel(RC_LINE_FORM lineEnd);
 
     void initLexerNameToIndex();
-	
+
 	static LexerInfo getLangLexerIdByFileExt(QString filePath);
 
 	bool openFile(QString filePath, int lineNum=-1);
@@ -147,19 +148,24 @@ public:
 
 	void changeMarkColor(int sytleId);
 	void setUserDefShortcutKey(int shortcutId);
-	
+
 	QtLangSet* getLangSet();
+	void setEditLangs(ScintillaEditView* pEdit,LangType langs);
+#ifdef NO_PLUGIN
+	//插件中调用主程序的功能。
+	bool pluginInvoke(int cmdId, void* data);
+#endif
 signals:
 	void signSendRegisterKey(QString key);
 	void signRegisterReplay(int code);
 	void signLinkNetServer();
 #ifdef Q_OS_WIN
-	void tailFileChange(ScintillaEditView*);
+	void tailFileChange(ScintillaEditView*,qint64 lastSize, qint64 curSize);
 #endif 
 public slots:
 	void slot_changeChinese();
 	void slot_changeEnglish();
-	
+
 	void slot_actionNewFile_toggle(bool checked);
 	void slot_actionOpenFile_toggle(bool checked);
 	void slot_actionSaveFile_toggle(bool checked);
@@ -197,6 +203,7 @@ protected:
 	void closeEvent(QCloseEvent *event) override;
 	void dragEnterEvent(QDragEnterEvent* event) override;
 	void dropEvent(QDropEvent* e) override;
+	void dragLeaveEvent(QDragLeaveEvent* event);
 	bool eventFilter(QObject *watched, QEvent *event)override;
 #ifdef Q_OS_WIN
 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
@@ -236,10 +243,12 @@ private slots:
 
 	void slot_replace();
 	void slot_markHighlight();
-	
+
 	void slot_findResultPosChangeed(Qt::DockWidgetArea area);
 	void slot_findResultItemDoubleClick(const QModelIndex & index);
+#if 0
 	void slot_showFindAllInCurDocResult(FindRecords * record);
+#endif
 	void slot_showfindAllInOpenDocResult(QVector<FindRecords*>* record, int hits, QString whatFind);
 	void slot_clearFindResult();
 	void slot_convertWinLineEnd(bool);
@@ -312,7 +321,7 @@ private slots:
 	void slot_spaceToTabAll();
 	void slot_spaceToTabLeading();
 
-	
+
 	void slot_dupCurLine();
 	void slot_removeDupLine();
 	void slot_splitLines();
@@ -321,7 +330,7 @@ private slots:
 	void slot_moveDownCurLine();
 	void slot_insertBlankAbvCur();
 	void slot_insertBlankBelCur();
-	
+
 	void slot_reverseLineOrder();
 	void slot_sortLexAsc();
 	void slot_sortLexAscIgnCase();
@@ -358,7 +367,7 @@ private slots:
 	void on_lineEndChange(int index);
 	void on_tailfile(bool isOn);
 #ifdef Q_OS_WIN
-	void on_roladFile(ScintillaEditView* pEdit);
+	void on_roladFile(ScintillaEditView* pEdit,quint64 lastSize, qint64 curSize);
 #endif
 	void on_md5hash();
 
@@ -376,7 +385,7 @@ private:
 	void saveReceneOpenFile();
 	void updateSaveAllToolBarStatus();
 	void initReceneOpenFileMenu();
-	
+
 	int findFileIsOpenAtPad(QString filePath);
 	bool isNewFileNameExist(QString& fileName);
 	void updateCurTabSaveStatus();
@@ -400,11 +409,15 @@ private:
 	void addWatchFilePath(QString filePath);
 	void removeWatchFilePath(QString filePath);
 
-	bool checkRoladFile(ScintillaEditView * pEdit);
-	void reloadEditFile(ScintillaEditView * pEidt, bool isTailfOn = false);
+	void doReloadTxtFile(ScintillaEditView* pEdit, bool isOnTail, qint64 startReadSize);
+	void firstTimeIntoTail(ScintillaEditView* pEdit, int remainLineNums=100);
+	bool checkRoladFile(ScintillaEditView * pEdit, qint64 startReadSize=-1);
+	void reloadEditFile(ScintillaEditView * pEidt, bool isTailfOn = false, qint64 startReadSize=-1);
 	int initFindWindow(FindTabIndex type= FIND_TAB);
 
 	void setToFileRightMenu();
+	void initReceneCmp();
+	void saveReceneCmp();
 
 	QString getShortName(const QString& name);
 
@@ -418,7 +431,7 @@ private:
 
 	bool openTextFile(QString filePath, bool isCheckHex = true, CODE_ID code=CODE_ID::UNKOWN);
 	bool openHexFile(QString filePath);
-	
+
 	bool showHexFile(ScintillaHexEditView * pEdit, HexFileMgr * hexFile);
 
 	bool showBigTextFile(ScintillaEditView * pEdit, TextFileMgr * hexFile);
@@ -436,7 +449,7 @@ private:
 	void restoreCleanExistFile(QString & filePath);
 	void restoreDirtyNewFile(QString & fileName, QString & tempFilePath, int lexid=L_TXT);
 	bool restoreDirtyExistFile(QString & fileName, QString & tempFilePath);
-	
+
 	ScintillaEditView* newTxtFile(QString Name, int index, QString contentPath="");
 	void setLangsDescLable(QString &langDesc);
 	void transCurUpperOrLower(TextCaseType type);
@@ -465,6 +478,7 @@ private:
 	void loadPluginLib();
 	void loadPluginProcs(QString strLibDir, QMenu* pMenu);
 	void onPlugFound(NDD_PROC_DATA& procData, QMenu* pUserData);
+	void destroyAllPluginModule();
 #endif
 
 	void setUserDefShortcutKey();
@@ -475,6 +489,7 @@ private:
 	void doFold(int type, bool mode);
 	void doComment(int type);
 	void tailfile(bool isOn, ScintillaEditView* pEdit);
+	void on_findResultlineDoubleClick(QString* pFilePath, int pos, int end);
 private:
 	Ui::CCNotePad ui;
 
@@ -512,7 +527,7 @@ private:
     QMap<QString, LexerNode> m_lexerNameToIndex;
 
 	//监控文件被修改的对象
-	QFileSystemWatcher* m_fileWatch;
+	static QFileSystemWatcher* m_fileWatch;
 
 	QString m_cmpLeftFilePath;
 	QString m_cmpRightFilePath;
@@ -521,11 +536,15 @@ private:
 	QPointer<QWidget> m_columnEditWin;
 	QPointer<QMainWindow> m_langSetWin;
 	QPointer<QWidget> m_optionsView;
-	
+
 
 	QSharedMemory* m_shareMem;
 
 
+
+	QList<CompareDirs*> m_cmpDirMgr;
+	QList<CompareWin*> m_cmpFileMgr;
+
 	//最近打开的对比文件和目录列表。做一个环形区
 //保存在数据库中
 	int m_receneDirStartPos;
@@ -546,15 +565,13 @@ private:
 	QAction* m_selectRightCmp;
 
 
-	//所有打开的notebook均保存起来。关闭时切换share里面保存的地址
-	static QList<CCNotePad*> *s_padInstances;
-
 	//当前打开的二进制文件,保存在这里
 	QMap<QString, HexFileMgr*> m_hexFileMgr;
 
 	QPointer<QWidget> m_pHexGotoWin;
 
 	static QStringList s_findHistroy;
+	static QStringList s_replaceHistroy;
 	static int s_padTimes;
 
 	int m_curSoftLangs; //当前语言0:自动 1 中文 2 英语
@@ -563,8 +580,8 @@ private:
 	static int s_indent; //自动缩进
 	static int s_showblank; //显示空白
 	static int s_zoomValue;
-	
-	
+
+
 	QTranslator* m_translator;
 	QTimer * m_timerAutoSave;
 
@@ -619,6 +636,9 @@ private:
 	QList<NDD_PROC_DATA> m_pluginList;
 
 public:
+	//所有打开的notebook均保存起来。关闭时切换share里面保存的地址
+	static QList<CCNotePad*>* s_padInstances;
+
 		static QString s_lastOpenDirPath;
 	static int s_restoreLastFile; //自动恢复上次打开的文件
 	static int s_curStyleId;

+ 3 - 0
src/cceditor/ccnotepad.ui

@@ -1627,6 +1627,9 @@
    <property name="text">
     <string>Column Block Editing</string>
    </property>
+   <property name="shortcut">
+    <string>Alt+X</string>
+   </property>
   </action>
   <action name="actionWrap">
    <property name="checkable">

+ 263 - 101
src/cceditor/filemanager.cpp

@@ -9,7 +9,9 @@
 #include <QFile>
 #include <QtGlobal>
 #include <qscilexer.h>
+#include <QFileInfo>
 
+LangType detectLanguage(QString& headContent, QString& filepath);
 
 FileManager::FileManager():m_lastErrorCode(NONE_ERROR)
 {
@@ -218,6 +220,68 @@ void FileManager::delNewFileNode(int fileIndex)
 	}
 }
 
+//和loadFileDataInText类似,但是不是从头开始读取文件,而是从startReadSize开始
+//不检查编码,直接按照fileTextCode进行读取
+int FileManager::loadFileDataInTextFromOffset(ScintillaEditView* editView, QString filePath, CODE_ID fileTextCode, QWidget* msgBoxParent, quint64 startReadSize)
+{
+	QFile file(filePath);
+
+	//如果文件不存在,直接返回
+	if (!file.exists())
+	{
+		return -1;
+	}
+
+	QFlags<QFileDevice::Permission> power = QFile::permissions(filePath);
+
+	//直接以只读的方式打开,至于能不能保存,是保存时需要考虑的问题。
+	//只需要在保存的时候获取admin权限即可
+	QIODevice::OpenMode mode;
+
+	mode = QIODevice::ExistingOnly | QIODevice::ReadOnly;
+
+	if (!file.open(mode))
+	{
+		QMessageBox::warning(msgBoxParent, tr("Error"), tr("Open File %1 failed").arg(filePath));
+		return 2;
+	}
+
+	quint64 fileSize = file.size();
+
+	//如果文件是空的。检查一下,有可能在临时文件损坏情况下出现,外面需要使用
+	if (fileSize == 0)
+	{
+		file.close();
+		return 0;
+	}
+
+	//如果读取的内容,超过了当前文件大小,则直接返回。这里是返回0,视作成功,没有新内容要读
+	if (startReadSize >= fileSize)
+	{
+		file.close();
+		return 0;
+	}
+
+	QByteArray bytes;
+
+	if (file.seek(startReadSize))
+	{
+		//读取后面所有的内容
+		bytes = file.readAll();
+	}
+
+	file.close();
+
+	QString text;
+
+	Encode::tranStrToUNICODE(fileTextCode, bytes.data(), bytes.count(), text);
+	
+	editView->append(text);
+
+	return 0;
+}
+
+#if 0
 
 //这里是以文本方式加载文件。但是可能遇到的是二进制文件,里面会做判断
 //二进制时hexAsk是否询问,当用户指定打开格式时,不需要询问
@@ -406,22 +470,182 @@ int FileManager::loadFileDataInText(ScintillaEditView* editView, QString filePat
 	return 0;
 }
 
-//加载文件,只为查找使用
-int FileManager::loadFileForSearch(ScintillaEditView* editView, QString filePath)
+#endif
+
+//20230304新增加:不再一行一行读取文件,而是一次性读取到内存,加快文本文件打开时的处理速度
+//这里是以文本方式加载文件。但是可能遇到的是二进制文件,里面会做判断
+//二进制时hexAsk是否询问,当用户指定打开格式时,不需要询问
+//MsgBoxParent::尽量把这个给一下,让MsgBox有图标,不那么难看。
+int FileManager::loadFileDataInText(ScintillaEditView* editView, QString filePath, CODE_ID& fileTextCode, RC_LINE_FORM& lineEnd, CCNotePad* callbackObj, bool hexAsk, QWidget* msgBoxParent)
 {
 	QFile file(filePath);
 
+	//如果文件不存在,直接返回
+	if (!file.exists())
+	{
+		return -1;
+	}
+
 	QFlags<QFileDevice::Permission> power = QFile::permissions(filePath);
 
-	if (!power.testFlag(QFile::ReadOwner))
+	//直接以只读的方式打开,至于能不能保存,是保存时需要考虑的问题。
+	//只需要在保存的时候获取admin权限即可
+	QIODevice::OpenMode mode;
+
+	mode = QIODevice::ExistingOnly | QIODevice::ReadOnly;
+
+	if (!file.open(mode))
 	{
-		//文件不能读
+		qDebug() << file.error();
+#ifdef Q_OS_WIN
+		//打开失败,这里一般是权限问题导致。如果是windows,在外面申请权限后继续处理
+		if (QFileDevice::OpenError == file.error())
+		{
+			if (callbackObj != nullptr)
+			{
+				return callbackObj->runAsAdmin(filePath);
+			}
 		return 1;
 	}
+#endif
+#ifdef Q_OS_UNIX
+		QMessageBox::warning(msgBoxParent, tr("Error"), tr("Open File %1 failed").arg(filePath));
+#endif
+		return 2;
+	}
+
+	qint64 fileSize = file.size();
+
+	//如果文件是空的。检查一下,有可能在临时文件损坏情况下出现,外面需要使用
+	if (fileSize == 0)
+	{
+		m_lastErrorCode = ERROR_TYPE::OPEN_EMPTY_FILE;
+		file.close();
+		return 0;
+	}
+
+	qint64 bufferSizeRequested = fileSize + qMin((qint64)(1 << 20), (qint64)(fileSize / 6));
+
+	if (bufferSizeRequested > INT_MAX)
+	{
+		QMessageBox::warning(msgBoxParent, tr("Error"), tr("File is too big to be opened by Notepad--"));
+		file.close();
+		return 3;
+	}
+
+	QString fileText;
+	bool isErrorCode = false;
+
+	fileTextCode = CmpareMode::scanFileOutPut(file, fileTextCode, filePath, fileText, isErrorCode);
+
+	//如果文件是空的。检查一下,有可能在临时文件损坏情况下出现,外面需要使用
+	if (fileText.size() == 0)
+	{
+		m_lastErrorCode = ERROR_TYPE::OPEN_EMPTY_FILE;
+		file.close();
+		return 0;
+	}
+
+	if (isErrorCode && hexAsk)
+	{
+		//检测到文件很可能是二进制文件,询问用户,是否以二进制加载
+		int ret = QMessageBox::question(msgBoxParent, tr("Open with Text or Hex? [Exist Garbled Code]"), tr("The file %1 is likely to be binary. Do you want to open it in binary?").arg(filePath), tr("Hex Open"), tr("Text Open"), tr("Cancel"));
+
+		if (ret == 0)
+		{
+			//16进制打开
+			file.close();
+			return 4;
+		}
+		else if (ret == 1)
+		{
+			//继续以文本打开
+		}
+		else
+		{
+			//取消,不打开
+			file.close();
+			return 2;
+		}
+	}
+
+	//以第一行的换行为文本的换行符。暂时只考虑win unix 。mac \r 已经淘汰,暂时不管
+	lineEnd = RC_LINE_FORM::UNKNOWN_LINE;
+
+	int pos = fileText.indexOf("\n");
+	if (pos >=1)
+	{
+		if (fileText[pos - 1] == QChar('\r'))
+		{
+			lineEnd = RC_LINE_FORM::DOS_LINE;
+		}
+		else
+		{
+			lineEnd = RC_LINE_FORM::UNIX_LINE;
+		}
+	}
+
+	if (lineEnd == UNKNOWN_LINE)
+	{
+#ifdef _WIN32
+		lineEnd = DOS_LINE;
+#else
+		lineEnd = UNIX_LINE;
+#endif
+	}
+
+	file.close();
+
+
+	//优先根据文件后缀来确定其语法风格
+	LexerInfo lxdata = CCNotePad::getLangLexerIdByFileExt(filePath);
+
+	if (lxdata.lexerId != L_TXT)
+	{
+		QsciLexer* lexer = editView->createLexer(lxdata.lexerId, lxdata.tagName);
+		editView->setLexer(lexer);
+	}
+	else
+	{
+		//利用前面100个字符,进行一个编程语言的判断
+		QString headContens = fileText.mid(0, 100);
+
+		LangType _language = detectLanguage(headContens, filePath);
+
+		if (_language >= 0 && _language < L_EXTERNAL)
+		{
+			QsciLexer* lexer = editView->createLexer(_language);
+			editView->setLexer(lexer);
+		}
+	}
+
+	//如果检测到时16进制文件,但是强行以二进制打开,则有限走setUtf8Text。
+	if (!isErrorCode)
+	{
+		editView->setText(fileText);
+	}
+	else
+	{
+		//20230203有github用户反馈,说存在乱码的文件被截断,所以后续还是不走截断
+		editView->setText(fileText);
+
+		return 6;
+	}
+
+	return 0;
+}
+
+
+//加载文件,只为查找使用
+int FileManager::loadFileForSearch(ScintillaEditView* editView, QString filePath)
+{
+	QFile file(filePath);
+
+	QFlags<QFileDevice::Permission> power = QFile::permissions(filePath);
 
 	QIODevice::OpenMode mode;
 
-	if (!power.testFlag(QFile::WriteOwner))
+	if (!power.testFlag(QFile::WriteUser))
 	{
 		//文件不能写
 		mode = QIODevice::ExistingOnly | QIODevice::ReadOnly;
@@ -433,7 +657,7 @@ int FileManager::loadFileForSearch(ScintillaEditView* editView, QString filePath
 
 	if (!file.open(mode))
 	{
-		qDebug() << file.error();
+		//qDebug() << file.error();
 		return 2;
 	}
 
@@ -441,49 +665,30 @@ int FileManager::loadFileForSearch(ScintillaEditView* editView, QString filePath
 
 	qint64 bufferSizeRequested = fileSize + qMin((qint64)(1 << 20), (qint64)(fileSize / 6));
 
-	// As a 32bit application, we cannot allocate 2 buffer of more than INT_MAX size (it takes the whole address space)
 	if (bufferSizeRequested > INT_MAX)
 	{
 		file.close();
 		return 3;
 	}
 
-	QList<LineFileInfo> outputLineInfoVec;
-
-	int maxLineSize = 0;
-	int charsNums = 0;
-	bool isHexFile = false;
-
+	bool existGrbledCode = false;
+	QString outText;
 	CODE_ID fileTextCode = CODE_ID::UNKOWN;
 
-	fileTextCode = CmpareMode::scanFileOutPut(fileTextCode, filePath, outputLineInfoVec, maxLineSize, charsNums, isHexFile);
+	fileTextCode = CmpareMode::scanFileOutPut(file, fileTextCode, filePath, outText, existGrbledCode);
 
 	//20230218 这里必须指明一下编码,否则后续会导致编码被修改
 	editView->setProperty(Edit_Text_Code, fileTextCode);
 
-	if (isHexFile)
+	if (existGrbledCode)
 	{
-		qDebug() << filePath;
+		//qDebug() << filePath;
 		file.close();
 		return 4;
 	}
-
-	if (maxLineSize > 0)
-	{
-		editView->execute(SCI_SETSCROLLWIDTH, maxLineSize * 10);
-	}
-
-	QString text;
-	text.reserve(charsNums + 1);
-
-	for (QList<LineFileInfo>::iterator it = outputLineInfoVec.begin(); it != outputLineInfoVec.end(); ++it)
-	{
-		text.append(it->unicodeStr);
-	}
-
 	file.close();
 
-	editView->setText(text);
+	editView->setText(outText);
 
 	return 0;
 }
@@ -1223,95 +1428,52 @@ void FileManager::closeBigTextRoFileHand(QString filepath)
 	}
 }
 
-//检查文件的编程语言
-LangType FileManager::detectLanguageFromTextBegining(const unsigned char *data, size_t dataLen)
+//初步检查文件的编程语言。两个标准: 1 文件头部标签 2 文件特定名称
+LangType detectLanguage(QString& headContent, QString& filepath)
 {
 	struct FirstLineLanguages
 	{
-		std::string pattern;
+		QString pattern;
 		LangType lang;
 	};
 
-	// Is the buffer at least the size of a BOM?
-	if (dataLen <= 3)
-		return L_TXT;
-
-	// Eliminate BOM if present
-	size_t i = 0;
-	if ((data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF) || // UTF8 BOM
-		(data[0] == 0xFE && data[1] == 0xFF && data[2] == 0x00) || // UTF16 BE BOM
-		(data[0] == 0xFF && data[1] == 0xFE && data[2] == 0x00))   // UTF16 LE BOM
-		i += 3;
-
-	// Skip any space-like char
-	for (; i < dataLen; ++i)
-	{
-		if (data[i] != ' ' && data[i] != '\t' && data[i] != '\n' && data[i] != '\r')
-			break;
-	}
-
-	// Create the buffer to need to test
-	const size_t longestLength = 40; // shebangs can be large
-	std::string buf2Test = std::string((const char *)data + i, longestLength);
-
-	// Is there a \r or \n in the buffer? If so, truncate it
-	auto cr = buf2Test.find("\r");
-	auto nl = buf2Test.find("\n");
-	auto crnl = qMin(cr, nl);
-	if (crnl != std::string::npos && crnl < longestLength)
-		buf2Test = std::string((const char *)data + i, crnl);
-
-	// First test for a Unix-like Shebang
-	// See https://en.wikipedia.org/wiki/Shebang_%28Unix%29 for more details about Shebang
-	std::string shebang = "#!";
-
-	size_t foundPos = buf2Test.find(shebang);
-	if (foundPos == 0)
-	{
-		// Make a list of the most commonly used languages
-        const size_t NB_SHEBANG_LANGUAGES = 7;
-		FirstLineLanguages ShebangLangs[NB_SHEBANG_LANGUAGES] = {
-			{ "sh",		L_BASH },
-			{ "python", L_PYTHON },
-			{ "perl",	L_PERL },
-			{ "php",	L_PHP },
-			{ "ruby",	L_RUBY },
-            { "node",	L_JAVASCRIPT },
-            { "Makefile",	L_MAKEFILE}
-		};
-
-		// Go through the list of languages
-		for (i = 0; i < NB_SHEBANG_LANGUAGES; ++i)
-		{
-			if (buf2Test.find(ShebangLangs[i].pattern) != std::string::npos)
-			{
-				return ShebangLangs[i].lang;
-			}
-		}
-
-		// Unrecognized shebang (there is always room for improvement ;-)
-		return L_TXT;
-	}
-
-	// Are there any other patterns we know off?
-	const size_t NB_FIRST_LINE_LANGUAGES = 5;
-	FirstLineLanguages languages[NB_FIRST_LINE_LANGUAGES] = {
+	const size_t FIRST_LINE_LANGUAGES = 5;
+	FirstLineLanguages languages[FIRST_LINE_LANGUAGES] = {
 		{ "<?xml",			L_XML },
 		{ "<?php",			L_PHP },
 		{ "<html",			L_HTML },
 		{ "<!DOCTYPE html",	L_HTML },
-		{ "<?",				L_PHP } // MUST be after "<?php" and "<?xml" to get the result as accurate as possible
+		{ "<?",				L_PHP }
 	};
 
-	for (i = 0; i < NB_FIRST_LINE_LANGUAGES; ++i)
+	int foundPos = -1;
+	for (int i = 0; i < FIRST_LINE_LANGUAGES; ++i)
 	{
-		foundPos = buf2Test.find(languages[i].pattern);
+		foundPos = headContent.indexOf(languages[i].pattern);
 		if (foundPos == 0)
 		{
 			return languages[i].lang;
 		}
 	}
 
+	const size_t NAME_CHECK_LANGUAGES = 3;
+	FirstLineLanguages NAME_LEXER[NAME_CHECK_LANGUAGES] = {
+		{ "make",			L_MAKEFILE },
+		{ "makefile",		L_MAKEFILE },
+		{ "CMakeLists",		L_MAKEFILE },
+	};
+
+	QFileInfo fi(filepath);
+	QString baseName = fi.baseName();
+
+	for (int i = 0; i < NAME_CHECK_LANGUAGES; ++i)
+	{
+		if (0 == NAME_LEXER[i].pattern.compare(baseName, Qt::CaseInsensitive))
+		{
+			return NAME_LEXER[i].lang;
+		}
+	}
+
 	// Unrecognized first line, we assume it is a text file for now
 	return L_UNKNOWN;
 }

+ 6 - 3
src/cceditor/filemanager.h

@@ -154,8 +154,13 @@ public:
 
 	void delNewFileNode(int fileIndex);
 
-	int loadFileDataInText(ScintillaEditView * editView, QString filePath, CODE_ID & fileTextCode, RC_LINE_FORM &lineEnd, CCNotePad * callbackObj=nullptr, bool hexAsk = true, QWidget* MsgBoxParent=nullptr);
+	int loadFileDataInTextFromOffset(ScintillaEditView* editView, QString filePath, CODE_ID fileTextCode, QWidget* msgBoxParent, quint64 startReadSize);
 
+	//下面这个是旧函数,之前对比时候用的。
+	//int loadFileDataInText(ScintillaEditView * editView, QString filePath, CODE_ID & fileTextCode, RC_LINE_FORM &lineEnd, CCNotePad * callbackObj=nullptr, bool hexAsk = true, QWidget* MsgBoxParent=nullptr);
+
+	int loadFileDataInText(ScintillaEditView* editView, QString filePath, CODE_ID& fileTextCode, RC_LINE_FORM& lineEnd, CCNotePad* callbackObj = nullptr, bool hexAsk = true, QWidget* msgBoxParent = nullptr);
+	
 	int loadFileForSearch(ScintillaEditView * editView, QString filePath);
 
 	//int loadFileData(ScintillaEditView * editView, QString filePath, CODE_ID & fileTextCode, RC_LINE_FORM & lineEnd);
@@ -188,8 +193,6 @@ public:
 
 	void closeBigTextRoFileHand(QString filepath);
 
-	LangType detectLanguageFromTextBegining(const unsigned char * data, size_t dataLen);
-
 	static FileManager& getInstance() {
 		static FileManager instance;
 		return instance;

+ 1 - 1
src/columnedit.ui

@@ -153,7 +153,7 @@
            </size>
           </property>
           <property name="minimum">
-           <number>1</number>
+           <number>-100</number>
           </property>
          </widget>
         </item>

+ 10 - 1
src/ctipwin.cpp

@@ -35,8 +35,9 @@ void CTipWin::slot_delayClose()
 }
 
 
-void CTipWin::showTips(QWidget* parent, QString text, int sec)
+void CTipWin::showTips(QWidget* parent, QString text, int sec, bool isMousePos)
 {
+
 	if (parent != nullptr)
 	{
 		CTipWin* pWin = new CTipWin();
@@ -44,10 +45,18 @@ void CTipWin::showTips(QWidget* parent, QString text, int sec)
 		pWin->setAttribute(Qt::WA_DeleteOnClose);
 		pWin->showMsg(sec);
 
+		if (!isMousePos)
+		{
 		QPoint pos = parent->pos();
 		QSize size = parent->size();
 
 		QPoint newPos(pos.x() + 10, pos.y() + size.height() - 20);
 		pWin->move(newPos);
+	}
+		else
+		{
+			pWin->move(parent->cursor().pos());
+}
+
 	}
 }

+ 1 - 1
src/ctipwin.h

@@ -12,7 +12,7 @@ public:
 	~CTipWin();
 	void setTipText(QString text);
 	void showMsg(int sec = 2000);
-	static void showTips(QWidget* parent, QString text, int sec);
+	static void showTips(QWidget* parent, QString text, int sec, bool isMousePos = false);
 
 private slots:
 	void slot_delayClose();

+ 26 - 2
src/dectfilechanges.cpp

@@ -2,7 +2,7 @@
 
 #ifdef WIN32
 
-DectFileChanges::DectFileChanges()
+DectFileChanges::DectFileChanges():m_lastFileSize(0), m_curFileSize(0)
 {
 	_szFile = NULL;
 	_dwNotifyFilter = 0;
@@ -28,7 +28,16 @@ BOOL DectFileChanges::DetectChanges() {
 		rValue = TRUE;
 	}
 
+	if (rValue)
+	{
+		m_lastFileSize = getFileSize(_lastFileInfo);
+	}
 	_lastFileInfo = fInfo;
+
+	if (rValue)
+	{
+		m_curFileSize = getFileSize(_lastFileInfo);
+	}
 	return rValue;
 }
 
@@ -45,4 +54,19 @@ void DectFileChanges::Terminate()
 	_szFile = NULL;
 	_dwNotifyFilter = 0;
 }
-#endif
+quint64 DectFileChanges::getFileSize(WIN32_FILE_ATTRIBUTE_DATA& data)
+{
+	quint64 fileSize = data.nFileSizeHigh;
+	fileSize = (fileSize << 32);
+	fileSize += data.nFileSizeLow;
+
+	return fileSize;
+}
+
+void DectFileChanges::getDiffFileSize(quint64& lastSize, quint64& curSize)
+{
+	lastSize = m_lastFileSize;
+	curSize = m_curFileSize;
+}
+
+#endif

+ 9 - 0
src/dectfilechanges.h

@@ -12,6 +12,7 @@
 #define NOMINMAX
 
 #include <windows.h>
+#include <QtGlobal> 
 
 class DectFileChanges
 {
@@ -22,11 +23,19 @@ public:
 	BOOL DetectChanges();
 	void Terminate();
 
+	void getDiffFileSize(quint64& lastSize, quint64& curSize);
+
+private:
+	quint64 getFileSize(WIN32_FILE_ATTRIBUTE_DATA& data);
+
 private:
 	LPCTSTR _szFile = nullptr;
 	DWORD _dwNotifyFilter = 0;
 	WIN32_FILE_ATTRIBUTE_DATA _lastFileInfo = {};
 
+	quint64 m_lastFileSize;
+	quint64 m_curFileSize;
+
 };
 
 #endif

+ 4 - 2
src/encodeconvert.cpp

@@ -290,7 +290,7 @@ QFuture<EncodeThreadParameter*> EncodeConvert::commitTask(std::function<EncodeTh
 }
 
 
-//对比左右文件的大小,sha1值来判断文件是否相等
+//识别文件编码
 QFuture<EncodeThreadParameter_*> EncodeConvert::checkFileCode(QString filePath, QTreeWidgetItem* item)
 {
 	EncodeThreadParameter_* p = new EncodeThreadParameter_(filePath);
@@ -299,7 +299,8 @@ QFuture<EncodeThreadParameter_*> EncodeConvert::checkFileCode(QString filePath,
 	//int 0相等 1 不等
 	return commitTask([](EncodeThreadParameter_* parameter)->EncodeThreadParameter_*
 		{
-			parameter->code = CmpareMode::scanFileRealCode(parameter->filepath);
+			//整个文件都要扫描完毕。还是怕太慢,最多1000行吧
+			parameter->code = CmpareMode::scanFileRealCode(parameter->filepath,1000);
 			return parameter;
 		}
 	, p);
@@ -474,6 +475,7 @@ void EncodeConvert::scanFileCode()
 		{
 			iter->selfItem->setText(2, QString("--"));
 		}
+		//20230304 编码转换这里,不能仅仅只识别已知后缀文件,要失败所有文件
 		else if ((iter->type == RC_FILE) && DocTypeListView::isSupportExt(fileSuffix(iter->relativePath)))
 		{
 			QFutureWatcher<EncodeThreadParameter_*>* futureWatcher = new QFutureWatcher<EncodeThreadParameter_*>();

+ 288 - 0
src/findresultview.cpp

@@ -0,0 +1,288 @@
+#include "findresultview.h"
+#include "styleset.h"
+#include "findresultwin.h"
+#include "ctipwin.h"
+#include "Scintilla.h"
+
+#include <QClipboard>
+
+
+const int MARGE_FOLDER = 1;
+const int STYLE_COLOUR_TITLE = 1;
+const int STYLE_COLOUR_DEST_FILE = 2;
+const int STYLE_COLOUR_KEYWORD_HIGH = 3;
+const int STYLE_COLOUR_KEYWORD_BACK_HIGH = 4;
+const int STYLE_DEEP_COLOUR_KEYWORD_HIGH = 5; //深色模式下面的前景色
+const int STYLE_DEEP_COLOUR_DEST_FILE = 6;
+
+static void getFoldColor(QColor& fgColor, QColor& bgColor, QColor& activeFgColor)
+{
+	//这里看起来反了,但是实际代码就是如此
+	fgColor = StyleSet::s_global_style->fold.bgColor;
+	bgColor = StyleSet::s_global_style->fold.fgColor;
+
+	activeFgColor = StyleSet::s_global_style->fold_active.fgColor;
+
+}
+
+void FindResultView::setFoldColor(int margin, QColor fgClack, QColor bkColor, QColor foreActive)
+{
+	SendScintilla(SCI_MARKERSETFORE, margin, fgClack);
+	SendScintilla(SCI_MARKERSETBACK, margin, bkColor);
+	SendScintilla(SCI_MARKERSETBACKSELECTED, margin, foreActive);
+}
+
+FindResultView::FindResultView(QWidget *parent)
+	: QsciScintilla(parent)
+{
+	//通过fold发现,尽量使用qscint的功能,因为他做了大量封装和简化
+	setFolding(BoxedTreeFoldStyle, MARGE_FOLDER);
+
+	SendScintilla(SCI_SETMARGINWIDTHN, MARGE_FOLDER, 14);
+
+	SendScintilla(SCI_MARKERSETFORE, SC_MARKNUM_FOLDERSUB, QColor(0xff,0,0));
+
+	setCaretLineVisible(true);
+	SendScintilla(SCI_SETSCROLLWIDTHTRACKING, true);
+	SendScintilla(SCI_SETCARETLINEBACK, StyleSet::s_global_style->current_line_background_color.bgColor);
+
+	QColor foldfgColor = Qt::white, foldbgColor = Qt::gray, activeFoldFgColor = Qt::red;
+	getFoldColor(foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldMarginColors(StyleSet::s_global_style->fold_margin.fgColor, StyleSet::s_global_style->fold_margin.bgColor);
+	setFoldColor(SC_MARKNUM_FOLDEROPEN, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDER, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDERSUB, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDERTAIL, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDEREND, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDEROPENMID, foldfgColor, foldbgColor, activeFoldFgColor);
+	setFoldColor(SC_MARKNUM_FOLDERMIDTAIL, foldfgColor, foldbgColor, activeFoldFgColor);
+
+	SendScintilla(SCI_STYLESETSIZE, STYLE_DEFAULT, 12);
+
+	if (!StyleSet::isCurrentDeepStyle())
+	{
+		this->setPaper(StyleSet::s_global_style->default_style.bgColor);
+
+		SendScintilla(SCI_STYLESETBACK, STYLE_COLOUR_TITLE, 0xffbbbb);
+		SendScintilla(SCI_STYLESETBACK, STYLE_COLOUR_DEST_FILE, 0xd5ffd5);
+		SendScintilla(SCI_STYLESETEOLFILLED, STYLE_COLOUR_TITLE, true);
+		SendScintilla(SCI_STYLESETEOLFILLED, STYLE_COLOUR_DEST_FILE, true);
+		SendScintilla(SCI_STYLESETFORE, STYLE_COLOUR_KEYWORD_HIGH, 0x4080ff);
+		SendScintilla(SCI_STYLESETBACK, STYLE_COLOUR_KEYWORD_BACK_HIGH, 0xbfffff);
+	
+	}
+	else
+	{
+		this->setColor(StyleSet::s_global_style->default_style.fgColor);
+		this->setPaper(StyleSet::s_global_style->default_style.bgColor);
+
+		//QColor& col = StyleSet::s_global_style->default_style.fgColor;
+		//sptr_t fgLParam = (col.blue() << 16) | (col.green() << 8) | col.red();
+
+		QColor& col2 = StyleSet::s_global_style->default_style.bgColor;
+		sptr_t bklParam = (col2.blue() << 16) | (col2.green() << 8) | col2.red();
+
+		SendScintilla(SCI_STYLESETBACK, STYLE_COLOUR_TITLE, 0xffbbbb); 
+		SendScintilla(SCI_STYLESETEOLFILLED, STYLE_COLOUR_TITLE, true);
+		//SendScintilla(SCI_STYLESETFORE, STYLE_COLOUR_TITLE, fgLParam);
+
+		SendScintilla(SCI_STYLESETBACK, STYLE_DEEP_COLOUR_DEST_FILE, bklParam);
+		SendScintilla(SCI_STYLESETFORE, STYLE_DEEP_COLOUR_DEST_FILE, 0x99cc99);
+		//SendScintilla(SCI_STYLESETFORE, STYLE_DEEP_COLOUR_DEST_FILE, fgLParam);
+		//SendScintilla(SCI_STYLESETBOLD, STYLE_DEEP_COLOUR_DEST_FILE, 1);//这个无法生效。可能是qscint bug
+
+		//文字要大一号,然后颜色是绿色
+		SendScintilla(SCI_STYLESETSIZE, STYLE_DEEP_COLOUR_DEST_FILE, 14);
+
+		SendScintilla(SCI_STYLESETFORE, STYLE_DEEP_COLOUR_KEYWORD_HIGH, 0x00aaff);
+		SendScintilla(SCI_STYLESETBACK, STYLE_DEEP_COLOUR_KEYWORD_HIGH, bklParam);
+
+
+		//给行号使用
+		SendScintilla(SCI_STYLESETFORE, STYLE_COLOUR_KEYWORD_HIGH, 0x4080ff);
+		SendScintilla(SCI_STYLESETBACK, STYLE_COLOUR_KEYWORD_HIGH, bklParam);
+	}
+
+
+	this->setReadOnly(true);
+
+	m_resultWin = dynamic_cast<FindResultWin*>(parent);
+}
+
+FindResultView::~FindResultView()
+{}
+
+//设置行背景色
+void FindResultView::setLineBackColorStyle(int line, int style)
+{
+	int startPos = SendScintilla(SCI_POSITIONFROMLINE, line);
+	int len = SendScintilla(SCI_LINELENGTH, line);
+
+	SendScintilla(SCI_STARTSTYLING, startPos);
+	SendScintilla(SCI_SETSTYLING, len, style);
+}
+
+//设置行前景色。line 行号,从相对行pos的位置开始
+void FindResultView::setLineColorStyle(int line, int offsetPos, int length, int style)
+{
+	int startPos = SendScintilla(SCI_POSITIONFROMLINE, line);
+	SendScintilla(SCI_STARTSTYLING, startPos + offsetPos);
+	SendScintilla(SCI_SETSTYLING, length, style);
+}
+
+
+void FindResultView::mouseDoubleClickEvent(QMouseEvent* /*e*/)
+{
+	//QsciScintilla::mouseDoubleClickEvent(e);
+
+	int line = 0;
+	int index = 0;
+
+	this->getCursorPosition(&line,&index);
+
+	emit lineDoubleClick(line);
+}
+
+void FindResultView::contextUserDefineMenuEvent(QMenu* menu)
+{
+	if (menu != nullptr)
+	{
+		//移动一下位置
+
+		QAction* pCopy =  menu->findChild<QAction*>("copy");
+		if (pCopy != nullptr)
+		{
+			menu->removeAction(pCopy);
+		}
+
+		menu->addAction(tr("Fold All"), this, &FindResultView::on_foldAll);
+		menu->addAction(tr("Expand All"), this, &FindResultView::on_expandAll);
+
+		menu->addSeparator();
+	
+		if (pCopy != nullptr)
+		{
+			menu->addAction(pCopy);
+		}
+		menu->addAction(tr("copy select line"), this, &FindResultView::on_copySelectLine);
+		menu->addAction(tr("warp"), this, &FindResultView::on_warp);
+
+		menu->addSeparator();
+
+		menu->addAction(tr("clear"), this, &FindResultView::on_clear);
+		menu->addAction(tr("close"), this, &FindResultView::on_close);
+
+
+	}
+	menu->move(cursor().pos()); //让菜单显示的位置在鼠标的坐标上
+	menu->show();
+}
+
+void FindResultView::on_foldAll()
+{
+	for (int i = 0; i < m_resultWin->m_resultLineInfo.size(); ++i)
+	{
+		const ResultLineInfo& lineInfo = m_resultWin->m_resultLineInfo.at(i);
+
+		//如果是1级别的行,则进行一个收起操作
+		if ((lineInfo.level == 1) || (lineInfo.level == 0))
+		{
+			SendScintilla(SCI_FOLDLINE, i, (long)SC_FOLDACTION_CONTRACT);
+		}
+	}
+}
+
+void FindResultView::on_expandAll()
+{
+	for (int i = 0; i < m_resultWin->m_resultLineInfo.size(); ++i)
+	{
+		const ResultLineInfo& lineInfo = m_resultWin->m_resultLineInfo.at(i);
+
+		//如果是1级别的行,则进行一个收起操作
+		if ((lineInfo.level == 1) || (lineInfo.level == 0))
+		{
+			SendScintilla(SCI_FOLDLINE, i, SC_FOLDACTION_EXPAND);
+		}
+	}
+}
+
+//复制选中的内容
+//void FindResultView::on_copySelect()
+//{
+//	QString word = selectedText();
+//	if (!word.isEmpty())
+//	{
+//		QClipboard* clipboard = QApplication::clipboard();
+//		clipboard->setText(word);
+//
+//		CTipWin::showTips(this, tr("Copy to clipboard Finished!"), 1200,true);
+//	}
+//}
+
+//复制选中行
+void FindResultView::on_copySelectLine()
+{
+	int startPos = SendScintilla(SCI_GETSELECTIONSTART);
+	int endPos = SendScintilla(SCI_GETSELECTIONEND);
+
+	int startLine = SendScintilla(SCI_LINEFROMPOSITION, startPos);
+	int endLine = SendScintilla(SCI_LINEFROMPOSITION, endPos);
+
+	int start = SendScintilla(SCI_POSITIONFROMLINE, startLine);
+	int end = SendScintilla(SCI_POSITIONFROMLINE, endLine+1);
+
+	char *dest = new char[end - start + 1];
+	dest[end - start] = '\0';
+
+	Sci_TextRange tr;
+	tr.chrg.cpMin = static_cast<Sci_PositionCR>(start);
+	tr.chrg.cpMax = static_cast<Sci_PositionCR>(end);
+	tr.lpstrText = dest;
+
+	this->SendScintilla(SCI_GETTEXTRANGE, 0, &tr);
+
+	QString text(dest);
+
+	QStringList lineText = text.split("\n");
+	QString selectConnect;
+
+	for (int i = 0; i < lineText.size(); ++i)
+	{
+		const QString& t = lineText.at(i);
+		int pos = t.indexOf(": ");
+		if (pos != -1)
+		{
+			QString v = t.mid(pos + 2);
+			selectConnect.append(v);
+			selectConnect.append("\n");
+		}
+	}
+
+	QClipboard* clipboard = QApplication::clipboard();
+	clipboard->setText(selectConnect);
+
+	//CTipWin::showTips(this, tr("Copy to clipboard Finished!"), 1200, true);
+}
+
+void  FindResultView::on_clear()
+{
+	this->clear();
+	m_resultWin->clear();
+}
+
+void  FindResultView::on_close()
+{
+	m_resultWin->m_parent->close();
+}
+
+void  FindResultView::on_warp()
+{
+	if (SC_WRAP_CHAR != wrapMode())
+	{
+		this->setWrapMode(QsciScintilla::WrapCharacter);
+	}
+	else
+	{
+		this->setWrapMode(QsciScintilla::WrapNone);
+	}
+}

+ 49 - 0
src/findresultview.h

@@ -0,0 +1,49 @@
+#pragma once
+#include <QWidget>
+#include <qsciscintilla.h>
+#include <QMouseEvent>
+#include <QMenu>
+
+extern const int MARGIN_VER_LINE;
+extern const int STYLE_COLOUR_TITLE;
+extern const int STYLE_COLOUR_DEST_FILE;
+extern const int STYLE_COLOUR_KEYWORD_HIGH;
+extern const int STYLE_COLOUR_KEYWORD_BACK_HIGH;
+extern const int STYLE_DEEP_COLOUR_KEYWORD_HIGH;
+extern const int STYLE_DEEP_COLOUR_DEST_FILE;
+
+class FindResultWin;
+
+class FindResultView  : public QsciScintilla
+{
+	Q_OBJECT
+
+public:
+	FindResultView(QWidget* parent);
+	virtual ~FindResultView();
+
+	void setLineBackColorStyle(int line, int style);
+	void setLineColorStyle(int line, int pos, int length, int style);
+
+signals:
+	void lineDoubleClick(int line);
+
+public slots:
+	void on_foldAll();
+private slots:
+
+	void on_expandAll();
+	//void on_copySelect();
+	void on_copySelectLine();
+	void on_clear();
+	void on_close();
+	void on_warp();
+
+protected:
+	void mouseDoubleClickEvent(QMouseEvent* e) override;
+	void contextUserDefineMenuEvent(QMenu* menu) override;
+	void setFoldColor(int margin, QColor fgClack, QColor bkColor, QColor foreActive);
+
+private:
+	FindResultWin* m_resultWin;
+};

+ 190 - 458
src/findresultwin.cpp

@@ -3,19 +3,20 @@
 #include "common.h"
 #include "styleset.h"
 #include "nddsetting.h"
+#include "findresultview.h"
 
-#include <QTreeWidgetItem>
-#include <QStyleFactory>
-#include <QToolButton>
-#include <qtreeview.h>
-#include <QStandardItem> 
-#include <QStandardItemModel>
+#include <qsciscintilla.h>
+#include <Scintilla.h>
+
+//#include <QTreeWidgetItem>
+//#include <QStyleFactory>
+//#include <QToolButton>
+//#include <qtreeview.h>
+//#include <QStandardItem> 
+//#include <QStandardItemModel>
 #include <QClipboard>
 #include <QTextEdit>
 #include <qscrollbar.h>
-
-#include "ndstyleditemdelegate.h"
-
 //目前可以高亮,使用富文本进行了高亮设置。但是有个问题:富文本与html有一些冲突,在<>存在时,可能导致乱。这是一个问题。20220609
 //使用Html的转义解决了该问题
 
@@ -23,51 +24,8 @@ FindResultWin::FindResultWin(QWidget *parent)
 	: QWidget(parent), m_menu(nullptr), m_parent(parent),m_defaultFontSize(14), m_defFontSizeChange(false)
 {
 	ui.setupUi(this);
-
-	//设置左边的缩起来按钮为加号,而不是箭头
-	ui.resultTreeView->setStyle(QStyleFactory::create("windows"));
-	ui.resultTreeView->header()->hide();
+	connect(ui.displayView, &FindResultView::lineDoubleClick, this, &FindResultWin::on_lineDoubleClick);
 	
-	m_model = new QStandardItemModel(ui.resultTreeView);
-	m_delegate = new NdStyledItemDelegate(ui.resultTreeView);
-	ui.resultTreeView->setModel(m_model);
-	ui.resultTreeView->setItemDelegate(m_delegate);
-	ui.resultTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
-	ui.resultTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-//#if defined (Q_OS_MAC)
-//	QString qss = "QTreeView::item:selected{ \
-//	   background:#e8e8ff; \
-//    } \
-//    QTreeView::item{ \
-//        height:18px; \
-//    }";
-//#else
-//    QString qss = "QTreeView::item:selected{ \
-//       background:#e8e8ff; \
-//    }";
-//#endif
-//	ui.resultTreeView->setStyleSheet(qss);
-
-	connect(ui.resultTreeView, &QTreeView::doubleClicked, this, &FindResultWin::itemDoubleClicked);
-
-	connect(ui.resultTreeView, SIGNAL(pressed(QModelIndex)), this, SLOT(slot_treeView_pressed(QModelIndex)));
-	connect(ui.resultTreeView, SIGNAL(expanded(QModelIndex)), this, SLOT(slot_treeView_pressed(QModelIndex)));
-
-	ui.resultTreeView->verticalScrollBar()->setStyle(QStyleFactory::create("vis"));
-	ui.resultTreeView->horizontalScrollBar()->setStyle(QStyleFactory::create("vis"));
-
-	int defFontSize = NddSetting::getKeyValueFromNumSets(FIND_RESULT_FONT_SIZE);
-	if (defFontSize >= 8)
-	{
-		m_defaultFontSize = defFontSize;
-
-		QFont curFt = ui.resultTreeView->font();
-		curFt.setPointSize(m_defaultFontSize);
-		ui.resultTreeView->setFont(curFt);
-
-		m_delegate->setFontSize(m_defaultFontSize);
-}
 }
 
 FindResultWin::~FindResultWin()
@@ -75,311 +33,32 @@ FindResultWin::~FindResultWin()
 	if (m_defFontSizeChange)
 	{
 		NddSetting::updataKeyValueFromNumSets(FIND_RESULT_FONT_SIZE, m_defaultFontSize);
-}
-}
-
-void FindResultWin::slot_treeView_pressed(QModelIndex modeIndex)
-{
-	ui.resultTreeView->resizeColumnToContents(modeIndex.column());
-}
-
-void FindResultWin::contextMenuEvent(QContextMenuEvent *)
-{
-	if (m_menu == nullptr)
-	{
-		m_menu = new QMenu(this);
-		m_menu->addAction(tr("clear this find result"), this, &FindResultWin::slot_clearContents);
-		m_menu->addAction(tr("clear all find result"), this, &FindResultWin::slot_clearAllContents);
-
-		m_menu->addSeparator();
-		m_pSelectSectonAct = m_menu->addAction(tr("select section"), this, &FindResultWin::slot_selectSection);
-		m_menu->addAction(tr("select all item"), this, &FindResultWin::slot_selectAll);
-
-		m_menu->addSeparator();
-
-		m_menu->addAction(tr("copy select item (Ctrl Muli)"), this, &FindResultWin::slot_copyItemContents);
-		m_menu->addAction(tr("copy select Line (Ctrl Muli)"), this, &FindResultWin::slot_copyContents);
-
-		m_menu->addSeparator();
-		m_menu->addAction(tr("Zoom In"), this, &FindResultWin::slot_fontZoomIn);
-		m_menu->addAction(tr("Zoom Out"), this, &FindResultWin::slot_fontZoomOut);
-		m_menu->addAction(tr("close"), m_parent, &QWidget::close);
-
-	}
-	m_menu->move(cursor().pos()); //让菜单显示的位置在鼠标的坐标上
-	m_menu->show();
-
-	QModelIndex curSelItem = ui.resultTreeView->currentIndex();
-
-	if (!curSelItem.data(ResultItemRoot).isNull())
-	{
-		//是根不能选择section
-		m_pSelectSectonAct->setEnabled(false);
-}
-	else if (!curSelItem.data(ResultItemEditor).isNull())
-	{
-		m_pSelectSectonAct->setEnabled(true);
-	}
-	else if (!curSelItem.data(ResultItemPos).isNull())
-	{
-		m_pSelectSectonAct->setEnabled(true);
-	}
-}
-
-void FindResultWin::slot_clearContents()
-{
-	QModelIndex curSelItem = ui.resultTreeView->currentIndex();
-
-	if (!curSelItem.data(ResultItemRoot).isNull())
-	{
-		//是根可以直接删除
-		m_model->removeRow(curSelItem.row());
 	}
-	else if (!curSelItem.data(ResultItemEditor).isNull())
-	{
-		//需要找到上一个父节点,即根
-		QModelIndex rootItem = curSelItem.parent();
-
-		if (rootItem.isValid())
-		{
-			m_model->removeRow(curSelItem.row(), rootItem);
 
-			if (0 == m_model->rowCount(rootItem))
-			{
-				m_model->removeRow(rootItem.row());
-			}
-		}
-	}
-	else if (!curSelItem.data(ResultItemPos).isNull())
-	{
-		//需要找到上两个父节点,即根
-		QModelIndex itemEditor = curSelItem.parent();
-		if (itemEditor.isValid())
-		{
-			QModelIndex rootItem = itemEditor.parent();
-			if (rootItem.isValid())
-			{
-				m_model->removeRow(itemEditor.row(), rootItem);
-				if (0 == m_model->rowCount(rootItem))
-				{
-					m_model->removeRow(rootItem.row());
-				}
-			}
-		}
-	}
+	clear();
 }
 
-//全选
-void FindResultWin::slot_selectAll()
+void FindResultWin::clear()
 {
-
-	QModelIndex root = ui.resultTreeView->rootIndex();
-
-	QModelIndex curSelItem = ui.resultTreeView->currentIndex();
-	QModelIndex firstRootItem;
-	//先找到根节点
-	while (curSelItem.isValid())
+	for (int i = 0; i < m_resultLineFilePath.size(); ++i)
 	{
-		QModelIndex pMi = curSelItem.parent();
-		if (pMi.isValid())
-		{
-			curSelItem = pMi;
-}
-		else
-		{
-			break;
-		}
-	}
-
-	//找到第一个兄弟根节点
-	if (curSelItem.row() != 0)
-	{
-		firstRootItem = curSelItem.siblingAtRow(0);
-	}
-	else
-	{
-		firstRootItem = curSelItem;
-	}
-
-	auto selectSection = [this](QModelIndex& sectionItem)->int{
-		//遍历其下面的所有子节点
-		ui.resultTreeView->selectionModel()->select(sectionItem, QItemSelectionModel::Select);
-
-		//遍历下面的子节点
-		int i = 0;
-		QModelIndex childMi;
-        childMi = sectionItem.model()->index(i, 0, sectionItem);
-		while (childMi.isValid())
-		{
-			++i;
-			ui.resultTreeView->selectionModel()->select(childMi, QItemSelectionModel::Select);
-            childMi = sectionItem.model()->index(i, 0, sectionItem);
-		}
-		return i+1;
-	};
-
-	QModelIndex rootItem = firstRootItem;
-	int j = 0;
-	int selectCount = 0;
-	while (rootItem.isValid())
-	{
-		//遍历根节点下面每一个section
-		{
-			int i = 0;
-            QModelIndex section = rootItem.model()->index(i, 0, rootItem);
-			while (section.isValid() && !section.data(ResultItemEditor).isNull())
-			{
-				++i;
-				selectCount += selectSection(section);
-                section = firstRootItem.model()->index(i, 0, firstRootItem);
-			}
-		}
-
-		//切换到下一个查找的根节点
-		j++;
-		rootItem = firstRootItem.siblingAtRow(j);
-	}
-
-	QString msg = tr("%1 rows selected !").arg(selectCount);
-	emit showMsg(msg);
-}
-
-void FindResultWin::slot_selectSection()
-{
-	QModelIndex curSelItem = ui.resultTreeView->currentIndex();
-
-	auto selectSection = [this](QModelIndex& sectionItem)->int {
-		//遍历其下面的所有子节点
-		ui.resultTreeView->selectionModel()->select(sectionItem, QItemSelectionModel::Select);
-
-		//遍历下面的子节点
-		int i = 0;
-		QModelIndex childMi;
-        childMi = sectionItem.model()->index(i, 0, sectionItem);
-		while (childMi.isValid())
-		{
-			++i;
-			ui.resultTreeView->selectionModel()->select(childMi, QItemSelectionModel::Select);
-			childMi = sectionItem.model()->index(i, 0, sectionItem);
-		}
-		return i+1;
-	};
-
-	int selectCount = 0;
-
-	if (!curSelItem.data(ResultItemRoot).isNull())
-	{
-		//啥也不做。不能选择多个section
-	}
-	else if (!curSelItem.data(ResultItemEditor).isNull())
-	{
-		selectCount = selectSection(curSelItem);
-		
-	}
-	else if (!curSelItem.data(ResultItemPos).isNull())
-	{
-		//其父节点
-		QModelIndex sectionItem = curSelItem.parent();
-		if (!sectionItem.data(ResultItemEditor).isNull())
-		{
-			selectCount = selectSection(sectionItem);
-		}
-	}
-
-	QString msg = tr("%1 rows selected !").arg(selectCount);
-	emit showMsg(msg);
-}
-
-//拷贝item的行,不进行过滤,全部拷贝
-void FindResultWin::slot_copyItemContents()
-{
-	QModelIndexList selectList;
-
-	ui.resultTreeView->getSelectedIndexes(selectList);
-
-	QString selectConnect;
-
-	for (int i = 0, s = selectList.size(); i < s; ++i)
-	{
-
-		QModelIndex curSelItem = selectList.at(i);
-
-		QString text = m_model->itemData(curSelItem).values()[0].toString();
-
-		QTextEdit t(this);
-		t.setAcceptRichText(true);
-		t.setText(text);
-		text = t.toPlainText();
-
-		selectConnect.append(text);
-		selectConnect.append("\n");
-	}
-
-	QClipboard *clip = QApplication::clipboard();
-	clip->setText(selectConnect);
-
-	QString msg = tr("%1 items have been copied to the clipboard !").arg(selectList.size());
-	emit showMsg(msg);
-}
-
-void FindResultWin::slot_copyContents()
-{
-	QModelIndexList selectList;
-
-	//std::sort(selectList.begin(), selectList.end(), [](QModelIndex& a, QModelIndex& b) {
-	//	return a.row() < b.row();
-	//});
-	
-	ui.resultTreeView->getSelectedIndexes(selectList);
-
-	QString selectConnect;
-
-	int copyTimes = 0;
-
-	for (int i = 0, s = selectList.size(); i < s; ++i)
-	{
-		QModelIndex curSelItem = selectList.at(i);
-
-		//只拷贝真正的行内容
-		if (curSelItem.data(ResultItemPos).isNull())
-		{
-			continue;
-		}
-
-		copyTimes++;
-
-	QString text = m_model->itemData(curSelItem).values()[0].toString();
-
-	QTextEdit t(this);
-	t.setAcceptRichText(true);
-	t.setText(text);
-	text = t.toPlainText();
-
-		int pos = text.indexOf(": ");
-		if (pos != -1)
-		{
-			text = text.mid(pos + 2);
-		}
-
-		selectConnect.append(text);
-		selectConnect.append("\n");
+		delete m_resultLineFilePath.at(i);
 	}
-
-	QClipboard *clip = QApplication::clipboard();
-	clip->setText(selectConnect);
-
-	QString msg = tr("%1 lines have been copied to the clipboard !").arg(copyTimes);
-	emit showMsg(msg);
+	m_resultLineFilePath.clear();
+	m_resultLineInfo.clear();
 }
 
 void FindResultWin::slot_clearAllContents()
 {
-	m_model->clear();
+	clear();
+	ui.displayView->clear();
 }
 
+#if 0 //老的机制,暂时屏蔽,后续可删除
 //高亮查找的关键字文本。Index表示是第几次出现,前面的要跳过
 void FindResultWin::highlightFindText(int index, QString &srcText, QString &findText, Qt::CaseSensitivity cs)
 {
+#if 0
 	int pos = 0;
 	int findPos = 0;
 
@@ -403,14 +82,18 @@ void FindResultWin::highlightFindText(int index, QString &srcText, QString &find
 		index--;
 	}
 	srcText.replace(pos, lens, QString("<font style='font-size:14px;background-color:#ffffbf'>%1</font>").arg(srcText.mid(pos,lens)));
+#endif
 }
+#endif
 
 const int MAX_HEAD_LENTGH = 20;
 const int MAX_TAIL_LENGTH = 80;
 
+#if 0
 //更复杂的高亮:在全词语匹配,大小写敏感,甚至正则表达式情况下,上面的highlightFindText是不够的。需要精确定位
 QString FindResultWin::highlightFindText(FindRecord& record)
 {
+#if 0
 	QByteArray utf8bytes = record.lineContents.toUtf8();
 
 	int lineLens = utf8bytes.length();
@@ -438,9 +121,9 @@ QString FindResultWin::highlightFindText(FindRecord& record)
 			head = QString("<font style='font-size:14px;'>%1</font>").arg(QString(utf8bytes.mid(0, targetStart)).toHtmlEscaped());
 			src = QString("<font style='font-size:14px;background-color:#ffffbf'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
 			tail = QString("<font style='font-size:14px;'>%1</font>").arg(QString(utf8bytes.mid(tailStart)).toHtmlEscaped());
-	}
-	else
-	{
+		}
+		else
+		{
 			head = QString(utf8bytes.mid(0, targetStart));
 			if (head.size() > MAX_HEAD_LENTGH)
 			{
@@ -475,7 +158,7 @@ QString FindResultWin::highlightFindText(FindRecord& record)
 			head = QString("<font style='font-size:14px;color:#dcdcdc'>%1</font>").arg(QString(utf8bytes.mid(0, targetStart)).toHtmlEscaped());
 			src = QString("<font style='font-size:14px;font-weight:bold;color:#ffaa00'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
 			tail = QString("<font style='font-size:14px;color:#dcdcdc'>%1</font>").arg(QString(utf8bytes.mid(tailStart)).toHtmlEscaped());
-	}
+		}
 		else
 		{
 			QString headContens = QString(utf8bytes.mid(0, targetStart));
@@ -509,36 +192,68 @@ QString FindResultWin::highlightFindText(FindRecord& record)
 	}
 
 	return QString("%1%2%3").arg(head).arg(src).arg(tail);
+#endif
+	return "";
 }
 
+
+//在当前文件查找字段,结果是一个单一的FindRecords
 void FindResultWin::appendResultsToShow(FindRecords* record)
 {
+#if 0
 	if (record == nullptr)
 	{
 		return;
 	}
+	FindResultView* pDisplay = ui.displayView;
 
-	QString findTitle;
-	//if (!StyleSet::isCurrentDeepStyle())
-	//{
-		findTitle = tr("<font style='font-size:14px;font-weight:bold;color:#343497'>Search \"%1\" (%2 hits)</font>").arg(record->findText.toHtmlEscaped()).arg(record->records.size());
-	/*}
-	else
+	QString findTitle = tr("Search \"%1\" (%2 hits)\n").arg(record->findText).arg(record->records.size());
+
+	//pDisplay->append(findTitle);
+
+	pDisplay->insertAt(findTitle,0,0);
+
+	pDisplay->SendScintilla(SCI_SETFOLDLEVEL, 0, (long)(0|SC_FOLDLEVELHEADERFLAG));
+
+	QStringList contents;
+
+	for (int i = 0; i < record->records.size(); ++i)
 	{
-		findTitle = tr("<font style='font-size:14px;font-weight:bold;color:#ffffff'>Search \"%1\" (%2 hits)</font>").arg(record->findText.toHtmlEscaped()).arg(record->records.size());
-	}*/
+		FindRecord v = record->records.at(i);
 
+		const QString & richText = v.lineContents;
 
-	QStandardItem* titleItem = new QStandardItem(findTitle);
+		QString text;
+		if (!StyleSet::isCurrentDeepStyle())
+		{
+			text = tr("Line %1 : %2\n").arg(v.lineNum + 1).arg(richText);
+		}
+		else
+		{
+			text = tr("Line %1 : %2\n").arg(v.lineNum + 1).arg(richText);
+		}
+
+		contents.append(text);
+	}
+
+	pDisplay->insertAt(contents.join(""), 1, 0);
+
+	for (int i = 0; i < record->records.size(); ++i)
+	{
+		pDisplay->SendScintilla(SCI_SETFOLDLEVEL, i+1, 1);
+	}
+#endif
+
+#if 0
+	
+
+	QString findTitle;
+
+	findTitle = tr("<font style='font-size:14px;font-weight:bold;color:#343497'>Search \"%1\" (%2 hits)</font>").arg(record->findText.toHtmlEscaped()).arg(record->records.size());
 
-	//if (!StyleSet::isCurrentDeepStyle())
-	//{
-		setItemBackground(titleItem, QColor(0xbbbbff));
-	//}
-	//else
-	//{
-	//	setItemBackground(titleItem, QColor(0x423328));//0xd5ffd5
-	//}
+	QStandardItem* titleItem = new QStandardItem(findTitle);
+	setItemBackground(titleItem, QColor(0xbbbbff));
+	
 
 	m_model->insertRow(0, titleItem);
 	titleItem->setData(QVariant(true), ResultItemRoot);
@@ -587,8 +302,6 @@ void FindResultWin::appendResultsToShow(FindRecords* record)
 	//描述行双击不响应
 	descItem->setData(QVariant(true), ResultItemDesc);
 
-	//int lastLineNum = -1;
-	//int occurTimes = 0;
 
 	for (int i =0 ; i < record->records.size(); ++i)
 	{
@@ -617,8 +330,9 @@ void FindResultWin::appendResultsToShow(FindRecords* record)
 	{
 		ui.resultTreeView->expand(m_model->index(0, 0, m_model->index(0, 0)));
 	}
-
+#endif
 }
+#endif
 
 void FindResultWin::appendResultsToShow(QVector<FindRecords*>* record, int hits, QString whatFind)
 {
@@ -627,149 +341,149 @@ void FindResultWin::appendResultsToShow(QVector<FindRecords*>* record, int hits,
 		return;
 	}
 
-	QString findTitle = tr("<font style='font-size:14px;font-weight:bold;color:#343497'>Search \"%1\" (%2 hits in %3 files)</font>").arg(whatFind.toHtmlEscaped()).arg(hits).arg(record->size());
-	QStandardItem* titleItem = new QStandardItem(findTitle);
-	setItemBackground(titleItem, QColor(0xbbbbff));
-	titleItem->setData(QVariant(true), ResultItemRoot);
+	if (this->isHidden())
+	{
+		this->setVisible(true);
+	}
 
-	//总是把结果插在最上面一行
-	m_model->insertRow(0, titleItem);
+	ResultLineInfo lineInfo;
 
-	int rowNum = m_model->rowCount();
+	QString findTitle = tr("Search \"%1\" (%2 hits in %3 files)\n").arg(whatFind).arg(hits).arg(record->size());
 
-	//把其余的行收起来
-	for (int i = 1; i < rowNum; ++i)
-	{
-		ui.resultTreeView->collapse(m_model->index(i, 0));
-	}
-	ui.resultTreeView->expand(m_model->index(0, 0));
+	FindResultView* pDisplay = ui.displayView;
+	pDisplay->on_foldAll();
+
+	pDisplay->insertAt(findTitle, 0, 0);
+
+	lineInfo.level = 0;
+	m_resultLineInfo.insert(0,lineInfo);
+
+	pDisplay->SendScintilla(SCI_SETFOLDLEVEL, 0, (long)(0 | SC_FOLDLEVELHEADERFLAG));
 
 	if (record->size() == 0)
 	{
 		return;
 	}
 
+	QStringList contents;
 
+	QList<int> keyworkOffsetPos;
+	QString text;
+	QString linePrefix;
 
-	for (int i = 0,count= record->size(); i < count; ++i)
+
+	int insertIndex = 1;
+	for (int i = 0, count = record->size(); i < count; ++i)
 	{
 		FindRecords* pr = record->at(i);
 
+		QString* pFilePath = new QString(pr->findFilePath);
 		QString desc;
 		if (!StyleSet::isCurrentDeepStyle())
 		{
-			desc = tr("<font style='font-size:14px;font-weight:bold;color:#309730'>%1 (%2 hits)</font>").arg(pr->findFilePath.toHtmlEscaped()).arg(pr->records.size());
-		}
-		else
-		{
-			desc = tr("<font style='font-size:14px;color:#99cc99'>%1 (%2 hits)</font>").arg(pr->findFilePath.toHtmlEscaped()).arg(pr->records.size());
-		}
-
-		QStandardItem* descItem = new QStandardItem(desc);
-
-		if (!StyleSet::isCurrentDeepStyle())
-		{
-		setItemBackground(descItem, QColor(0xd5ffd5));
+			desc = tr(" %1 (%2 hits)\n").arg(pr->findFilePath).arg(pr->records.size());
 		}
 		else
 		{
-			setItemBackground(descItem, QColor(0x484848));
+			desc = tr(" %1 (%2 hits)\n").arg(pr->findFilePath).arg(pr->records.size());
 		}
+		contents.append(desc);
+		m_resultLineFilePath.append(pFilePath);
 
-		titleItem->insertRow(0,descItem);
+		lineInfo.level = 1;
+		m_resultLineInfo.insert(insertIndex, lineInfo);
+		++insertIndex;
 
-		//默认全部收起来
-		if (count > 10)
+		for (int j = 0; j < pr->records.size(); ++j)
 		{
-			ui.resultTreeView->collapse(m_model->index(0, 0, m_model->index(0, 0)));
-		}
-	
-		descItem->setData(QVariant((qlonglong)pr->pEdit), ResultItemEditor);
-		descItem->setData(QVariant(pr->findFilePath), ResultItemEditorFilePath);
-		descItem->setData(QVariant(pr->findText), ResultWhatFind);
+			FindRecord  v = pr->records.at(j);
+			QString richText = v.lineContents;
 
-		//描述行双击不响应
-		descItem->setData(QVariant(true), ResultItemDesc);
-
-		for (int i = 0; i < pr->records.size(); ++i)
-		{
-			FindRecord  v = pr->records.at(i);
-			QString richText = highlightFindText(v);
+			linePrefix = tr("    Line %1: ").arg(v.lineNum + 1);
 
-			QString text;
 			if (!StyleSet::isCurrentDeepStyle())
 			{
-				text = tr("<font style='font-size:14px;'>Line </font><font style='font-size:14px;color:#ff8040'>%1</font> : %2").arg(v.lineNum + 1).arg(richText);
+				text = tr("%1%2\n").arg(linePrefix).arg(richText);
 			}
 			else
 			{
-				text = tr("<font style='font-size:14px;color:#ffffff'>Line </font><font style='font-size:14px;color:#ff8040'>%1</font> : %2").arg(v.lineNum + 1).arg(richText);
+				text = tr("%1%2\n").arg(linePrefix).arg(richText);
 			}
-			QStandardItem* childItem = new QStandardItem(text);
-#if defined(Q_OS_MAC)
-        childItem->setTextAlignment(Qt::AlignVCenter);
-#endif
-			childItem->setData(QVariant(v.pos), ResultItemPos);
-			childItem->setData(QVariant(v.end - v.pos), ResultItemLen);
-			descItem->appendRow(childItem);
+			contents.append(text);
+			keyworkOffsetPos.append(linePrefix.toUtf8().size());
+			lineInfo.level = 2;
+			lineInfo.resultPos = v.pos;
+			lineInfo.resultEnd = v.end;
+			lineInfo.pFilePath = pFilePath;
+			m_resultLineInfo.insert(insertIndex, lineInfo);
+			++insertIndex;
 
 			QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
 		}
-		if (count <= 10 && !pr->records.isEmpty())
-		{
-			ui.resultTreeView->expand(m_model->index(0, 0, m_model->index(0, 0)));
-		}
 	}
-	ui.resultTreeView->expand(m_model->index(0, 0, m_model->index(0, 0)));
-}
 
-void FindResultWin::setItemBackground(QStandardItem* item, const QColor& color)
-{
-	QBrush b(color);
-	item->setBackground(b);
-}
+	pDisplay->insertAt(contents.join(""), 1, 0);
+	
+	int lineNum = 1;
 
-void FindResultWin::setItemForeground(QStandardItem* item, const QColor& color)
-{
-	QBrush b(color);
-	item->setForeground(b);
-}
+	QList<int> destFileLineNum;
 
-//查找结果框的字体变大
-void FindResultWin::slot_fontZoomIn()
-{
-	QFont curFt = ui.resultTreeView->font();
+	for (int i = 0, count = record->size(); i < count; ++i)
+	{
+		FindRecords* pr = record->at(i);
 
-	int s = curFt.pointSize();
-	s += 2;
-	curFt.setPointSize(s);
+		pDisplay->SendScintilla(SCI_SETFOLDLEVEL, lineNum, (long)(1 | SC_FOLDLEVELHEADERFLAG));
+		destFileLineNum.append(lineNum);
+		++lineNum;
 
-	m_defaultFontSize += 2;
+		for (int j = 0; j < pr->records.size(); ++j)
+		{
+			pDisplay->SendScintilla(SCI_SETFOLDLEVEL, lineNum, (long)2| SC_FOLDLEVELBASE);
 
-	ui.resultTreeView->setFont(curFt);
+			++lineNum;
+		}
+	}
 
-	m_delegate->setFontSize(m_defaultFontSize);
+	//着色
+	pDisplay->setLineBackColorStyle(0, STYLE_COLOUR_TITLE);
 
-	m_defFontSizeChange = true;
-}
+	for (int i = 0, count = destFileLineNum.size(); i < count; ++i)
+	{
+		pDisplay->setLineBackColorStyle(destFileLineNum.at(i), (StyleSet::isCurrentDeepStyle()? STYLE_DEEP_COLOUR_DEST_FILE:STYLE_COLOUR_DEST_FILE));
+	}
+	
+	//关键字高亮
+	//高亮的开始、结束位置
+	int targetStart = 0;
+	int targetLens = 0;
+	lineNum = 1;
 
-void FindResultWin::slot_fontZoomOut()
-{
-	QFont curFt = ui.resultTreeView->font();
+	int lineOffsetPosIndex = 0;
+	int lineOffsetPos = 0;
 
-	int s = curFt.pointSize();
-	s -= 2;
+	QString lineNumStr = tr("    Line ");
+	int skipLineNumOffset = lineNumStr.toUtf8().size();
 
-	if (s >= 8)
+	for (int i = 0, count = record->size(); i < count; ++i)
 	{
-		m_defFontSizeChange = true;
-		m_defaultFontSize -= 2;
-		curFt.setPointSize(s);
-		ui.resultTreeView->setFont(curFt);
-		m_delegate->setFontSize(m_defaultFontSize);
+		FindRecords* pr = record->at(i);
+		++lineNum;
+		for (int j = 0; j < pr->records.size(); ++j)
+		{
+			lineOffsetPos = keyworkOffsetPos.at(lineOffsetPosIndex);
+			const FindRecord &v = pr->records.at(j);
+			targetStart = v.pos - v.lineStartPos + lineOffsetPos;
+			targetLens = v.end - v.pos;
+			pDisplay->setLineColorStyle(lineNum, skipLineNumOffset, lineOffsetPos-skipLineNumOffset-2, STYLE_COLOUR_KEYWORD_HIGH);
+			pDisplay->setLineColorStyle(lineNum, targetStart, targetLens, (StyleSet::isCurrentDeepStyle()? STYLE_DEEP_COLOUR_KEYWORD_HIGH:STYLE_COLOUR_KEYWORD_BACK_HIGH));
+			++lineNum;
+			++lineOffsetPosIndex;
+		}
 	}
+	pDisplay->SendScintilla(SCI_GOTOLINE, 0);
 }
 
+
 int FindResultWin::getDefaultFontSize()
 {
 	return m_defaultFontSize;
@@ -779,3 +493,21 @@ void FindResultWin::setDefaultFontSize(int defSize)
 {
 	m_defaultFontSize = defSize;
 }
+
+void FindResultWin::on_lineDoubleClick(int lineNum)
+{
+	if (lineNum < m_resultLineInfo.size())
+	{
+		const ResultLineInfo& lineInfo = m_resultLineInfo.at(lineNum);
+
+		if (lineInfo.level == 2)
+		{
+			//文件定位到行
+			emit lineDoubleClicked(lineInfo.pFilePath, lineInfo.resultPos, lineInfo.resultEnd);
+		}
+		else if ((lineInfo.level == 0) || (lineInfo.level == 1))
+		{
+			ui.displayView->SendScintilla(SCI_FOLDLINE, lineNum, SC_FOLDACTION_TOGGLE);
+		}
+	}
+}

+ 17 - 20
src/findresultwin.h

@@ -1,4 +1,4 @@
-锘�#pragma once
+#pragma once
 
 #include <QWidget>
 #include <QContextMenuEvent>
@@ -6,57 +6,54 @@
 #include "ui_findresultwin.h"
 
 class FindRecords;
-class QStandardItem;
-class NdStyledItemDelegate;
-class QStandardItemModel;
 struct FindRecord;
 
+struct ResultLineInfo {
+	int level;//缩进类型。0 1 2。0:title 1 filepath desc 2 result。
+	int resultPos;//结果字段的开始offset。0和1是没有这个字段的。
+	int resultEnd;//长度
+	QString* pFilePath;
+};
+
 class FindResultWin : public QWidget
 {
 	Q_OBJECT
 
 public:
+	friend class FindResultView;
 	FindResultWin(QWidget *parent = Q_NULLPTR);
 	~FindResultWin();
 
-	void appendResultsToShow(FindRecords * record);
 	void appendResultsToShow(QVector<FindRecords*>* record, int hits, QString whatFind);
 	int  getDefaultFontSize();
 	void setDefaultFontSize(int defSize);
+	void clear();
 signals:
 	void itemDoubleClicked(const QModelIndex &index);
 	void showMsg(QString &msg);
+	void lineDoubleClicked(QString* pFilePath, int pos, int end);
 
 private slots:
-	void slot_clearContents();
-	void slot_selectAll();
-	void slot_copyContents();
-	void slot_copyItemContents();
-	void slot_selectSection();
-	void slot_treeView_pressed(QModelIndex modeIndex);
-	void slot_fontZoomIn();
-	void slot_fontZoomOut();
+	void on_lineDoubleClick(int line);
 public slots:
 	void slot_clearAllContents();
 
-protected:
-	void contextMenuEvent(QContextMenuEvent * event);
-
 private:
+#if 0
 	void setItemBackground(QStandardItem* item, const QColor& color);
 	void setItemForeground(QStandardItem * item, const QColor & color);
 
 	void highlightFindText(int index, QString & srcText, QString & findText, Qt::CaseSensitivity cs);
 	QString highlightFindText(FindRecord& record);
+#endif
 private:
 	Ui::FindResultWin ui;
 	QMenu *m_menu;
-	QAction* m_pSelectSectonAct;
+	QWidget* m_parent;
 
-	QStandardItemModel* m_model;
-	NdStyledItemDelegate* m_delegate;
+	QList<ResultLineInfo> m_resultLineInfo;
+	QList<QString*> m_resultLineFilePath;
 
-	QWidget* m_parent;
 	int m_defaultFontSize;
 	bool m_defFontSizeChange;
 };

+ 8 - 25
src/findresultwin.ui

@@ -39,31 +39,13 @@
     <number>0</number>
    </property>
    <item row="0" column="0">
-    <widget class="MyTreeView" name="resultTreeView">
-     <property name="font">
-      <font>
-       <family>Microsoft YaHei</family>
-       <pointsize>10</pointsize>
-      </font>
-     </property>
+    <widget class="FindResultView" name="displayView">
      <property name="frameShape">
-      <enum>QFrame::Panel</enum>
-     </property>
-     <property name="lineWidth">
-      <number>1</number>
-     </property>
-     <property name="horizontalScrollBarPolicy">
-      <enum>Qt::ScrollBarAsNeeded</enum>
-     </property>
-     <property name="editTriggers">
-      <set>QAbstractItemView::DoubleClicked</set>
+      <enum>QFrame::StyledPanel</enum>
      </property>
-     <property name="animated">
-      <bool>true</bool>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
      </property>
-     <attribute name="headerVisible">
-      <bool>true</bool>
-     </attribute>
     </widget>
    </item>
   </layout>
@@ -71,9 +53,10 @@
  <layoutdefault spacing="6" margin="11"/>
  <customwidgets>
   <customwidget>
-   <class>MyTreeView</class>
-   <extends>QTreeView</extends>
-   <header>mytreeview.h</header>
+   <class>FindResultView</class>
+   <extends>QFrame</extends>
+   <header location="global">findresultview.h</header>
+   <container>1</container>
   </customwidget>
  </customwidgets>
  <resources/>

+ 234 - 56
src/findwin.cpp

@@ -5,6 +5,7 @@
 #include "doctypelistview.h"
 #include "filemanager.h"
 #include "ccnotepad.h"
+#include "nddsetting.h"
 
 #include <QMimeDatabase>
 #include <QRadioButton>
@@ -22,7 +23,7 @@ enum TAB_TYPES {
 	MARK_TYPE,
 };
 
-const int MAX_RECORD_KEY_LENGTH = 20;
+const int MAX_RECORD_KEY_LENGTH = 120;
 
 FindWin::FindWin(QWidget *parent):QMainWindow(parent), m_editTabWidget(nullptr), m_isFindFirst(true), m_findHistory(nullptr), \
 	pEditTemp(nullptr), m_curEditWin(nullptr), m_isStatic(false), m_isReverseFind(false), m_pMainPad(parent)
@@ -78,7 +79,7 @@ FindWin::~FindWin()
 	{
 		delete pEditTemp;
 		pEditTemp = nullptr;
-}
+	}
 }
 
 void FindWin::slot_tabIndexChange(int index)
@@ -277,6 +278,20 @@ void FindWin::setFindHistory(QList<QString>* findHistory)
 	}
 }
 
+void FindWin::setReplaceHistory(QList<QString>* replaceHistory)
+{
+	m_replaceHistory = replaceHistory;
+
+	if ((m_replaceHistory != nullptr) && !m_replaceHistory->isEmpty())
+	{
+		ui.replaceWithBox->addItems(*m_replaceHistory);
+		ui.replaceWithBox->clearEditText();
+		ui.dirReplaceWhat->addItems(*m_replaceHistory);
+		ui.dirReplaceWhat->clearEditText();
+		
+	}
+}
+
 //标记高亮所有word单词
 int FindWin::markAllWord(QString & word)
 {
@@ -312,7 +327,7 @@ void FindWin::removeLineHeadEndBlank(int mode)
 		{
 			ui.replaceTextBox->setCurrentText("[	 ]+$");
 		}
-		ui.replaceWithBox->setText("");
+		ui.replaceWithBox->setEditText("");
 		
 		ui.replaceModeRegularBt->setChecked(true);
 
@@ -466,9 +481,9 @@ void FindWin::updateParameterFromUI()
 			m_isFindFirst = true;
 		}
 
-		if (m_replaceWithText != ui.replaceWithBox->text())
+		if (m_replaceWithText != ui.replaceWithBox->currentText())
 		{
-			m_replaceWithText = ui.replaceWithBox->text();
+			m_replaceWithText = ui.replaceWithBox->currentText();
 			m_isFindFirst = true;
 		}
 
@@ -528,9 +543,9 @@ void FindWin::updateParameterFromUI()
 			m_isFindFirst = true;
 		}
 
-		if (m_replaceWithText != ui.dirReplaceWhat->text())
+		if (m_replaceWithText != ui.dirReplaceWhat->currentText())
 		{
-			m_replaceWithText = ui.dirReplaceWhat->text();
+			m_replaceWithText = ui.dirReplaceWhat->currentText();
 			m_isFindFirst = true;
 		}
 
@@ -703,6 +718,55 @@ void FindWin::addFindHistory(QString &text)
 	}
 }
 
+void FindWin::addReplaceHistory(QString& text)
+{
+	//太长会导致看起来很杂乱,也不记录
+	if (text.isEmpty() || text.size() >= MAX_RECORD_KEY_LENGTH)
+	{
+		return;
+	}
+
+	if (m_replaceHistory != nullptr)
+	{
+		int index = m_replaceHistory->indexOf(text, 0);
+		//已经是最上面一个了,直接返回
+		if (0 == index)
+		{
+			return;
+		}
+		//没有直接添加到最前面。不做查找删除重复,一是慢,而是删除会引起信号逻辑时序有误
+		if (-1 == index)
+		{
+			m_replaceHistory->push_front(text);
+			ui.replaceWithBox->insertItem(0, text); 
+			ui.dirReplaceWhat->insertItem(0, text);
+		}
+		else
+		{
+			//有了怎么办,删除旧的,加新的
+			m_replaceHistory->removeAt(index);
+			m_replaceHistory->push_front(text);
+
+			//发现不能只删除旧的,有bug,一旦删除后,查找框乱了,被切换到下一个。
+			ui.replaceWithBox->removeItem(index);
+			ui.dirReplaceWhat->removeItem(index);
+			ui.replaceWithBox->insertItem(0, text);
+			ui.dirReplaceWhat->insertItem(0, text);
+			//发现不能只删除旧的,有bug,一旦删除后,查找框乱了,被切换到下一个。
+			//必须重新设置一下,否则查找框里面字段乱跳到下一个去了
+			ui.replaceWithBox->setCurrentIndex(0);
+			ui.dirReplaceWhat->setCurrentIndex(0);
+		}
+
+
+
+		if (m_replaceHistory->size() >= 15)
+		{
+			m_replaceHistory->takeLast();
+		}
+	}
+}
+
 //检查是否是第一次查找,凡是参数变化了,则认定为是第一次查找。
 //因为查找分firstFirst和firstNext,则是qscint特性决定的。所以正确识别第一次查找是必要的
 bool FindWin::isFirstFind()
@@ -881,7 +945,7 @@ void FindWin::removeEmptyLine(bool isBlankContained)
 		{
 			ui.replaceTextBox->setCurrentText("^$(\\r\\n|\\r|\\n)");
 		}
-		ui.replaceWithBox->setText("");
+		ui.replaceWithBox->setEditText("");
 
 		ui.replaceModeRegularBt->setChecked(true);
 
@@ -974,8 +1038,6 @@ void FindWin::dofindNext()
 	updateParameterFromUI();
 
 	QWidget* pw = autoAdjustCurrentEditWin();
-
-
 	QsciScintilla* pEdit = dynamic_cast<QsciScintilla*>(pw);
 
 	//第一次查找
@@ -1100,7 +1162,7 @@ void FindWin::slot_findCount()
 		//这里的forward一定要是true。回环一定是false
 		if (!pEdit->findFirst(whatFind, m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_FINDNEXT, 0, 0,false))
 		{
-			ui.statusbar->showMessage(tr("count %1 times with \'%2\'").arg(countNums).arg(m_expr), 8000);
+			ui.statusbar->showMessage(tr("count %1 times with \'%2\'").arg(countNums).arg(m_expr));
 			QApplication::beep();
 
 			m_isFindFirst = true;
@@ -1124,11 +1186,11 @@ void FindWin::slot_findCount()
 
 		pEdit->execute(SCI_GOTOPOS, srcPostion);
 		pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
-		pEdit->execute(SCI_SETXOFFSET, 0);
+		//pEdit->execute(SCI_SETXOFFSET, 0);
 
 		//全部替换后,下次查找,必须算第一次查找
 		m_isFindFirst = true;
-		ui.statusbar->showMessage(tr("count %1 times with \'%2\'").arg(countNums).arg(m_expr), 8000);
+		ui.statusbar->showMessage(tr("count %1 times with \'%2\'").arg(countNums).arg(m_expr));
 	}
 	else
 	{
@@ -1170,11 +1232,16 @@ QString FindWin::addCurFindRecord(ScintillaEditView* pEdit, FindRecords& recordR
 	FindState& state = pEdit->getLastFindState();
 	aRecord.pos = state.targstart;
 	aRecord.end = state.targend;
+	aRecord.lineNum = state.linenum;
 
 	//mark模式不需要这么多信息,可直接返回
 	if (!isMark)
 	{
-		aRecord.lineNum = pEdit->execute(SCI_LINEFROMPOSITION, aRecord.pos);
+		//静默查找,在后台批量查找时,不会返回这个state.linenum。需要手动获取一下
+		if (aRecord.lineNum == -1)
+		{
+			aRecord.lineNum = pEdit->execute(SCI_LINEFROMPOSITION, aRecord.pos);
+		}
 		aRecord.lineStartPos = pEdit->execute(SCI_POSITIONFROMLINE, aRecord.lineNum);
 		int lineLens = pEdit->execute(SCI_LINELENGTH, aRecord.lineNum);
 
@@ -1558,8 +1625,8 @@ int FindWin::findAllInCurDoc(QStringList* reResult)
 
 			if (!m_isStatic)
 			{
-			QApplication::beep();
-			emit sign_findAllInCurDoc(&results);
+				QApplication::beep();
+				emit sign_findAllInCurDoc(&results);
 			}
 
 			m_isFindFirst = true;
@@ -1609,7 +1676,7 @@ int FindWin::findAllInCurDoc(QStringList* reResult)
 
 		pEdit->execute(SCI_GOTOPOS, srcPostion);
 		pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
-		pEdit->execute(SCI_SETXOFFSET, 0);
+		//pEdit->execute(SCI_SETXOFFSET, 0);
 
 		//全部替换后,下次查找,必须算第一次查找
 		m_isFindFirst = true;
@@ -1642,11 +1709,110 @@ int FindWin::findAllInCurDoc(QStringList* reResult)
 
 void FindWin::slot_findAllInCurDoc()
 {
-	findAllInCurDoc();
+	//findAllInCurDoc();
+
+	int index = m_editTabWidget->currentIndex();
+
+	if (index >= 0)
+	{
+		findAllInOpenDoc(index);
+	}
+}
+
+void FindWin::findAllInOpenDoc(int index)
+{
+	if (ui.findComboBox->currentText().isEmpty())
+	{
+		ui.statusbar->showMessage(tr("what find is null !"), 8000);
+		QApplication::beep();
+		return;
+	}
+
+	QString whatFind = ui.findComboBox->currentText();
+	QString originWhatFine = whatFind;
+
+	if (m_extend)
+	{
+		QString extendFind;
+		convertExtendedToString(whatFind, extendFind);
+		whatFind = extendFind;
+	}
+
+	int replaceNums = 0;
+	QVector<FindRecords*>* allOpenFileRecord = new QVector<FindRecords*>();
+
+	for (int i = 0; i < m_editTabWidget->count(); ++i)
+	{
+		//是否只查找一个文档
+		if ((index != -1) && (i != index))
+		{
+			continue;
+		}
+		QWidget* pw = m_editTabWidget->widget(i);
+		ScintillaEditView* pEdit = dynamic_cast<ScintillaEditView*>(pw);
+		if (pEdit != nullptr)
+		{
+			if (pEdit->isReadOnly())
+			{
+				continue;
+			}
+
+			FindRecords* results = new FindRecords();
+			results->pEdit = pEdit;
+
+			results->findFilePath = pw->property("filePath").toString();
+
+			updateParameterFromUI();
+
+			//无条件进行第一次查找,从0行0列开始查找,而且不回环。如果没有找到,则替换完毕
+			//results->findText要是有原来的值,因为扩展模式下\r\n不会转义,直接输出会换行显示
+			results->findText = originWhatFine;
+			if (!pEdit->findFirst(whatFind, m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_FINDNEXT, 0, 0))
+			{
+				delete results;
+				continue;
+			}
+			else
+			{
+				dealWithZeroFound(pEdit);
+			}
+			addCurFindRecord(pEdit, *results);
+
+			++replaceNums;
+
+			//找到了,把结果收集起来
+			while (pEdit->findNext())
+			{
+				addCurFindRecord(pEdit, *results);
+				++replaceNums;
+				dealWithZeroFound(pEdit);
+			}
+
+			allOpenFileRecord->append(results);
+		}
+	}
+
+	//全部替换后,下次查找,必须算第一次查找
+	m_isFindFirst = true;
+	ui.statusbar->showMessage(tr("find finished, total %1 found!").arg(replaceNums), 10000);
+
+	emit sign_findAllInOpenDoc(allOpenFileRecord, replaceNums, whatFind);
+
+	//释放元素
+	for (int i = 0; i < allOpenFileRecord->size(); ++i)
+	{
+		delete allOpenFileRecord->at(i);
+	}
+
+	delete allOpenFileRecord;
+
 }
 
 void FindWin::slot_findAllInOpenDoc()
 {
+	findAllInOpenDoc(-1);
+
+#if 0
 	if (ui.findComboBox->currentText().isEmpty())
 	{
 		ui.statusbar->showMessage(tr("what find is null !"), 8000);
@@ -1726,7 +1892,7 @@ void FindWin::slot_findAllInOpenDoc()
 	}
 
 	delete allOpenFileRecord;
-	
+#endif
 }
 
 //返回是否查找得到内容
@@ -1744,6 +1910,9 @@ bool FindWin::replaceFindNext(QsciScintilla* pEdit, bool showZeroFindTip)
 
 			addFindHistory(whatFind);
 
+			QString replaceWith = ui.replaceWithBox->currentText();
+			addReplaceHistory(replaceWith);
+
 			if (m_extend)
 			{
 				QString extendFind;
@@ -1820,7 +1989,7 @@ bool FindWin::replace(ScintillaEditView* pEdit)
 	}
 
 	QString findText = ui.replaceTextBox->currentText();
-	QString replaceText = ui.replaceWithBox->text();
+	QString replaceText = ui.replaceWithBox->currentText();
 
 	if (m_extend)
 	{
@@ -2083,7 +2252,7 @@ int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString&
 
 	if (isCombineUndo)
 	{
-	pEdit->execute(SCI_BEGINUNDOACTION);
+		pEdit->execute(SCI_BEGINUNDOACTION);
 	}
 
 	int flags = buildSearchFlags(m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_REPLACENEXT, 0, 0);
@@ -2147,14 +2316,12 @@ int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString&
 
 	if (isCombineUndo)
 	{
-	pEdit->execute(SCI_ENDUNDOACTION);
+		pEdit->execute(SCI_ENDUNDOACTION);
 	}
 
 	pEdit->execute(SCI_GOTOPOS, srcPostion);
 	pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
-	pEdit->execute(SCI_SETXOFFSET, 0);
-
-	
+	//pEdit->execute(SCI_SETXOFFSET, 0);
 
 	return replaceNums;
 }
@@ -2186,7 +2353,7 @@ int FindWin::replaceAll()
 	updateParameterFromUI();
 
 	QString whatFind = ui.replaceTextBox->currentText();
-	QString replaceText = ui.replaceWithBox->text();
+	QString replaceText = ui.replaceWithBox->currentText();
 
 	if (m_extend)
 	{
@@ -2290,7 +2457,7 @@ void FindWin::slot_replaceAllInOpenDoc()
 	ui.statusbar->showMessage(tr("Replace in Opened Files: %1 occurrences were replaced.").arg(replaceNums), 10000);
 }
 
-int  FindWin::markAll()
+int  FindWin::markAll(QSet<int>* outLineNum)
 {
 	if (ui.markTextBox->currentText().isEmpty())
 	{
@@ -2367,6 +2534,11 @@ int  FindWin::markAll()
 				pEdit->execute(SCI_SETINDICATORCURRENT, CCNotePad::s_curMarkColorId);
 				pEdit->execute(SCI_INDICATORFILLRANGE, rs.pos, foundTextLen);
 			}
+
+			if (outLineNum != nullptr)
+			{
+				outLineNum->insert(rs.lineNum);
+			}
 		}
 
 		if (!results->records.isEmpty())
@@ -2374,15 +2546,15 @@ int  FindWin::markAll()
 			pEdit->appendMarkRecord(results);
 		}
 
-
-		pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
 		pEdit->execute(SCI_GOTOPOS, srcPostion);
-		pEdit->execute(SCI_SETXOFFSET, 0);
+		pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
+		//pEdit->execute(SCI_SETXOFFSET, 0);
 
 		//全部替换后,下次查找,必须算第一次查找
 		m_isFindFirst = true;
 		ui.statusbar->showMessage(tr("mark finished, total %1 found!").arg(replaceNums), 10000);
 
+	
 		return replaceNums;
 	}
 	else
@@ -2431,6 +2603,10 @@ void FindWin::slot_dirSelectDest()
 	QString curDirPath = ui.destFindDir->text();
 	if (curDirPath.isEmpty())
 	{
+		if (CCNotePad::s_lastOpenDirPath.isEmpty())
+		{
+			CCNotePad::s_lastOpenDirPath = NddSetting::getKeyValueFromDelaySets(LAST_OPEN_DIR);
+		}
 		curDirPath = CCNotePad::s_lastOpenDirPath;
 	}
 
@@ -2517,30 +2693,14 @@ bool FindWin::replaceTextInFile(QString &filePath, int &replaceNums, QVector<Fin
 		replace = extendReplace;
 	}
 
-	replaceNums += doReplaceAll(pEditTemp, find, replace);
-
-#if 0
-	if (!pEditTemp->findFirst(find, m_re, m_cs, m_wo, false, m_forward, FINDNEXTTYPE_REPLACENEXT,0, 0,false))
-	{
-		return false;
-	}
-
-	pEditTemp->replace(replace);
-	dealWithZeroFound(pEditTemp);
-
-	++replaceNums;
+	int modifyTimes = doReplaceAll(pEditTemp, find, replace);
 
-	//找到了,则自动进行全部替换
-	while (pEditTemp->findNext())
+	if (modifyTimes > 0)
 	{
-		pEditTemp->replace(replace);
-		++replaceNums;
-		dealWithZeroFound(pEditTemp);
+		replaceNums += modifyTimes;
+		//如果进行过替换,则必须要保存一下;否则不能保存,不然文件被修改。
+		emit sign_replaceSaveFile(filePath, pEditTemp);
 	}
-#endif
-
-	//必须要保存一下
-	emit sign_replaceSaveFile(filePath, pEditTemp);
 
 	return true;
 }
@@ -2853,7 +3013,7 @@ void FindWin::slot_dirFindAll()
 
 	if (pEditTemp == nullptr)
 	{
-		pEditTemp = new ScintillaEditView(nullptr);
+		pEditTemp = ScintillaEditView::createEditForSearch();
 	}
 
 	int foundNums = 0;
@@ -2865,7 +3025,7 @@ void FindWin::slot_dirFindAll()
 
 	//全部替换后,下次查找,必须算第一次查找
 	m_isFindFirst = true;
-	ui.statusbar->showMessage(tr("find finished, total %1 found in %2 file!").arg(foundNums).arg(filesNum), 10000);
+	ui.statusbar->showMessage(tr("find finished, walk %1 files, total %2 found in %3 file!").arg(filesNum).arg(foundNums).arg(allfileInDirRecord->size()));
 
 	//复用了这个信号函数,没有新做消息,要注意
 	emit sign_findAllInOpenDoc(allfileInDirRecord, foundNums, whatFind);
@@ -2887,7 +3047,7 @@ void FindWin::slot_dirReplaceAll()
 {
 	QString dirPath = ui.destFindDir->text();
 	QString whatFind = ui.dirFindWhat->currentText();
-	QString dirReplaceWhat = ui.dirReplaceWhat->text();
+	QString dirReplaceWhat = ui.dirReplaceWhat->currentText();
 
 	if (dirPath.isEmpty())
 	{
@@ -2969,12 +3129,15 @@ void FindWin::slot_dirReplaceAll()
 	int skipMaxSize = (ui.skipFileMaxSize->isChecked()) ? ui.maxFileSizeSpinBox->value() * 1024 * 1024 : 0;
 	bool isSkipChildDir = ui.skipChildDirs->isChecked();
 
+	addReplaceHistory(dirReplaceWhat);
+
 	updateParameterFromUI();
 
 	if (pEditTemp == nullptr)
 	{
-		pEditTemp = new ScintillaEditView(nullptr);
+		pEditTemp = ScintillaEditView::createEditForSearch();
 	}
+
 	int replaceNums = 0;
 
 	std::function<bool(QString &, int &, QVector<FindRecords*>* allfileInDirRecord)> foundCallBack = std::bind(&FindWin::replaceTextInFile, this, std::placeholders::_1, std::placeholders::_2, nullptr);
@@ -2983,7 +3146,7 @@ void FindWin::slot_dirReplaceAll()
 
 	//全部替换后,下次查找,必须算第一次查找
 	m_isFindFirst = true;
-	ui.statusbar->showMessage(tr("replace finished, total %1 replace in %2 file!").arg(replaceNums).arg(filesNum), 10000);
+	ui.statusbar->showMessage(tr("replace finished, walk %1 files, total %2 replace !").arg(filesNum).arg(replaceNums));
 }
 
 
@@ -3004,4 +3167,19 @@ void  FindWin::on_copyReFindResult()
 		QClipboard* clipboard = QApplication::clipboard();
 		clipboard->setText(reResult.join("\n"));
 	}
+}
+
+void FindWin::on_markAndBook()
+{
+	QSet<int> outLineNum;
+	markAll(&outLineNum);
+
+	QWidget* pw = autoAdjustCurrentEditWin();
+	ScintillaEditView* pEdit = dynamic_cast<ScintillaEditView*>(pw);
+
+	if (pEdit != nullptr)
+	{
+		pEdit->bookmarkAdd(outLineNum);
+	}
+
 }

+ 9 - 1
src/findwin.h

@@ -69,6 +69,7 @@ public:
 	void setMarkFindText(QString& text);
 	void disableReplace();
 	void setFindHistory(QList<QString>* findHistory);
+	void setReplaceHistory(QList<QString>* replaceHistory);
 	int markAllWord(QString& word);
 	void removeLineHeadEndBlank(int mode);
 	static void showCallTip(QsciScintilla * pEdit, int pos);
@@ -97,6 +98,7 @@ signals:
 private:
 	void updateParameterFromUI();
 	void addFindHistory(QString & text);
+	void addReplaceHistory(QString& text);
 	bool isFirstFind();
 	
 	QString addCurFindRecord(ScintillaEditView * pEdit, FindRecords & recordRet, bool isMark=false, bool getResult=false);
@@ -125,10 +127,12 @@ private:
 
 	int replaceAll();
 
-	int markAll();
+	int markAll(QSet<int>* outLineNum=nullptr);
 
 	int findAllInCurDoc(QStringList * reResult=nullptr);
 
+	void findAllInOpenDoc(int index = -1);
+
 private slots:
 
 	void slot_findNext();
@@ -173,6 +177,8 @@ private slots:
 
 	void on_copyReFindResult();
 
+	void on_markAndBook();
+
 private:
 	Ui::FindWin ui;
 
@@ -216,6 +222,8 @@ private:
 
 	QList<QString>* m_findHistory;
 
+	QList<QString>* m_replaceHistory;
+
 	ScintillaEditView* pEditTemp;
 
 	QWidget* m_curEditWin;

+ 80 - 55
src/findwin.ui

@@ -403,13 +403,7 @@
                </widget>
               </item>
               <item>
-               <widget class="QLineEdit" name="replaceWithBox">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
+               <widget class="QComboBox" name="replaceWithBox">
                 <property name="minimumSize">
                  <size>
                   <width>300</width>
@@ -422,6 +416,12 @@
                   <height>16777215</height>
                  </size>
                 </property>
+                <property name="editable">
+                 <bool>true</bool>
+                </property>
+                <property name="maxCount">
+                 <number>512</number>
+                </property>
                </widget>
               </item>
              </layout>
@@ -759,8 +759,21 @@
           </item>
           <item>
            <layout class="QGridLayout" name="gridLayout_5">
-            <item row="1" column="1">
-             <widget class="QLineEdit" name="fileType">
+            <item row="1" column="0">
+             <widget class="QLabel" name="label_6">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Replace with :</string>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="1">
+             <widget class="QLineEdit" name="skipDirNames">
               <property name="enabled">
                <bool>false</bool>
               </property>
@@ -783,37 +796,11 @@
                </size>
               </property>
               <property name="placeholderText">
-               <string>*.c:*.cpp:*.h</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="0">
-             <widget class="QCheckBox" name="dealFileType">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="text">
-               <string>File Type :</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="0">
-             <widget class="QLabel" name="label_6">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="text">
-               <string>Replace with :</string>
+               <string>debug:Debug:.vs:.git:.svn</string>
               </property>
              </widget>
             </item>
-            <item row="2" column="0">
+            <item row="3" column="0">
              <widget class="QCheckBox" name="skipDir">
               <property name="sizePolicy">
                <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -827,7 +814,7 @@
              </widget>
             </item>
             <item row="2" column="1">
-             <widget class="QLineEdit" name="skipDirNames">
+             <widget class="QLineEdit" name="fileType">
               <property name="enabled">
                <bool>false</bool>
               </property>
@@ -850,29 +837,33 @@
                </size>
               </property>
               <property name="placeholderText">
-               <string>debug:Debug:.vs:.git:.svn</string>
+               <string>*.c:*.cpp:*.h</string>
               </property>
              </widget>
             </item>
-            <item row="0" column="1">
-             <widget class="QLineEdit" name="dirReplaceWhat">
+            <item row="2" column="0">
+             <widget class="QCheckBox" name="dealFileType">
               <property name="sizePolicy">
-               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
                 <horstretch>0</horstretch>
                 <verstretch>0</verstretch>
                </sizepolicy>
               </property>
+              <property name="text">
+               <string>File Type :</string>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="1">
+             <widget class="QComboBox" name="dirReplaceWhat">
               <property name="minimumSize">
                <size>
                 <width>300</width>
                 <height>0</height>
                </size>
               </property>
-              <property name="maximumSize">
-               <size>
-                <width>350</width>
-                <height>16777215</height>
-               </size>
+              <property name="editable">
+               <bool>true</bool>
               </property>
              </widget>
             </item>
@@ -1312,6 +1303,25 @@
             </property>
            </widget>
           </item>
+          <item>
+           <widget class="QPushButton" name="pushButton">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>200</width>
+              <height>28</height>
+             </size>
+            </property>
+            <property name="text">
+             <string>Mark &amp; Bookmark</string>
+            </property>
+           </widget>
+          </item>
           <item>
            <widget class="QPushButton" name="markClearBox">
             <property name="sizePolicy">
@@ -1410,7 +1420,6 @@
   <tabstop>findModeExtendBt</tabstop>
   <tabstop>findModeRegularBt</tabstop>
   <tabstop>replaceTextBox</tabstop>
-  <tabstop>replaceWithBox</tabstop>
   <tabstop>replaceFindNextBox</tabstop>
   <tabstop>replaceBt</tabstop>
   <tabstop>replaceAllBt</tabstop>
@@ -1425,7 +1434,6 @@
   <tabstop>replaceModeRegularBt</tabstop>
   <tabstop>destFindDir</tabstop>
   <tabstop>dirFindWhat</tabstop>
-  <tabstop>dirReplaceWhat</tabstop>
   <tabstop>selectDir</tabstop>
   <tabstop>dirFindAll</tabstop>
   <tabstop>dirReplaceAll</tabstop>
@@ -1627,8 +1635,8 @@
    <slot>slot_clearMark()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>489</x>
-     <y>84</y>
+     <x>672</x>
+     <y>129</y>
     </hint>
     <hint type="destinationlabel">
      <x>588</x>
@@ -1643,8 +1651,8 @@
    <slot>close()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>572</x>
-     <y>162</y>
+     <x>672</x>
+     <y>197</y>
     </hint>
     <hint type="destinationlabel">
      <x>404</x>
@@ -1755,8 +1763,8 @@
    <slot>slot_clearAllMark()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>538</x>
-     <y>112</y>
+     <x>672</x>
+     <y>163</y>
     </hint>
     <hint type="destinationlabel">
      <x>574</x>
@@ -1780,6 +1788,22 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>pushButton</sender>
+   <signal>clicked()</signal>
+   <receiver>FindWin</receiver>
+   <slot>on_markAndBook()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>565</x>
+     <y>77</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>434</x>
+     <y>386</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>slot_findNext()</slot>
@@ -1799,5 +1823,6 @@
   <slot>slot_findPrev()</slot>
   <slot>slot_clearAllMark()</slot>
   <slot>on_copyReFindResult()</slot>
+  <slot>on_markAndBook()</slot>
  </slots>
 </ui>

+ 3 - 2
src/include/pluginGl.h

@@ -22,9 +22,10 @@ struct ndd_proc_data
 	QString m_version;           // [可选]版本号码
 	QString m_auther;            // [可选]作者名称
 	int 	m_menuType;			 // [可选]菜单类型(0:不使用二级菜单 1:创建二级菜单)
-	QMenu* 	m_rootMenu;			 // [依赖]当 m_menuType = 1,给出二级根菜单的地址(默认为 nullptr)
+	QMenu* 	m_rootMenu;			 // [依赖]当 m_menuType = 1,则给出二级根菜单的地址(默认为 nullptr)
+	QAction* m_pAction;          // []如果m_menuType = 0,给出一级菜单动作的地址。其他值nullptr 插件内部不用填写,主程序传递下来
 
-	ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0)
+	ndd_proc_data(): m_rootMenu(nullptr), m_pAction(nullptr),m_menuType(0)
 	{
 
 	}

+ 5 - 6
src/linux/usr/share/applications/io.gitee.cxasm.notepad--.desktop → src/linux/usr/share/applications/NotePad--.desktop

@@ -1,13 +1,12 @@
 [Desktop Entry]
 Version=1.0
-Name=Notepad--
-Name[zh_CN]=Notepad--
-Comment=Notepad-- 是一个国产跨平台、简单的文本编辑器。
+Name=NotePad--
+Name[zh_CN]=NotePad--
+Comment=NotePad-- 是一个国产跨平台、简单的文本编辑器。
 Type=Application
-Exec=notepad-- %F 
-Icon=notepad--
+Exec=NotePad-- %F 
+Icon=/usr/share/icons/hicolor/128x128/apps/notepad--.png
 Categories=Development;Office;
 Terminal=false
 MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-patch;text/x-adasrc;text/x-chdr;text/x-csrc;text/css;application/x-desktop;text/x-patch;text/x-fortran;text/html;text/x-java;text/x-tex;text/x-makefile;text/x-objcsrc;text/x-pascal;application/x-perl;application/x-perl;application/x-php;text/vnd.wap.wml;text/x-python;application/x-ruby;text/sgml;application/xml;model/vrml;image/svg+xml;application/json;
 
-# Generated from the DesktopGenerater component of the z-Tools toolkit

+ 16 - 1
src/main.cpp

@@ -121,14 +121,29 @@ class MyApplication : public QApplication
 
 int main(int argc, char *argv[])
 {
-	//可以防止某些屏幕下的字体拥挤重叠问题
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
+	QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
+#elif (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
+	#ifdef Q_OS_WIN
+		HDC hdc = CreateDC(L"display", NULL, NULL, NULL);
+		int ndpi = GetDeviceCaps(hdc, LOGPIXELSY);
+		qputenv("QT_SCALE_FACTOR", QString::number(ndpi / 96.0).toUtf8());
+	#endif // Q_OS_WIN
+#endif
+#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
 	QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+#endif
+
 #ifdef Q_OS_MAC
     MyApplication a(argc, argv);
 #else
 	QApplication a(argc, argv);
 #endif
 
+#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
+	a.setAttribute(Qt::AA_UseHighDpiPixmaps);
+#endif
+
 	//不能开启,开启后相对路径打开文件失败
 	//QDir::setCurrent(QCoreApplication::applicationDirPath());
 

+ 28 - 0
src/markdownview.cpp

@@ -0,0 +1,28 @@
+#include "markdownview.h"
+
+MarkdownView::MarkdownView(QWidget *parent)
+	: QMainWindow(parent)
+{
+	ui.setupUi(this);
+}
+
+MarkdownView::~MarkdownView()
+{
+
+}
+
+
+void MarkdownView::viewMarkdown(QString& text)
+{
+#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
+	QString tips = QString(
+			"NOTE: Your Qt version is lower than 5.14, so you can't preview Markdown for the time being."
+			"\n"
+			"\n"
+			"%1").arg(text);
+	ui.textEdit->setPlainText(tips);
+#else
+	ui.textEdit->setMarkdown(text);
+#endif
+	
+}

+ 17 - 0
src/markdownview.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <QMainWindow>
+#include "ui_markdownview.h"
+
+class MarkdownView : public QMainWindow
+{
+	Q_OBJECT
+
+public:
+	MarkdownView(QWidget *parent = nullptr);
+	~MarkdownView();
+	void viewMarkdown(QString& text);
+
+private:
+	Ui::MarkdownViewClass ui;
+};

+ 65 - 0
src/markdownview.ui

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MarkdownViewClass</class>
+ <widget class="QMainWindow" name="MarkdownViewClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1134</width>
+    <height>712</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MarkdownView</string>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>3</number>
+    </property>
+    <property name="leftMargin">
+     <number>3</number>
+    </property>
+    <property name="topMargin">
+     <number>3</number>
+    </property>
+    <property name="rightMargin">
+     <number>3</number>
+    </property>
+    <property name="bottomMargin">
+     <number>3</number>
+    </property>
+    <item>
+     <widget class="QTextEdit" name="textEdit">
+      <property name="readOnly">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>1134</width>
+     <height>23</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QToolBar" name="mainToolBar">
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>

+ 25 - 0
src/nddpluginapi.cpp

@@ -0,0 +1,25 @@
+#include "nddpluginapi.h"
+#include "ccnotepad.h"
+
+NddPluginApi::NddPluginApi(QObject *parent)
+	: QObject(parent)
+{}
+
+NddPluginApi::~NddPluginApi()
+{}
+
+void NddPluginApi::setMainNotePad(QWidget * pWidget)
+{
+	m_mainNotePad = pWidget;
+}
+
+//×¢ÒâÕâÀïʵ¼Ê·µ»ØµÄÊÇScintillaEditView
+QsciScintilla* NddPluginApi::getCurrentEidtHandle()
+{
+	CCNotePad* pNotepad = dynamic_cast<CCNotePad*>(m_mainNotePad);
+	if (pNotepad != nullptr)
+	{
+		return pNotepad->getCurEditView();
+	}
+	return nullptr;
+}

+ 37 - 0
src/nddpluginapi.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#include <QObject>
+#include <QMap>
+#include <QVariant>
+
+//这个类供插件中调用,务必要保证该类的ABI兼容性。
+//这意味着,不能随意增加删除该类中的函数和成员变量;否则会导致插件无法兼容。
+//不使用除虚函数之外的任何虚函数
+//理论上最好一个插件,对应一个该对象。这样不会冲突。
+
+class QsciScintilla;
+
+class NddPluginApi  : public QObject
+{
+	Q_OBJECT
+
+public:
+	NddPluginApi(QObject *parent);
+	~NddPluginApi();
+
+	//获取当前编辑框的对象这个一定要每次动态获取。这里也有问题,一旦QsciScintilla修改,还是不能起到ABI兼容。
+	//尽量依赖不需要改动的部分。
+
+	void setMainNotePad(QWidget* pWidget);
+
+	//有了这个当前编辑框后,就可以动态做许多事情了。但是前提是QsciScintilla基类不能随意修改。
+	QsciScintilla* getCurrentEidtHandle();
+
+
+
+	//这个里面的成员函数要特别小心,一旦给定,则顺序和参数不能随意修改。只能依次往后增加、不能删除。
+public:
+	//使用动态参数进行参数的传递。使用public传递成员参数
+	QMap<QString, QVariant> m_parameter;
+	QWidget* m_mainNotePad;
+};

+ 17 - 2
src/nddsetting.cpp

@@ -90,10 +90,10 @@ void NddSetting::init()
 		//开启自动缩进
 		addKeyValueToNumSets(INDENT_KEY, 0);
 
-		//显示空白
+		//显示空白。0都不显示 1 单显示空格 2 单显示行尾 3 都显示
 		addKeyValueToNumSets(SHOWSPACE_KEY, 0);
 
-		//最大文本文件的门限。默认100M.(50-300)
+		//最大文本文件的门限。默认100M.(50-600)
 		addKeyValueToNumSets(MAX_BIG_TEXT, 100);
 
 		addKeyValueToSets(SOFT_KEY, "0");
@@ -368,3 +368,18 @@ bool NddSetting::updataKeyValueFromDelaySets(QString key, QString value)
 	s_isContentChanged = true;
 	return true;
 }
+
+//写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
+int NddSetting::getKeyValueFromDelayNumSets(QString key)
+{
+	nddDelaySetInit();
+	return s_nddDelaySet->value(key, "").toInt();
+}
+
+bool NddSetting::updataKeyValueFromDelayNumSets(QString key, int value)
+{
+	nddDelaySetInit();
+	s_nddDelaySet->setValue(key, value);
+	s_isContentChanged = true;
+	return true;
+}

+ 6 - 0
src/nddsetting.h

@@ -27,6 +27,8 @@ static QString FIND_RESULT_FONT_SIZE = "frfs";//查找结果的默认字体大
 static QString LAST_ACTION_TAB_INDEX = "lati";//上次关闭时,当前激活的tab标签页序号
 
 static QString RECENT_OPEN_FILE = "recentopenfile";
+static QString LAST_OPEN_DIR = "lastdir";
+static QString CLEAR_OPENFILE_ON_CLOSE = "clearopenfile"; //关闭时清空历史文件
 
 
 //下面这个是winpos.ini中的key,避免单个文件太大,拖慢启动速度
@@ -65,6 +67,10 @@ public:
 
 	static bool updataKeyValueFromDelaySets(QString key, QString  value);
 
+	static int getKeyValueFromDelayNumSets(QString key);
+
+	static bool updataKeyValueFromDelayNumSets(QString key, int value);
+
 	static bool isDbExist()
 	{
 		return s_isExistDb;

+ 0 - 62
src/ndstyleditemdelegate.cpp

@@ -1,62 +0,0 @@
-#include "ndstyleditemdelegate.h"
-#include <QTextDocument>
-#include <QApplication>
-#include <QAbstractTextDocumentLayout>
-#include <QPainter>
-#include <QTextEdit>
-
-NdStyledItemDelegate::NdStyledItemDelegate(QObject *parent)
-	: QStyledItemDelegate(parent), m_defaultFontSize(14)
-{
-}
-
-NdStyledItemDelegate::~NdStyledItemDelegate()
-{
-}
-
-
-void NdStyledItemDelegate::setFontSize(int size)
-{
-	m_defaultFontSize = size;
-	
-}
-
-//重载使可以支持富文本格式的文字
-void NdStyledItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
-{
-	QStyleOptionViewItem viewOption(option);
-	initStyleOption(&viewOption, index);
-	if (option.state.testFlag(QStyle::State_HasFocus))
-		viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
-
-	// ... 省略
-	// 设置显示文本为空,使用默认样式
-	QStyle *pStyle = viewOption.widget ? viewOption.widget->style() : QApplication::style();
-
-	QTextDocument doc;
-
-	//外部修改了字体大小后,内部进行富文本的修改绘制。
-	if (m_defaultFontSize != 14)
-	{
-		viewOption.text.replace("font-size:14px",QString("font-size:%1px").arg(m_defaultFontSize));
-	}
-
-	doc.setHtml(viewOption.text);
-
-	viewOption.text.clear();
-
-	pStyle->drawControl(QStyle::CE_ItemViewItem, &viewOption, painter, viewOption.widget);
-
-	QAbstractTextDocumentLayout::PaintContext paintContext;
-
-	QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &viewOption);
-	painter->save();
-	// 坐标变换,将左上角设置为原点
-	painter->translate(textRect.topLeft());
-	// 设置HTML绘制区域
-	painter->setClipRect(textRect.translated(-textRect.topLeft()));
-
-	doc.documentLayout()->draw(painter, paintContext);
-
-	painter->restore();
-}

+ 1 - 1
src/plugin.h

@@ -5,6 +5,6 @@ class QMenu;
 class QsciScintilla;
 class QWidget;
 
-typedef int (*NDD_PROC_MAIN_CALLBACK)(QWidget* parent, const QString& strFileName, std::function<QsciScintilla*()>getCurEdit, NDD_PROC_DATA* procData);
+typedef int (*NDD_PROC_MAIN_CALLBACK)(QWidget* parent, const QString& strFileName, std::function<QsciScintilla*(QWidget*)>getCurEdit, std::function<bool(QWidget* ,int, void*)> pluginCallBack, NDD_PROC_DATA* procData);
 
 int loadProc(const QString& strDirOut, std::function<void(NDD_PROC_DATA&, QMenu*)> funcallback, QMenu* pUserData);

+ 1 - 1
src/plugin/helloworld/helloworld.pro

@@ -1,7 +1,7 @@
 TEMPLATE	= lib
 LANGUAGE	= C++
 
-CONFIG	+= qt warn_on
+CONFIG	+= qt warn_on Release
 QT += core gui widgets
 
 HEADERS	+= *.h

+ 46 - 17
src/plugin/helloworld/helloworldexport.cpp

@@ -4,6 +4,10 @@
 #include <functional>
 #include <qsciscintilla.h>
 #include "qttestclass.h"
+#include "instanceobj.h"
+#ifdef WIN32
+#include <Windows.h>
+#endif
 
 #define NDD_EXPORTDLL
 
@@ -22,8 +26,7 @@
 #endif
 
 	NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
-	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, NDD_PROC_DATA* procData);
-
+	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* (QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> pluginCallBack, NDD_PROC_DATA* procData);
 
 #ifdef __cplusplus
 	}
@@ -31,7 +34,9 @@
 
 static NDD_PROC_DATA s_procData;
 static QWidget* s_pMainNotepad = nullptr;
-std::function<QsciScintilla* ()> s_getCurEdit;
+
+std::function<QsciScintilla* (QWidget*)> s_getCurEdit;
+std::function<bool(QWidget*, int, void*)> s_invokeMainFun;
 
 bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 {
@@ -40,7 +45,7 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 		return false;
 	}
 	pProcData->m_strPlugName = QObject::tr("Hello World Plug");
-	pProcData->m_strComment = QObject::tr("char to Upper.");
+	pProcData->m_strComment = QObject::tr(u8"不需要创建二级菜单的插件例子");
 
 	pProcData->m_version = QString("v1.0");
 	pProcData->m_auther = QString("zuowei.yin");
@@ -54,16 +59,26 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 //pNotepad:就是CCNotepad的主界面指针
 //strFileName:当前插件DLL的全路径,如果不关心,则可以不使用
 //getCurEdit:从NDD主程序传递过来的仿函数,通过该函数获取当前编辑框操作对象QsciScintilla
+//s_invokeMainFun: 可以回调NDD主程序中的功能函数,比如创建新文件功能等,根据需要可实时扩展。
 //pProcData:如果pProcData->m_menuType = 0 ,则该指针为空;如果pProcData->m_menuType = 1,则该指针有值。目前需要关心s_procData.m_rootMenu
 //开发者可以在该菜单下面,自行创建二级菜单
-int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<QsciScintilla*()>getCurEdit, NDD_PROC_DATA* pProcData)
+int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<QsciScintilla*(QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> pluginCallBack, NDD_PROC_DATA* pProcData)
 {
-	QsciScintilla* pEdit = getCurEdit();
-	if (pEdit == nullptr)
+	InstanceObj* pInstanse = nullptr;
+
+	if (pProcData != nullptr)
+	{
+		pInstanse = new InstanceObj(pNotepad);
+		pInstanse->setObjectName("nddplg");
+	}
+	else
 	{
 		return -1;
 	}
 
+	s_getCurEdit = getCurEdit;
+	s_invokeMainFun = pluginCallBack;
+
 	//务必拷贝一份pProcData,在外面会释放。
 	if (pProcData != nullptr)
 	{
@@ -71,17 +86,31 @@ int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<Q
 	}
 
 	s_pMainNotepad = pNotepad;
-	s_getCurEdit = getCurEdit;
 
-	//如果pProcData->m_menuType = 1;是自己要创建二级菜单的场景。则通过s_procData.m_rootMenu 获取该插件的菜单根节点。
-	//插件开发者自行在s_procData.m_rootMenu下添加新的二级菜单项目
-
-
-	//做一个简单的转大写的操作
-	QtTestClass* p = new QtTestClass(pNotepad,pEdit);
-	//主窗口关闭时,子窗口也关闭。避免空指针操作
-	p->setWindowFlag(Qt::Window);
-	p->show();
+	QObject::connect(pProcData->m_pAction, &QAction::triggered, pInstanse, &InstanceObj::doMainWork, Qt::UniqueConnection);
 
 	return 0;
 }
+
+#ifdef WIN32
+BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpvReserved) {
+	switch (fdwReason) {
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+		break;
+	case DLL_THREAD_DETACH:
+		break;
+	case DLL_PROCESS_DETACH:
+		if (NULL == lpvReserved) {
+			//做全局回收工作
+		}
+		break;
+	}
+	return TRUE;
+}
+#else
+void onDllUnload(void)
+{
+	//做全局回收工作
+}
+#endif

+ 31 - 0
src/plugin/helloworld/instanceobj.cpp

@@ -0,0 +1,31 @@
+#include "instanceobj.h"
+#include "qttestclass.h"
+
+#include <qsciscintilla.h>
+#include <QWidget>
+#include <QMenu>
+#include <QMessageBox>
+
+
+InstanceObj::InstanceObj(QWidget* pNotepad) :QObject(pNotepad)
+{
+	m_pNotepad = pNotepad;
+}
+
+InstanceObj::~InstanceObj()
+{
+
+}
+
+
+void InstanceObj::doMainWork()
+{
+	//做一个简单的转大写的操作
+	if (m_pMainToolWin.isNull())
+	{
+		m_pMainToolWin = new QtTestClass(m_pNotepad);
+		m_pMainToolWin->setWindowFlag(Qt::Window);
+		m_pMainToolWin->setAttribute(Qt::WA_DeleteOnClose);
+	}
+	m_pMainToolWin->show();
+}

+ 25 - 0
src/plugin/helloworld/instanceobj.h

@@ -0,0 +1,25 @@
+#pragma once
+#include <QObject>
+#include <QWidget>
+#include <QPointer>
+#include "qttestclass.h"
+
+class QMenu;
+
+class InstanceObj :public QObject
+{
+public:
+	//外面Ndd释放时,会自动释放该对象。
+	InstanceObj(QWidget* pNotepad);
+	~InstanceObj();
+
+public slots:
+	void doMainWork();
+
+public:
+	QWidget* m_pNotepad;
+	QPointer<QtTestClass> m_pMainToolWin;
+private:
+	InstanceObj(const InstanceObj& other) = delete;
+	InstanceObj& operator=(const InstanceObj& other) = delete;
+};

+ 20 - 9
src/plugin/helloworld/qttestclass.cpp

@@ -1,11 +1,14 @@
 #include "qttestclass.h"
 #include <qsciscintilla.h>
 
-QtTestClass::QtTestClass(QWidget *parent, QsciScintilla* pEdit)
-	: QWidget(parent)
+extern std::function<QsciScintilla* (QWidget*)> s_getCurEdit;
+
+
+QtTestClass::QtTestClass(QWidget *parent): QWidget(parent)
 {
 	ui.setupUi(this);
-	m_pEdit = pEdit;
+
+	m_pNotepad = parent;
 }
 
 QtTestClass::~QtTestClass()
@@ -13,18 +16,26 @@ QtTestClass::~QtTestClass()
 
 void QtTestClass::on_upper()
 {
-	QString text = m_pEdit->text();
+	QsciScintilla* pEdit = s_getCurEdit(m_pNotepad);
+	if (pEdit != nullptr)
+	{
+		QString text = pEdit->text();
 
-	text = text.toUpper();
+		text = text.toUpper();
 
-	m_pEdit->setText(text);
+		pEdit->setText(text);
+	}
 }
 
 void QtTestClass::on_lower()
 {
-	QString text = m_pEdit->text();
+	QsciScintilla* pEdit = s_getCurEdit(m_pNotepad);
+	if (pEdit != nullptr)
+	{
+		QString text = pEdit->text();
 
-	text = text.toLower();
+		text = text.toLower();
 
-	m_pEdit->setText(text);
+		pEdit->setText(text);
+	}
 }

+ 3 - 2
src/plugin/helloworld/qttestclass.h

@@ -9,7 +9,7 @@ class QtTestClass : public QWidget
 	Q_OBJECT
 
 public:
-	QtTestClass(QWidget *parent, QsciScintilla* pEdit);
+	QtTestClass(QWidget *parent);
 	~QtTestClass();
 
 private slots:
@@ -17,5 +17,6 @@ private slots:
 	void on_lower();
 private:
 	Ui::QtTestClassClass ui;
-	QsciScintilla* m_pEdit;
+
+	QWidget* m_pNotepad;
 };

+ 10 - 5
src/plugin/test/test.cpp

@@ -4,6 +4,9 @@
 #include <functional>
 #include <qsciscintilla.h>
 #include <QAction>
+#ifdef WIN32
+#include <Windows.h>
+#endif
 
 #define NDD_EXPORTDLL
 
@@ -22,7 +25,7 @@
 #endif
 
 	NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
-	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, NDD_PROC_DATA* procData);
+	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, std::function<bool(int, void*)> pluginCallBack, NDD_PROC_DATA* procData);
 
 #ifdef __cplusplus
 	}
@@ -31,6 +34,7 @@
 static NDD_PROC_DATA s_procData;
 static QWidget* s_pMainNotepad = nullptr;
 std::function<QsciScintilla* ()> s_getCurEdit;
+std::function<bool(int, void*)> s_invokeMainFun;
 
 bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 {
@@ -38,8 +42,8 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 	{
 		return false;
 	}
-	pProcData->m_strPlugName = QObject::tr("Test Plug");
-	pProcData->m_strComment = QObject::tr("char to lower.");
+	pProcData->m_strPlugName = QObject::tr("Create Second Menu Plug");
+	pProcData->m_strComment = QObject::tr(u8"创建二级菜单的插件例子");
 
 	pProcData->m_version = QString("v1.0");
 	pProcData->m_auther = QString("zuowei.yin");
@@ -53,8 +57,9 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
 //strFileName:当前插件DLL的全路径,如果不关心,则可以不使用
 //getCurEdit:从NDD主程序传递过来的仿函数,通过该函数获取当前编辑框操作对象QsciScintilla
 //pProcData:如果pProcData->m_menuType = 0 ,则该指针为空;如果pProcData->m_menuType = 1,则该指针有值。目前需要关心s_procData.m_rootMenu
-//开发者可以在该菜单下面,自行创建二级菜单
-int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, NDD_PROC_DATA* pProcData)
+//s_invokeMainFun: 可以回调NDD主程序中的功能函数,比如创建新文件功能等,根据需要可实时扩展。
+//开发者可以在该菜单下面,自行创建二级菜单.更详细的例子,请见jstool min插件。
+int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, std::function<bool(int, void*)> pluginCallBack, NDD_PROC_DATA* pProcData)
 {
 
 	//务必拷贝一份pProcData,在外面会释放。

+ 4 - 1
src/pluginGl.h

@@ -10,9 +10,12 @@ struct ndd_proc_data
 	QString m_version; //版本号码。可选;插件里面需填写
 	QString m_auther;//作者名称。可选;插件里面需填写
 	int m_menuType;//菜单类型。0:不使用二级菜单 1:创建二级菜单;插件里面需填写
+
 	QMenu* m_rootMenu;//如果m_menuType = 1,给出二级根菜单的地址。其他值nullptr 插件内部不用填写,主程序传递下来
+	QAction* m_pAction;//如果m_menuType = 0,给出一级菜单动作的地址。其他值nullptr 插件内部不用填写,主程序传递下来
+
 
-	ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0)
+	ndd_proc_data(): m_rootMenu(nullptr), m_pAction(nullptr),m_menuType(0)
 	{
 
 	}

+ 4 - 0
src/qscint/scintilla/boostregex/boost/regex/config.hpp

@@ -72,6 +72,10 @@
 
 #  include BOOST_REGEX_USER_CONFIG
 
+#ifdef Q_OS_UNIX
+#define BOOST_REGEX_STANDALONE
+#endif
+
 #ifndef BOOST_REGEX_STANDALONE
 #  include <boost/config.hpp>
 #  include <boost/predef.h>

+ 2087 - 2086
src/qscint/scintilla/include/SciLexer.h

@@ -1,145 +1,145 @@
-/* Scintilla source code edit control */
-/** @file SciLexer.h
- ** Interface to the added lexer functions in the SciLexer version of the edit control.
- **/
-/* Copyright 1998-2002 by Neil Hodgson <[email protected]>
- * The License.txt file describes the conditions under which this software may be distributed. */
-
-/* Most of this file is automatically generated from the Scintilla.iface interface definition
- * file which contains any comments about the definitions. HFacer.py does the generation. */
-
-#ifndef SCILEXER_H
-#define SCILEXER_H
-
-/* SciLexer features - not in standard Scintilla */
-
-/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */
-#define SCLEX_CONTAINER 0
-#define SCLEX_NULL 1
-#define SCLEX_PYTHON 2
-#define SCLEX_CPP 3
-#define SCLEX_HTML 4
-#define SCLEX_XML 5
-#define SCLEX_PERL 6
-#define SCLEX_SQL 7
-#define SCLEX_VB 8
-#define SCLEX_PROPERTIES 9
-#define SCLEX_ERRORLIST 10
-#define SCLEX_MAKEFILE 11
-#define SCLEX_BATCH 12
-#define SCLEX_XCODE 13
-#define SCLEX_LATEX 14
-#define SCLEX_LUA 15
-#define SCLEX_DIFF 16
-#define SCLEX_CONF 17
-#define SCLEX_PASCAL 18
-#define SCLEX_AVE 19
-#define SCLEX_ADA 20
-#define SCLEX_LISP 21
-#define SCLEX_RUBY 22
-#define SCLEX_EIFFEL 23
-#define SCLEX_EIFFELKW 24
-#define SCLEX_TCL 25
-#define SCLEX_NNCRONTAB 26
-#define SCLEX_BULLANT 27
-#define SCLEX_VBSCRIPT 28
-#define SCLEX_BAAN 31
-#define SCLEX_MATLAB 32
-#define SCLEX_SCRIPTOL 33
-#define SCLEX_ASM 34
-#define SCLEX_CPPNOCASE 35
-#define SCLEX_FORTRAN 36
-#define SCLEX_F77 37
-#define SCLEX_CSS 38
-#define SCLEX_POV 39
-#define SCLEX_LOUT 40
-#define SCLEX_ESCRIPT 41
-#define SCLEX_PS 42
-#define SCLEX_NSIS 43
-#define SCLEX_MMIXAL 44
-#define SCLEX_CLW 45
-#define SCLEX_CLWNOCASE 46
-#define SCLEX_LOT 47
-#define SCLEX_YAML 48
-#define SCLEX_TEX 49
-#define SCLEX_METAPOST 50
-#define SCLEX_POWERBASIC 51
-#define SCLEX_FORTH 52
-#define SCLEX_ERLANG 53
-#define SCLEX_OCTAVE 54
-#define SCLEX_MSSQL 55
-#define SCLEX_VERILOG 56
-#define SCLEX_KIX 57
-#define SCLEX_GUI4CLI 58
-#define SCLEX_SPECMAN 59
-#define SCLEX_AU3 60
-#define SCLEX_APDL 61
-#define SCLEX_BASH 62
-#define SCLEX_ASN1 63
-#define SCLEX_VHDL 64
-#define SCLEX_CAML 65
-#define SCLEX_BLITZBASIC 66
-#define SCLEX_PUREBASIC 67
-#define SCLEX_HASKELL 68
-#define SCLEX_PHPSCRIPT 69
-#define SCLEX_TADS3 70
-#define SCLEX_REBOL 71
-#define SCLEX_SMALLTALK 72
-#define SCLEX_FLAGSHIP 73
-#define SCLEX_CSOUND 74
-#define SCLEX_FREEBASIC 75
-#define SCLEX_INNOSETUP 76
-#define SCLEX_OPAL 77
-#define SCLEX_SPICE 78
-#define SCLEX_D 79
-#define SCLEX_CMAKE 80
-#define SCLEX_GAP 81
-#define SCLEX_PLM 82
-#define SCLEX_PROGRESS 83
-#define SCLEX_ABAQUS 84
-#define SCLEX_ASYMPTOTE 85
-#define SCLEX_R 86
-#define SCLEX_MAGIK 87
-#define SCLEX_POWERSHELL 88
-#define SCLEX_MYSQL 89
-#define SCLEX_PO 90
-#define SCLEX_TAL 91
-#define SCLEX_COBOL 92
-#define SCLEX_TACL 93
-#define SCLEX_SORCUS 94
-#define SCLEX_POWERPRO 95
-#define SCLEX_NIMROD 96
-#define SCLEX_SML 97
-#define SCLEX_MARKDOWN 98
-#define SCLEX_TXT2TAGS 99
-#define SCLEX_A68K 100
-#define SCLEX_MODULA 101
-#define SCLEX_COFFEESCRIPT 102
-#define SCLEX_TCMD 103
-#define SCLEX_AVS 104
-#define SCLEX_ECL 105
-#define SCLEX_OSCRIPT 106
-#define SCLEX_VISUALPROLOG 107
-#define SCLEX_LITERATEHASKELL 108
-#define SCLEX_STTXT 109
-#define SCLEX_KVIRC 110
-#define SCLEX_RUST 111
-#define SCLEX_DMAP 112
-#define SCLEX_AS 113
-#define SCLEX_DMIS 114
-#define SCLEX_REGISTRY 115
-#define SCLEX_BIBTEX 116
-#define SCLEX_SREC 117
-#define SCLEX_IHEX 118
-#define SCLEX_TEHEX 119
-#define SCLEX_JSON 120
-#define SCLEX_EDIFACT 121
-#define SCLEX_INDENT 122
-#define SCLEX_MAXIMA 123
-#define SCLEX_STATA 124
+/* Scintilla source code edit control */
+/** @file SciLexer.h
+ ** Interface to the added lexer functions in the SciLexer version of the edit control.
+ **/
+/* Copyright 1998-2002 by Neil Hodgson <[email protected]>
+ * The License.txt file describes the conditions under which this software may be distributed. */
+
+/* Most of this file is automatically generated from the Scintilla.iface interface definition
+ * file which contains any comments about the definitions. HFacer.py does the generation. */
+
+#ifndef SCILEXER_H
+#define SCILEXER_H
+
+/* SciLexer features - not in standard Scintilla */
+
+/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */
+#define SCLEX_CONTAINER 0
+#define SCLEX_NULL 1
+#define SCLEX_PYTHON 2
+#define SCLEX_CPP 3
+#define SCLEX_HTML 4
+#define SCLEX_XML 5
+#define SCLEX_PERL 6
+#define SCLEX_SQL 7
+#define SCLEX_VB 8
+#define SCLEX_PROPERTIES 9
+#define SCLEX_ERRORLIST 10
+#define SCLEX_MAKEFILE 11
+#define SCLEX_BATCH 12
+#define SCLEX_XCODE 13
+#define SCLEX_LATEX 14
+#define SCLEX_LUA 15
+#define SCLEX_DIFF 16
+#define SCLEX_CONF 17
+#define SCLEX_PASCAL 18
+#define SCLEX_AVE 19
+#define SCLEX_ADA 20
+#define SCLEX_LISP 21
+#define SCLEX_RUBY 22
+#define SCLEX_EIFFEL 23
+#define SCLEX_EIFFELKW 24
+#define SCLEX_TCL 25
+#define SCLEX_NNCRONTAB 26
+#define SCLEX_BULLANT 27
+#define SCLEX_VBSCRIPT 28
+#define SCLEX_BAAN 31
+#define SCLEX_MATLAB 32
+#define SCLEX_SCRIPTOL 33
+#define SCLEX_ASM 34
+#define SCLEX_CPPNOCASE 35
+#define SCLEX_FORTRAN 36
+#define SCLEX_F77 37
+#define SCLEX_CSS 38
+#define SCLEX_POV 39
+#define SCLEX_LOUT 40
+#define SCLEX_ESCRIPT 41
+#define SCLEX_PS 42
+#define SCLEX_NSIS 43
+#define SCLEX_MMIXAL 44
+#define SCLEX_CLW 45
+#define SCLEX_CLWNOCASE 46
+#define SCLEX_LOT 47
+#define SCLEX_YAML 48
+#define SCLEX_TEX 49
+#define SCLEX_METAPOST 50
+#define SCLEX_POWERBASIC 51
+#define SCLEX_FORTH 52
+#define SCLEX_ERLANG 53
+#define SCLEX_OCTAVE 54
+#define SCLEX_MSSQL 55
+#define SCLEX_VERILOG 56
+#define SCLEX_KIX 57
+#define SCLEX_GUI4CLI 58
+#define SCLEX_SPECMAN 59
+#define SCLEX_AU3 60
+#define SCLEX_APDL 61
+#define SCLEX_BASH 62
+#define SCLEX_ASN1 63
+#define SCLEX_VHDL 64
+#define SCLEX_CAML 65
+#define SCLEX_BLITZBASIC 66
+#define SCLEX_PUREBASIC 67
+#define SCLEX_HASKELL 68
+#define SCLEX_PHPSCRIPT 69
+#define SCLEX_TADS3 70
+#define SCLEX_REBOL 71
+#define SCLEX_SMALLTALK 72
+#define SCLEX_FLAGSHIP 73
+#define SCLEX_CSOUND 74
+#define SCLEX_FREEBASIC 75
+#define SCLEX_INNOSETUP 76
+#define SCLEX_OPAL 77
+#define SCLEX_SPICE 78
+#define SCLEX_D 79
+#define SCLEX_CMAKE 80
+#define SCLEX_GAP 81
+#define SCLEX_PLM 82
+#define SCLEX_PROGRESS 83
+#define SCLEX_ABAQUS 84
+#define SCLEX_ASYMPTOTE 85
+#define SCLEX_R 86
+#define SCLEX_MAGIK 87
+#define SCLEX_POWERSHELL 88
+#define SCLEX_MYSQL 89
+#define SCLEX_PO 90
+#define SCLEX_TAL 91
+#define SCLEX_COBOL 92
+#define SCLEX_TACL 93
+#define SCLEX_SORCUS 94
+#define SCLEX_POWERPRO 95
+#define SCLEX_NIMROD 96
+#define SCLEX_SML 97
+#define SCLEX_MARKDOWN 98
+#define SCLEX_TXT2TAGS 99
+#define SCLEX_A68K 100
+#define SCLEX_MODULA 101
+#define SCLEX_COFFEESCRIPT 102
+#define SCLEX_TCMD 103
+#define SCLEX_AVS 104
+#define SCLEX_ECL 105
+#define SCLEX_OSCRIPT 106
+#define SCLEX_VISUALPROLOG 107
+#define SCLEX_LITERATEHASKELL 108
+#define SCLEX_STTXT 109
+#define SCLEX_KVIRC 110
+#define SCLEX_RUST 111
+#define SCLEX_DMAP 112
+#define SCLEX_AS 113
+#define SCLEX_DMIS 114
+#define SCLEX_REGISTRY 115
+#define SCLEX_BIBTEX 116
+#define SCLEX_SREC 117
+#define SCLEX_IHEX 118
+#define SCLEX_TEHEX 119
+#define SCLEX_JSON 120
+#define SCLEX_EDIFACT 121
+#define SCLEX_INDENT 122
+#define SCLEX_MAXIMA 123
+#define SCLEX_STATA 124
 #define SCLEX_SAS 125
-#define SCLEX_NIM 126
-#define SCLEX_LPEG 999
+#define SCLEX_NIM 126
+#define SCLEX_LPEG 999
 #define SCLEX_CIL 127
 #define SCLEX_X12 128
 #define SCLEX_DATAFLEX 129
@@ -151,1949 +151,1950 @@
 #define SCLEX__EDIFACT 153
 #define SCLEX_IDL 154
 #define SCLEX_GO 155
-#define SCLEX_TXT 156
+#define SCLEX_TXT 156
+#define SCLEX_LOG 157
+#define SCLEX_GCode 158
+#define SCLEX_AUTOMATIC 1000
+
+
+
+//For All lexer
+#define SCE_UNIVERSAL_FOUND_STYLE 31
+#define SCE_UNIVERSAL_FOUND_STYLE_SMART 29
+#define SCE_UNIVERSAL_FOUND_STYLE_INC 28
+#define SCE_UNIVERSAL_TAGMATCH 27
+#define SCE_UNIVERSAL_TAGATTR 26
+#define SCE_UNIVERSAL_FOUND_STYLE_EXT1 25
+#define SCE_UNIVERSAL_FOUND_STYLE_EXT2 24
+#define SCE_UNIVERSAL_FOUND_STYLE_EXT3 23
+#define SCE_UNIVERSAL_FOUND_STYLE_EXT4 22
+#define SCE_UNIVERSAL_FOUND_STYLE_EXT5 21
+
+#define SCE_UDL_VERSION_MAJOR       2
+#define SCE_UDL_VERSION_MINOR       1
+#define SCE_UDL_VERSION_BUILD       0
+#define SCE_UDL_VERSION_REVISION    12
+
+#define SCE_USER_KWLIST_COMMENTS                    0
+#define SCE_USER_KWLIST_NUMBER_PREFIX1              1
+#define SCE_USER_KWLIST_NUMBER_PREFIX2              2
+#define SCE_USER_KWLIST_NUMBER_EXTRAS1              3
+#define SCE_USER_KWLIST_NUMBER_EXTRAS2              4
+#define SCE_USER_KWLIST_NUMBER_SUFFIX1              5
+#define SCE_USER_KWLIST_NUMBER_SUFFIX2              6
+#define SCE_USER_KWLIST_NUMBER_RANGE                7
+#define SCE_USER_KWLIST_OPERATORS1                  8
+#define SCE_USER_KWLIST_OPERATORS2                  9
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_OPEN       10
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_MIDDLE     11
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_CLOSE      12
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_OPEN       13
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_MIDDLE     14
+#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_CLOSE      15
+#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_OPEN     16
+#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_MIDDLE   17
+#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_CLOSE    18
+#define SCE_USER_KWLIST_KEYWORDS1                   19
+#define SCE_USER_KWLIST_KEYWORDS2                   20
+#define SCE_USER_KWLIST_KEYWORDS3                   21
+#define SCE_USER_KWLIST_KEYWORDS4                   22
+#define SCE_USER_KWLIST_KEYWORDS5                   23
+#define SCE_USER_KWLIST_KEYWORDS6                   24
+#define SCE_USER_KWLIST_KEYWORDS7                   25
+#define SCE_USER_KWLIST_KEYWORDS8                   26
+#define SCE_USER_KWLIST_DELIMITERS                  27
+#define SCE_USER_KWLIST_TOTAL                       28  // must always be <= KEYWORDSET_MAX
+
+#define SCE_USER_TOTAL_DELIMITERS           8
+#define SCE_USER_TOTAL_KEYWORD_GROUPS       8
+#define SCE_USER_TOTAL_FOLDERS              6
+
+#define SCE_USER_STYLE_DEFAULT              0
+#define SCE_USER_STYLE_COMMENT              1
+#define SCE_USER_STYLE_COMMENTLINE          2
+#define SCE_USER_STYLE_NUMBER               3
+#define SCE_USER_STYLE_KEYWORD1             4
+#define SCE_USER_STYLE_KEYWORD2             5
+#define SCE_USER_STYLE_KEYWORD3             6
+#define SCE_USER_STYLE_KEYWORD4             7
+#define SCE_USER_STYLE_KEYWORD5             8
+#define SCE_USER_STYLE_KEYWORD6             9
+#define SCE_USER_STYLE_KEYWORD7             10
+#define SCE_USER_STYLE_KEYWORD8             11
+#define SCE_USER_STYLE_OPERATOR             12
+#define SCE_USER_STYLE_FOLDER_IN_CODE1      13
+#define SCE_USER_STYLE_FOLDER_IN_CODE2      14
+#define SCE_USER_STYLE_FOLDER_IN_COMMENT    15
+#define SCE_USER_STYLE_DELIMITER1           16
+#define SCE_USER_STYLE_DELIMITER2           17
+#define SCE_USER_STYLE_DELIMITER3           18
+#define SCE_USER_STYLE_DELIMITER4           19
+#define SCE_USER_STYLE_DELIMITER5           20
+#define SCE_USER_STYLE_DELIMITER6           21
+#define SCE_USER_STYLE_DELIMITER7           22
+#define SCE_USER_STYLE_DELIMITER8           23
+#define SCE_USER_STYLE_IDENTIFIER           24
+#define SCE_USER_STYLE_TOTAL_STYLES         SCE_USER_STYLE_IDENTIFIER
+#define SCE_USER_STYLE_MAPPER_TOTAL         17
+
+#define SCE_USER_MASK_NESTING_NONE                          0
+#define SCE_USER_MASK_NESTING_DELIMITER1                    0x1
+#define SCE_USER_MASK_NESTING_DELIMITER2                    0x2
+#define SCE_USER_MASK_NESTING_DELIMITER3                    0x4
+#define SCE_USER_MASK_NESTING_DELIMITER4                    0x8
+#define SCE_USER_MASK_NESTING_DELIMITER5                    0x10
+#define SCE_USER_MASK_NESTING_DELIMITER6                    0x20
+#define SCE_USER_MASK_NESTING_DELIMITER7                    0x40
+#define SCE_USER_MASK_NESTING_DELIMITER8                    0x80
+#define SCE_USER_MASK_NESTING_COMMENT                       0x100
+#define SCE_USER_MASK_NESTING_COMMENT_LINE                  0x200
+#define SCE_USER_MASK_NESTING_KEYWORD1                      0x400
+#define SCE_USER_MASK_NESTING_KEYWORD2                      0x800
+#define SCE_USER_MASK_NESTING_KEYWORD3                      0x1000
+#define SCE_USER_MASK_NESTING_KEYWORD4                      0x2000
+#define SCE_USER_MASK_NESTING_KEYWORD5                      0x4000
+#define SCE_USER_MASK_NESTING_KEYWORD6                      0x8000
+#define SCE_USER_MASK_NESTING_KEYWORD7                      0x10000
+#define SCE_USER_MASK_NESTING_KEYWORD8                      0x20000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_OPEN         0x40000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_MIDDLE       0x80000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_CLOSE        0x100000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_OPEN       0x200000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_MIDDLE     0x400000
+#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_CLOSE      0x800000
+#define SCE_USER_MASK_NESTING_OPERATORS1                    0x1000000
+#define SCE_USER_MASK_NESTING_OPERATORS2                    0x2000000
+#define SCE_USER_MASK_NESTING_NUMBERS                       0x4000000
+
+#define SCE_TXT_DEFAULT 0
+#define SCE_TXT_ASCII 1
+#define SCE_TXT_KEYWORD 2
+#define SCE_TXT_IDENTIFIER 4
+
+#define SCE_P_DEFAULT 0
+#define SCE_P_COMMENTLINE 1
+#define SCE_P_NUMBER 2
+#define SCE_P_STRING 3
+#define SCE_P_CHARACTER 4
+#define SCE_P_WORD 5
+#define SCE_P_TRIPLE 6
+#define SCE_P_TRIPLEDOUBLE 7
+#define SCE_P_CLASSNAME 8
+#define SCE_P_DEFNAME 9
+#define SCE_P_OPERATOR 10
+#define SCE_P_IDENTIFIER 11
+#define SCE_P_COMMENTBLOCK 12
+#define SCE_P_STRINGEOL 13
+#define SCE_P_WORD2 14
+#define SCE_P_DECORATOR 15
+#define SCE_P_FSTRING 16
+#define SCE_P_FCHARACTER 17
+#define SCE_P_FTRIPLE 18
+#define SCE_P_FTRIPLEDOUBLE 19
+#define SCE_C_DEFAULT 0
+#define SCE_C_COMMENT 1
+#define SCE_C_COMMENTLINE 2
+#define SCE_C_COMMENTDOC 3
+#define SCE_C_NUMBER 4
+#define SCE_C_WORD 5
+#define SCE_C_STRING 6
+#define SCE_C_CHARACTER 7
+#define SCE_C_UUID 8
+#define SCE_C_PREPROCESSOR 9
+#define SCE_C_OPERATOR 10
+#define SCE_C_IDENTIFIER 11
+#define SCE_C_STRINGEOL 12
+#define SCE_C_VERBATIM 13
+#define SCE_C_REGEX 14
+#define SCE_C_COMMENTLINEDOC 15
+#define SCE_C_WORD2 16
+#define SCE_C_COMMENTDOCKEYWORD 17
+#define SCE_C_COMMENTDOCKEYWORDERROR 18
+#define SCE_C_GLOBALCLASS 19
+#define SCE_C_STRINGRAW 20
+#define SCE_C_TRIPLEVERBATIM 21
+#define SCE_C_HASHQUOTEDSTRING 22
+#define SCE_C_PREPROCESSORCOMMENT 23
+#define SCE_C_PREPROCESSORCOMMENTDOC 24
+#define SCE_C_USERLITERAL 25
+#define SCE_C_TASKMARKER 26
+#define SCE_C_ESCAPESEQUENCE 27
+#define SCE_D_DEFAULT 0
+#define SCE_D_COMMENT 1
+#define SCE_D_COMMENTLINE 2
+#define SCE_D_COMMENTDOC 3
+#define SCE_D_COMMENTNESTED 4
+#define SCE_D_NUMBER 5
+#define SCE_D_WORD 6
+#define SCE_D_WORD2 7
+#define SCE_D_WORD3 8
+#define SCE_D_TYPEDEF 9
+#define SCE_D_STRING 10
+#define SCE_D_STRINGEOL 11
+#define SCE_D_CHARACTER 12
+#define SCE_D_OPERATOR 13
+#define SCE_D_IDENTIFIER 14
+#define SCE_D_COMMENTLINEDOC 15
+#define SCE_D_COMMENTDOCKEYWORD 16
+#define SCE_D_COMMENTDOCKEYWORDERROR 17
+#define SCE_D_STRINGB 18
+#define SCE_D_STRINGR 19
+#define SCE_D_WORD5 20
+#define SCE_D_WORD6 21
+#define SCE_D_WORD7 22
+
+#define SCE_SEARCHRESULT_DEFAULT 0
+#define SCE_SEARCHRESULT_SEARCH_HEADER 1
+#define SCE_SEARCHRESULT_FILE_HEADER 2
+#define SCE_SEARCHRESULT_LINE_NUMBER 3
+#define SCE_SEARCHRESULT_WORD2SEARCH 4
+//#define SCE_SEARCHRESULT_HIGHLIGHT_LINE 5 // (no use anymore)
+#define SCE_SEARCHRESULT_CURRENT_LINE 6
+#define SCE_OBJC_DIRECTIVE 20
+#define SCE_OBJC_QUALIFIER 21
+
+#define SCE_TCL_DEFAULT 0
+#define SCE_TCL_COMMENT 1
+#define SCE_TCL_COMMENTLINE 2
+#define SCE_TCL_NUMBER 3
+#define SCE_TCL_WORD_IN_QUOTE 4
+#define SCE_TCL_IN_QUOTE 5
+#define SCE_TCL_OPERATOR 6
+#define SCE_TCL_IDENTIFIER 7
+#define SCE_TCL_SUBSTITUTION 8
+#define SCE_TCL_SUB_BRACE 9
+#define SCE_TCL_MODIFIER 10
+#define SCE_TCL_EXPAND 11
+#define SCE_TCL_WORD 12
+#define SCE_TCL_WORD2 13
+#define SCE_TCL_WORD3 14
+#define SCE_TCL_WORD4 15
+#define SCE_TCL_WORD5 16
+#define SCE_TCL_WORD6 17
+#define SCE_TCL_WORD7 18
+#define SCE_TCL_WORD8 19
+#define SCE_TCL_COMMENT_BOX 20
+#define SCE_TCL_BLOCK_COMMENT 21
+#define SCE_H_DEFAULT 0
+#define SCE_H_TAG 1
+#define SCE_H_TAGUNKNOWN 2
+#define SCE_H_ATTRIBUTE 3
+#define SCE_H_ATTRIBUTEUNKNOWN 4
+#define SCE_H_NUMBER 5
+#define SCE_H_DOUBLESTRING 6
+#define SCE_H_SINGLESTRING 7
+#define SCE_H_OTHER 8
+#define SCE_H_COMMENT 9
+#define SCE_H_ENTITY 10
+#define SCE_H_TAGEND 11
+#define SCE_H_XMLSTART 12
+#define SCE_H_XMLEND 13
+#define SCE_H_SCRIPT 14
+#define SCE_H_ASP 15
+#define SCE_H_ASPAT 16
+#define SCE_H_CDATA 17
+#define SCE_H_QUESTION 18
+#define SCE_H_VALUE 19
+#define SCE_H_XCCOMMENT 20
+#define SCE_H_SGML_DEFAULT 21
+#define SCE_H_SGML_COMMAND 22
+#define SCE_H_SGML_1ST_PARAM 23
+#define SCE_H_SGML_DOUBLESTRING 24
+#define SCE_H_SGML_SIMPLESTRING 25
+#define SCE_H_SGML_ERROR 26
+#define SCE_H_SGML_SPECIAL 27
+#define SCE_H_SGML_ENTITY 28
+#define SCE_H_SGML_COMMENT 29
+#define SCE_H_SGML_1ST_PARAM_COMMENT 30
+#define SCE_H_SGML_BLOCK_DEFAULT 31
+#define SCE_HJ_START 40
+#define SCE_HJ_DEFAULT 41
+#define SCE_HJ_COMMENT 42
+#define SCE_HJ_COMMENTLINE 43
+#define SCE_HJ_COMMENTDOC 44
+#define SCE_HJ_NUMBER 45
+#define SCE_HJ_WORD 46
+#define SCE_HJ_KEYWORD 47
+#define SCE_HJ_DOUBLESTRING 48
+#define SCE_HJ_SINGLESTRING 49
+#define SCE_HJ_SYMBOLS 50
+#define SCE_HJ_STRINGEOL 51
+#define SCE_HJ_REGEX 52
+#define SCE_HJA_START 55
+#define SCE_HJA_DEFAULT 56
+#define SCE_HJA_COMMENT 57
+#define SCE_HJA_COMMENTLINE 58
+#define SCE_HJA_COMMENTDOC 59
+#define SCE_HJA_NUMBER 60
+#define SCE_HJA_WORD 61
+#define SCE_HJA_KEYWORD 62
+#define SCE_HJA_DOUBLESTRING 63
+#define SCE_HJA_SINGLESTRING 64
+#define SCE_HJA_SYMBOLS 65
+#define SCE_HJA_STRINGEOL 66
+#define SCE_HJA_REGEX 67
+#define SCE_HB_START 70
+#define SCE_HB_DEFAULT 71
+#define SCE_HB_COMMENTLINE 72
+#define SCE_HB_NUMBER 73
+#define SCE_HB_WORD 74
+#define SCE_HB_STRING 75
+#define SCE_HB_IDENTIFIER 76
+#define SCE_HB_STRINGEOL 77
+#define SCE_HBA_START 80
+#define SCE_HBA_DEFAULT 81
+#define SCE_HBA_COMMENTLINE 82
+#define SCE_HBA_NUMBER 83
+#define SCE_HBA_WORD 84
+#define SCE_HBA_STRING 85
+#define SCE_HBA_IDENTIFIER 86
+#define SCE_HBA_STRINGEOL 87
+#define SCE_HP_START 90
+#define SCE_HP_DEFAULT 91
+#define SCE_HP_COMMENTLINE 92
+#define SCE_HP_NUMBER 93
+#define SCE_HP_STRING 94
+#define SCE_HP_CHARACTER 95
+#define SCE_HP_WORD 96
+#define SCE_HP_TRIPLE 97
+#define SCE_HP_TRIPLEDOUBLE 98
+#define SCE_HP_CLASSNAME 99
+#define SCE_HP_DEFNAME 100
+#define SCE_HP_OPERATOR 101
+#define SCE_HP_IDENTIFIER 102
+#define SCE_HPHP_COMPLEX_VARIABLE 104
+#define SCE_HPA_START 105
+#define SCE_HPA_DEFAULT 106
+#define SCE_HPA_COMMENTLINE 107
+#define SCE_HPA_NUMBER 108
+#define SCE_HPA_STRING 109
+#define SCE_HPA_CHARACTER 110
+#define SCE_HPA_WORD 111
+#define SCE_HPA_TRIPLE 112
+#define SCE_HPA_TRIPLEDOUBLE 113
+#define SCE_HPA_CLASSNAME 114
+#define SCE_HPA_DEFNAME 115
+#define SCE_HPA_OPERATOR 116
+#define SCE_HPA_IDENTIFIER 117
+#define SCE_HPHP_DEFAULT 118
+#define SCE_HPHP_HSTRING 119
+#define SCE_HPHP_SIMPLESTRING 120
+#define SCE_HPHP_WORD 121
+#define SCE_HPHP_NUMBER 122
+#define SCE_HPHP_VARIABLE 123
+#define SCE_HPHP_COMMENT 124
+#define SCE_HPHP_COMMENTLINE 125
+#define SCE_HPHP_HSTRING_VARIABLE 126
+#define SCE_HPHP_OPERATOR 127
+#define SCE_PL_DEFAULT 0
+#define SCE_PL_ERROR 1
+#define SCE_PL_COMMENTLINE 2
+#define SCE_PL_POD 3
+#define SCE_PL_NUMBER 4
+#define SCE_PL_WORD 5
+#define SCE_PL_STRING 6
+#define SCE_PL_CHARACTER 7
+#define SCE_PL_PUNCTUATION 8
+#define SCE_PL_PREPROCESSOR 9
+#define SCE_PL_OPERATOR 10
+#define SCE_PL_IDENTIFIER 11
+#define SCE_PL_SCALAR 12
+#define SCE_PL_ARRAY 13
+#define SCE_PL_HASH 14
+#define SCE_PL_SYMBOLTABLE 15
+#define SCE_PL_VARIABLE_INDEXER 16
+#define SCE_PL_REGEX 17
+#define SCE_PL_REGSUBST 18
+#define SCE_PL_LONGQUOTE 19
+#define SCE_PL_BACKTICKS 20
+#define SCE_PL_DATASECTION 21
+#define SCE_PL_HERE_DELIM 22
+#define SCE_PL_HERE_Q 23
+#define SCE_PL_HERE_QQ 24
+#define SCE_PL_HERE_QX 25
+#define SCE_PL_STRING_Q 26
+#define SCE_PL_STRING_QQ 27
+#define SCE_PL_STRING_QX 28
+#define SCE_PL_STRING_QR 29
+#define SCE_PL_STRING_QW 30
+#define SCE_PL_POD_VERB 31
+#define SCE_PL_SUB_PROTOTYPE 40
+#define SCE_PL_FORMAT_IDENT 41
+#define SCE_PL_FORMAT 42
+#define SCE_PL_STRING_VAR 43
+#define SCE_PL_XLAT 44
+#define SCE_PL_REGEX_VAR 54
+#define SCE_PL_REGSUBST_VAR 55
+#define SCE_PL_BACKTICKS_VAR 57
+#define SCE_PL_HERE_QQ_VAR 61
+#define SCE_PL_HERE_QX_VAR 62
+#define SCE_PL_STRING_QQ_VAR 64
+#define SCE_PL_STRING_QX_VAR 65
+#define SCE_PL_STRING_QR_VAR 66
+#define SCE_RB_DEFAULT 0
+#define SCE_RB_ERROR 1
+#define SCE_RB_COMMENTLINE 2
+#define SCE_RB_POD 3
+#define SCE_RB_NUMBER 4
+#define SCE_RB_WORD 5
+#define SCE_RB_STRING 6
+#define SCE_RB_CHARACTER 7
+#define SCE_RB_CLASSNAME 8
+#define SCE_RB_DEFNAME 9
+#define SCE_RB_OPERATOR 10
+#define SCE_RB_IDENTIFIER 11
+#define SCE_RB_REGEX 12
+#define SCE_RB_GLOBAL 13
+#define SCE_RB_SYMBOL 14
+#define SCE_RB_MODULE_NAME 15
+#define SCE_RB_INSTANCE_VAR 16
+#define SCE_RB_CLASS_VAR 17
+#define SCE_RB_BACKTICKS 18
+#define SCE_RB_DATASECTION 19
+#define SCE_RB_HERE_DELIM 20
+#define SCE_RB_HERE_Q 21
+#define SCE_RB_HERE_QQ 22
+#define SCE_RB_HERE_QX 23
+#define SCE_RB_STRING_Q 24
+#define SCE_RB_STRING_QQ 25
+#define SCE_RB_STRING_QX 26
+#define SCE_RB_STRING_QR 27
+#define SCE_RB_STRING_QW 28
+#define SCE_RB_WORD_DEMOTED 29
+#define SCE_RB_STDIN 30
+#define SCE_RB_STDOUT 31
+#define SCE_RB_STDERR 40
+#define SCE_RB_UPPER_BOUND 41
+#define SCE_B_DEFAULT 0
+#define SCE_B_COMMENT 1
+#define SCE_B_NUMBER 2
+#define SCE_B_KEYWORD 3
+#define SCE_B_STRING 4
+#define SCE_B_PREPROCESSOR 5
+#define SCE_B_OPERATOR 6
+#define SCE_B_IDENTIFIER 7
+#define SCE_B_DATE 8
+#define SCE_B_STRINGEOL 9
+#define SCE_B_KEYWORD2 10
+#define SCE_B_KEYWORD3 11
+#define SCE_B_KEYWORD4 12
+#define SCE_B_CONSTANT 13
+#define SCE_B_ASM 14
+#define SCE_B_LABEL 15
+#define SCE_B_ERROR 16
+#define SCE_B_HEXNUMBER 17
+#define SCE_B_BINNUMBER 18
+#define SCE_B_COMMENTBLOCK 19
+#define SCE_B_DOCLINE 20
+#define SCE_B_DOCBLOCK 21
+#define SCE_B_DOCKEYWORD 22
+#define SCE_PROPS_DEFAULT 0
+#define SCE_PROPS_COMMENT 1
+#define SCE_PROPS_SECTION 2
+#define SCE_PROPS_ASSIGNMENT 3
+#define SCE_PROPS_DEFVAL 4
+#define SCE_PROPS_KEY 5
+#define SCE_L_DEFAULT 0
+#define SCE_L_COMMAND 1
+#define SCE_L_TAG 2
+#define SCE_L_MATH 3
+#define SCE_L_COMMENT 4
+#define SCE_L_TAG2 5
+#define SCE_L_MATH2 6
+#define SCE_L_COMMENT2 7
+#define SCE_L_VERBATIM 8
+#define SCE_L_SHORTCMD 9
+#define SCE_L_SPECIAL 10
+#define SCE_L_CMDOPT 11
+#define SCE_L_ERROR 12
+#define SCE_LUA_DEFAULT 0
+#define SCE_LUA_COMMENT 1
+#define SCE_LUA_COMMENTLINE 2
+#define SCE_LUA_COMMENTDOC 3
+#define SCE_LUA_NUMBER 4
+#define SCE_LUA_WORD 5
+#define SCE_LUA_STRING 6
+#define SCE_LUA_CHARACTER 7
+#define SCE_LUA_LITERALSTRING 8
+#define SCE_LUA_PREPROCESSOR 9
+#define SCE_LUA_OPERATOR 10
+#define SCE_LUA_IDENTIFIER 11
+#define SCE_LUA_STRINGEOL 12
+#define SCE_LUA_WORD2 13
+#define SCE_LUA_WORD3 14
+#define SCE_LUA_WORD4 15
+#define SCE_LUA_WORD5 16
+#define SCE_LUA_WORD6 17
+#define SCE_LUA_WORD7 18
+#define SCE_LUA_WORD8 19
+#define SCE_LUA_LABEL 20
+#define SCE_ERR_DEFAULT 0
+#define SCE_ERR_PYTHON 1
+#define SCE_ERR_GCC 2
+#define SCE_ERR_MS 3
+#define SCE_ERR_CMD 4
+#define SCE_ERR_BORLAND 5
+#define SCE_ERR_PERL 6
+#define SCE_ERR_NET 7
+#define SCE_ERR_LUA 8
+#define SCE_ERR_CTAG 9
+#define SCE_ERR_DIFF_CHANGED 10
+#define SCE_ERR_DIFF_ADDITION 11
+#define SCE_ERR_DIFF_DELETION 12
+#define SCE_ERR_DIFF_MESSAGE 13
+#define SCE_ERR_PHP 14
+#define SCE_ERR_ELF 15
+#define SCE_ERR_IFC 16
+#define SCE_ERR_IFORT 17
+#define SCE_ERR_ABSF 18
+#define SCE_ERR_TIDY 19
+#define SCE_ERR_JAVA_STACK 20
+#define SCE_ERR_VALUE 21
+#define SCE_ERR_GCC_INCLUDED_FROM 22
+#define SCE_ERR_ESCSEQ 23
+#define SCE_ERR_ESCSEQ_UNKNOWN 24
+#define SCE_ERR_GCC_EXCERPT 25
+#define SCE_ERR_ES_BLACK 40
+#define SCE_ERR_ES_RED 41
+#define SCE_ERR_ES_GREEN 42
+#define SCE_ERR_ES_BROWN 43
+#define SCE_ERR_ES_BLUE 44
+#define SCE_ERR_ES_MAGENTA 45
+#define SCE_ERR_ES_CYAN 46
+#define SCE_ERR_ES_GRAY 47
+#define SCE_ERR_ES_DARK_GRAY 48
+#define SCE_ERR_ES_BRIGHT_RED 49
+#define SCE_ERR_ES_BRIGHT_GREEN 50
+#define SCE_ERR_ES_YELLOW 51
+#define SCE_ERR_ES_BRIGHT_BLUE 52
+#define SCE_ERR_ES_BRIGHT_MAGENTA 53
+#define SCE_ERR_ES_BRIGHT_CYAN 54
+#define SCE_ERR_ES_WHITE 55
+#define SCE_BAT_DEFAULT 0
+#define SCE_BAT_COMMENT 1
+#define SCE_BAT_WORD 2
+#define SCE_BAT_LABEL 3
+#define SCE_BAT_HIDE 4
+#define SCE_BAT_COMMAND 5
+#define SCE_BAT_IDENTIFIER 6
+#define SCE_BAT_OPERATOR 7
+#define SCE_TCMD_DEFAULT 0
+#define SCE_TCMD_COMMENT 1
+#define SCE_TCMD_WORD 2
+#define SCE_TCMD_LABEL 3
+#define SCE_TCMD_HIDE 4
+#define SCE_TCMD_COMMAND 5
+#define SCE_TCMD_IDENTIFIER 6
+#define SCE_TCMD_OPERATOR 7
+#define SCE_TCMD_ENVIRONMENT 8
+#define SCE_TCMD_EXPANSION 9
+#define SCE_TCMD_CLABEL 10
+#define SCE_MAKE_DEFAULT 0
+#define SCE_MAKE_COMMENT 1
+#define SCE_MAKE_PREPROCESSOR 2
+#define SCE_MAKE_IDENTIFIER 3
+#define SCE_MAKE_OPERATOR 4
+#define SCE_MAKE_TARGET 5
+#define SCE_MAKE_IDEOL 9
+#define SCE_DIFF_DEFAULT 0
+#define SCE_DIFF_COMMENT 1
+#define SCE_DIFF_COMMAND 2
+#define SCE_DIFF_HEADER 3
+#define SCE_DIFF_POSITION 4
+#define SCE_DIFF_DELETED 5
+#define SCE_DIFF_ADDED 6
+#define SCE_DIFF_CHANGED 7
+#define SCE_DIFF_PATCH_ADD 8
+#define SCE_DIFF_PATCH_DELETE 9
+#define SCE_DIFF_REMOVED_PATCH_ADD 10
+#define SCE_DIFF_REMOVED_PATCH_DELETE 11
+#define SCE_CONF_DEFAULT 0
+#define SCE_CONF_COMMENT 1
+#define SCE_CONF_NUMBER 2
+#define SCE_CONF_IDENTIFIER 3
+#define SCE_CONF_EXTENSION 4
+#define SCE_CONF_PARAMETER 5
+#define SCE_CONF_STRING 6
+#define SCE_CONF_OPERATOR 7
+#define SCE_CONF_IP 8
+#define SCE_CONF_DIRECTIVE 9
+#define SCE_AVE_DEFAULT 0
+#define SCE_AVE_COMMENT 1
+#define SCE_AVE_NUMBER 2
+#define SCE_AVE_WORD 3
+#define SCE_AVE_STRING 6
+#define SCE_AVE_ENUM 7
+#define SCE_AVE_STRINGEOL 8
+#define SCE_AVE_IDENTIFIER 9
+#define SCE_AVE_OPERATOR 10
+#define SCE_AVE_WORD1 11
+#define SCE_AVE_WORD2 12
+#define SCE_AVE_WORD3 13
+#define SCE_AVE_WORD4 14
+#define SCE_AVE_WORD5 15
+#define SCE_AVE_WORD6 16
+#define SCE_ADA_DEFAULT 0
+#define SCE_ADA_WORD 1
+#define SCE_ADA_IDENTIFIER 2
+#define SCE_ADA_NUMBER 3
+#define SCE_ADA_DELIMITER 4
+#define SCE_ADA_CHARACTER 5
+#define SCE_ADA_CHARACTEREOL 6
+#define SCE_ADA_STRING 7
+#define SCE_ADA_STRINGEOL 8
+#define SCE_ADA_LABEL 9
+#define SCE_ADA_COMMENTLINE 10
+#define SCE_ADA_ILLEGAL 11
+#define SCE_BAAN_DEFAULT 0
+#define SCE_BAAN_COMMENT 1
+#define SCE_BAAN_COMMENTDOC 2
+#define SCE_BAAN_NUMBER 3
+#define SCE_BAAN_WORD 4
+#define SCE_BAAN_STRING 5
+#define SCE_BAAN_PREPROCESSOR 6
+#define SCE_BAAN_OPERATOR 7
+#define SCE_BAAN_IDENTIFIER 8
+#define SCE_BAAN_STRINGEOL 9
+#define SCE_BAAN_WORD2 10
+#define SCE_BAAN_WORD3 11
+#define SCE_BAAN_WORD4 12
+#define SCE_BAAN_WORD5 13
+#define SCE_BAAN_WORD6 14
+#define SCE_BAAN_WORD7 15
+#define SCE_BAAN_WORD8 16
+#define SCE_BAAN_WORD9 17
+#define SCE_BAAN_TABLEDEF 18
+#define SCE_BAAN_TABLESQL 19
+#define SCE_BAAN_FUNCTION 20
+#define SCE_BAAN_DOMDEF 21
+#define SCE_BAAN_FUNCDEF 22
+#define SCE_BAAN_OBJECTDEF 23
+#define SCE_BAAN_DEFINEDEF 24
+#define SCE_LISP_DEFAULT 0
+#define SCE_LISP_COMMENT 1
+#define SCE_LISP_NUMBER 2
+#define SCE_LISP_KEYWORD 3
+#define SCE_LISP_KEYWORD_KW 4
+#define SCE_LISP_SYMBOL 5
+#define SCE_LISP_STRING 6
+#define SCE_LISP_STRINGEOL 8
+#define SCE_LISP_IDENTIFIER 9
+#define SCE_LISP_OPERATOR 10
+#define SCE_LISP_SPECIAL 11
+#define SCE_LISP_MULTI_COMMENT 12
+#define SCE_EIFFEL_DEFAULT 0
+#define SCE_EIFFEL_COMMENTLINE 1
+#define SCE_EIFFEL_NUMBER 2
+#define SCE_EIFFEL_WORD 3
+#define SCE_EIFFEL_STRING 4
+#define SCE_EIFFEL_CHARACTER 5
+#define SCE_EIFFEL_OPERATOR 6
+#define SCE_EIFFEL_IDENTIFIER 7
+#define SCE_EIFFEL_STRINGEOL 8
+#define SCE_NNCRONTAB_DEFAULT 0
+#define SCE_NNCRONTAB_COMMENT 1
+#define SCE_NNCRONTAB_TASK 2
+#define SCE_NNCRONTAB_SECTION 3
+#define SCE_NNCRONTAB_KEYWORD 4
+#define SCE_NNCRONTAB_MODIFIER 5
+#define SCE_NNCRONTAB_ASTERISK 6
+#define SCE_NNCRONTAB_NUMBER 7
+#define SCE_NNCRONTAB_STRING 8
+#define SCE_NNCRONTAB_ENVIRONMENT 9
+#define SCE_NNCRONTAB_IDENTIFIER 10
+#define SCE_FORTH_DEFAULT 0
+#define SCE_FORTH_COMMENT 1
+#define SCE_FORTH_COMMENT_ML 2
+#define SCE_FORTH_IDENTIFIER 3
+#define SCE_FORTH_CONTROL 4
+#define SCE_FORTH_KEYWORD 5
+#define SCE_FORTH_DEFWORD 6
+#define SCE_FORTH_PREWORD1 7
+#define SCE_FORTH_PREWORD2 8
+#define SCE_FORTH_NUMBER 9
+#define SCE_FORTH_STRING 10
+#define SCE_FORTH_LOCALE 11
+#define SCE_MATLAB_DEFAULT 0
+#define SCE_MATLAB_COMMENT 1
+#define SCE_MATLAB_COMMAND 2
+#define SCE_MATLAB_NUMBER 3
+#define SCE_MATLAB_KEYWORD 4
+#define SCE_MATLAB_STRING 5
+#define SCE_MATLAB_OPERATOR 6
+#define SCE_MATLAB_IDENTIFIER 7
+#define SCE_MATLAB_DOUBLEQUOTESTRING 8
+#define SCE_MAXIMA_OPERATOR 0
+#define SCE_MAXIMA_COMMANDENDING 1
+#define SCE_MAXIMA_COMMENT 2
+#define SCE_MAXIMA_NUMBER 3
+#define SCE_MAXIMA_STRING 4
+#define SCE_MAXIMA_COMMAND 5
+#define SCE_MAXIMA_VARIABLE 6
+#define SCE_MAXIMA_UNKNOWN 7
+#define SCE_SCRIPTOL_DEFAULT 0
+#define SCE_SCRIPTOL_WHITE 1
+#define SCE_SCRIPTOL_COMMENTLINE 2
+#define SCE_SCRIPTOL_PERSISTENT 3
+#define SCE_SCRIPTOL_CSTYLE 4
+#define SCE_SCRIPTOL_COMMENTBLOCK 5
+#define SCE_SCRIPTOL_NUMBER 6
+#define SCE_SCRIPTOL_STRING 7
+#define SCE_SCRIPTOL_CHARACTER 8
+#define SCE_SCRIPTOL_STRINGEOL 9
+#define SCE_SCRIPTOL_KEYWORD 10
+#define SCE_SCRIPTOL_OPERATOR 11
+#define SCE_SCRIPTOL_IDENTIFIER 12
+#define SCE_SCRIPTOL_TRIPLE 13
+#define SCE_SCRIPTOL_CLASSNAME 14
+#define SCE_SCRIPTOL_PREPROCESSOR 15
+#define SCE_ASM_DEFAULT 0
+#define SCE_ASM_COMMENT 1
+#define SCE_ASM_NUMBER 2
+#define SCE_ASM_STRING 3
+#define SCE_ASM_OPERATOR 4
+#define SCE_ASM_IDENTIFIER 5
+#define SCE_ASM_CPUINSTRUCTION 6
+#define SCE_ASM_MATHINSTRUCTION 7
+#define SCE_ASM_REGISTER 8
+#define SCE_ASM_DIRECTIVE 9
+#define SCE_ASM_DIRECTIVEOPERAND 10
+#define SCE_ASM_COMMENTBLOCK 11
+#define SCE_ASM_CHARACTER 12
+#define SCE_ASM_STRINGEOL 13
+#define SCE_ASM_EXTINSTRUCTION 14
+#define SCE_ASM_COMMENTDIRECTIVE 15
+#define SCE_F_DEFAULT 0
+#define SCE_F_COMMENT 1
+#define SCE_F_NUMBER 2
+#define SCE_F_STRING1 3
+#define SCE_F_STRING2 4
+#define SCE_F_STRINGEOL 5
+#define SCE_F_OPERATOR 6
+#define SCE_F_IDENTIFIER 7
+#define SCE_F_WORD 8
+#define SCE_F_WORD2 9
+#define SCE_F_WORD3 10
+#define SCE_F_PREPROCESSOR 11
+#define SCE_F_OPERATOR2 12
+#define SCE_F_LABEL 13
+#define SCE_F_CONTINUATION 14
+#define SCE_CSS_DEFAULT 0
+#define SCE_CSS_TAG 1
+#define SCE_CSS_CLASS 2
+#define SCE_CSS_PSEUDOCLASS 3
+#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4
+#define SCE_CSS_OPERATOR 5
+#define SCE_CSS_IDENTIFIER 6
+#define SCE_CSS_UNKNOWN_IDENTIFIER 7
+#define SCE_CSS_VALUE 8
+#define SCE_CSS_COMMENT 9
+#define SCE_CSS_ID 10
+#define SCE_CSS_IMPORTANT 11
+#define SCE_CSS_DIRECTIVE 12
+#define SCE_CSS_DOUBLESTRING 13
+#define SCE_CSS_SINGLESTRING 14
+#define SCE_CSS_IDENTIFIER2 15
+#define SCE_CSS_ATTRIBUTE 16
+#define SCE_CSS_IDENTIFIER3 17
+#define SCE_CSS_PSEUDOELEMENT 18
+#define SCE_CSS_EXTENDED_IDENTIFIER 19
+#define SCE_CSS_EXTENDED_PSEUDOCLASS 20
+#define SCE_CSS_EXTENDED_PSEUDOELEMENT 21
+#define SCE_CSS_MEDIA 22
+#define SCE_CSS_VARIABLE 23
+#define SCE_POV_DEFAULT 0
+#define SCE_POV_COMMENT 1
+#define SCE_POV_COMMENTLINE 2
+#define SCE_POV_NUMBER 3
+#define SCE_POV_OPERATOR 4
+#define SCE_POV_IDENTIFIER 5
+#define SCE_POV_STRING 6
+#define SCE_POV_STRINGEOL 7
+#define SCE_POV_DIRECTIVE 8
+#define SCE_POV_BADDIRECTIVE 9
+#define SCE_POV_WORD2 10
+#define SCE_POV_WORD3 11
+#define SCE_POV_WORD4 12
+#define SCE_POV_WORD5 13
+#define SCE_POV_WORD6 14
+#define SCE_POV_WORD7 15
+#define SCE_POV_WORD8 16
+#define SCE_LOUT_DEFAULT 0
+#define SCE_LOUT_COMMENT 1
+#define SCE_LOUT_NUMBER 2
+#define SCE_LOUT_WORD 3
+#define SCE_LOUT_WORD2 4
+#define SCE_LOUT_WORD3 5
+#define SCE_LOUT_WORD4 6
+#define SCE_LOUT_STRING 7
+#define SCE_LOUT_OPERATOR 8
+#define SCE_LOUT_IDENTIFIER 9
+#define SCE_LOUT_STRINGEOL 10
+#define SCE_ESCRIPT_DEFAULT 0
+#define SCE_ESCRIPT_COMMENT 1
+#define SCE_ESCRIPT_COMMENTLINE 2
+#define SCE_ESCRIPT_COMMENTDOC 3
+#define SCE_ESCRIPT_NUMBER 4
+#define SCE_ESCRIPT_WORD 5
+#define SCE_ESCRIPT_STRING 6
+#define SCE_ESCRIPT_OPERATOR 7
+#define SCE_ESCRIPT_IDENTIFIER 8
+#define SCE_ESCRIPT_BRACE 9
+#define SCE_ESCRIPT_WORD2 10
+#define SCE_ESCRIPT_WORD3 11
+#define SCE_PS_DEFAULT 0
+#define SCE_PS_COMMENT 1
+#define SCE_PS_DSC_COMMENT 2
+#define SCE_PS_DSC_VALUE 3
+#define SCE_PS_NUMBER 4
+#define SCE_PS_NAME 5
+#define SCE_PS_KEYWORD 6
+#define SCE_PS_LITERAL 7
+#define SCE_PS_IMMEVAL 8
+#define SCE_PS_PAREN_ARRAY 9
+#define SCE_PS_PAREN_DICT 10
+#define SCE_PS_PAREN_PROC 11
+#define SCE_PS_TEXT 12
+#define SCE_PS_HEXSTRING 13
+#define SCE_PS_BASE85STRING 14
+#define SCE_PS_BADSTRINGCHAR 15
+#define SCE_NSIS_DEFAULT 0
+#define SCE_NSIS_COMMENT 1
+#define SCE_NSIS_STRINGDQ 2
+#define SCE_NSIS_STRINGLQ 3
+#define SCE_NSIS_STRINGRQ 4
+#define SCE_NSIS_FUNCTION 5
+#define SCE_NSIS_VARIABLE 6
+#define SCE_NSIS_LABEL 7
+#define SCE_NSIS_USERDEFINED 8
+#define SCE_NSIS_SECTIONDEF 9
+#define SCE_NSIS_SUBSECTIONDEF 10
+#define SCE_NSIS_IFDEFINEDEF 11
+#define SCE_NSIS_MACRODEF 12
+#define SCE_NSIS_STRINGVAR 13
+#define SCE_NSIS_NUMBER 14
+#define SCE_NSIS_SECTIONGROUP 15
+#define SCE_NSIS_PAGEEX 16
+#define SCE_NSIS_FUNCTIONDEF 17
+#define SCE_NSIS_COMMENTBOX 18
+#define SCE_MMIXAL_LEADWS 0
+#define SCE_MMIXAL_COMMENT 1
+#define SCE_MMIXAL_LABEL 2
+#define SCE_MMIXAL_OPCODE 3
+#define SCE_MMIXAL_OPCODE_PRE 4
+#define SCE_MMIXAL_OPCODE_VALID 5
+#define SCE_MMIXAL_OPCODE_UNKNOWN 6
+#define SCE_MMIXAL_OPCODE_POST 7
+#define SCE_MMIXAL_OPERANDS 8
+#define SCE_MMIXAL_NUMBER 9
+#define SCE_MMIXAL_REF 10
+#define SCE_MMIXAL_CHAR 11
+#define SCE_MMIXAL_STRING 12
+#define SCE_MMIXAL_REGISTER 13
+#define SCE_MMIXAL_HEX 14
+#define SCE_MMIXAL_OPERATOR 15
+#define SCE_MMIXAL_SYMBOL 16
+#define SCE_MMIXAL_INCLUDE 17
+#define SCE_CLW_DEFAULT 0
+#define SCE_CLW_LABEL 1
+#define SCE_CLW_COMMENT 2
+#define SCE_CLW_STRING 3
+#define SCE_CLW_USER_IDENTIFIER 4
+#define SCE_CLW_INTEGER_CONSTANT 5
+#define SCE_CLW_REAL_CONSTANT 6
+#define SCE_CLW_PICTURE_STRING 7
+#define SCE_CLW_KEYWORD 8
+#define SCE_CLW_COMPILER_DIRECTIVE 9
+#define SCE_CLW_RUNTIME_EXPRESSIONS 10
+#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11
+#define SCE_CLW_STRUCTURE_DATA_TYPE 12
+#define SCE_CLW_ATTRIBUTE 13
+#define SCE_CLW_STANDARD_EQUATE 14
+#define SCE_CLW_ERROR 15
+#define SCE_CLW_DEPRECATED 16
+#define SCE_LOT_DEFAULT 0
+#define SCE_LOT_HEADER 1
+#define SCE_LOT_BREAK 2
+#define SCE_LOT_SET 3
+#define SCE_LOT_PASS 4
+#define SCE_LOT_FAIL 5
+#define SCE_LOT_ABORT 6
+#define SCE_YAML_DEFAULT 0
+#define SCE_YAML_COMMENT 1
+#define SCE_YAML_IDENTIFIER 2
+#define SCE_YAML_KEYWORD 3
+#define SCE_YAML_NUMBER 4
+#define SCE_YAML_REFERENCE 5
+#define SCE_YAML_DOCUMENT 6
+#define SCE_YAML_TEXT 7
+#define SCE_YAML_ERROR 8
+#define SCE_YAML_OPERATOR 9
+#define SCE_TEX_DEFAULT 0
+#define SCE_TEX_SPECIAL 1
+#define SCE_TEX_GROUP 2
+#define SCE_TEX_SYMBOL 3
+#define SCE_TEX_COMMAND 4
+#define SCE_TEX_TEXT 5
+#define SCE_METAPOST_DEFAULT 0
+#define SCE_METAPOST_SPECIAL 1
+#define SCE_METAPOST_GROUP 2
+#define SCE_METAPOST_SYMBOL 3
+#define SCE_METAPOST_COMMAND 4
+#define SCE_METAPOST_TEXT 5
+#define SCE_METAPOST_EXTRA 6
+#define SCE_ERLANG_DEFAULT 0
+#define SCE_ERLANG_COMMENT 1
+#define SCE_ERLANG_VARIABLE 2
+#define SCE_ERLANG_NUMBER 3
+#define SCE_ERLANG_KEYWORD 4
+#define SCE_ERLANG_STRING 5
+#define SCE_ERLANG_OPERATOR 6
+#define SCE_ERLANG_ATOM 7
+#define SCE_ERLANG_FUNCTION_NAME 8
+#define SCE_ERLANG_CHARACTER 9
+#define SCE_ERLANG_MACRO 10
+#define SCE_ERLANG_RECORD 11
+#define SCE_ERLANG_PREPROC 12
+#define SCE_ERLANG_NODE_NAME 13
+#define SCE_ERLANG_COMMENT_FUNCTION 14
+#define SCE_ERLANG_COMMENT_MODULE 15
+#define SCE_ERLANG_COMMENT_DOC 16
+#define SCE_ERLANG_COMMENT_DOC_MACRO 17
+#define SCE_ERLANG_ATOM_QUOTED 18
+#define SCE_ERLANG_MACRO_QUOTED 19
+#define SCE_ERLANG_RECORD_QUOTED 20
+#define SCE_ERLANG_NODE_NAME_QUOTED 21
+#define SCE_ERLANG_BIFS 22
+#define SCE_ERLANG_MODULES 23
+#define SCE_ERLANG_MODULES_ATT 24
+#define SCE_ERLANG_UNKNOWN 31
+#define SCE_MSSQL_DEFAULT 0
+#define SCE_MSSQL_COMMENT 1
+#define SCE_MSSQL_LINE_COMMENT 2
+#define SCE_MSSQL_NUMBER 3
+#define SCE_MSSQL_STRING 4
+#define SCE_MSSQL_OPERATOR 5
+#define SCE_MSSQL_IDENTIFIER 6
+#define SCE_MSSQL_VARIABLE 7
+#define SCE_MSSQL_COLUMN_NAME 8
+#define SCE_MSSQL_STATEMENT 9
+#define SCE_MSSQL_DATATYPE 10
+#define SCE_MSSQL_SYSTABLE 11
+#define SCE_MSSQL_GLOBAL_VARIABLE 12
+#define SCE_MSSQL_FUNCTION 13
+#define SCE_MSSQL_STORED_PROCEDURE 14
+#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
+#define SCE_MSSQL_COLUMN_NAME_2 16
+#define SCE_V_DEFAULT 0
+#define SCE_V_COMMENT 1
+#define SCE_V_COMMENTLINE 2
+#define SCE_V_COMMENTLINEBANG 3
+#define SCE_V_NUMBER 4
+#define SCE_V_WORD 5
+#define SCE_V_STRING 6
+#define SCE_V_WORD2 7
+#define SCE_V_WORD3 8
+#define SCE_V_PREPROCESSOR 9
+#define SCE_V_OPERATOR 10
+#define SCE_V_IDENTIFIER 11
+#define SCE_V_STRINGEOL 12
+#define SCE_V_USER 19
+#define SCE_V_COMMENT_WORD 20
+#define SCE_V_INPUT 21
+#define SCE_V_OUTPUT 22
+#define SCE_V_INOUT 23
+#define SCE_V_PORT_CONNECT 24
+#define SCE_KIX_DEFAULT 0
+#define SCE_KIX_COMMENT 1
+#define SCE_KIX_STRING1 2
+#define SCE_KIX_STRING2 3
+#define SCE_KIX_NUMBER 4
+#define SCE_KIX_VAR 5
+#define SCE_KIX_MACRO 6
+#define SCE_KIX_KEYWORD 7
+#define SCE_KIX_FUNCTIONS 8
+#define SCE_KIX_OPERATOR 9
+#define SCE_KIX_COMMENTSTREAM 10
+#define SCE_KIX_IDENTIFIER 31
+#define SCE_GC_DEFAULT 0
+#define SCE_GC_COMMENTLINE 1
+#define SCE_GC_COMMENTBLOCK 2
+#define SCE_GC_GLOBAL 3
+#define SCE_GC_EVENT 4
+#define SCE_GC_ATTRIBUTE 5
+#define SCE_GC_CONTROL 6
+#define SCE_GC_COMMAND 7
+#define SCE_GC_STRING 8
+#define SCE_GC_OPERATOR 9
+#define SCE_SN_DEFAULT 0
+#define SCE_SN_CODE 1
+#define SCE_SN_COMMENTLINE 2
+#define SCE_SN_COMMENTLINEBANG 3
+#define SCE_SN_NUMBER 4
+#define SCE_SN_WORD 5
+#define SCE_SN_STRING 6
+#define SCE_SN_WORD2 7
+#define SCE_SN_WORD3 8
+#define SCE_SN_PREPROCESSOR 9
+#define SCE_SN_OPERATOR 10
+#define SCE_SN_IDENTIFIER 11
+#define SCE_SN_STRINGEOL 12
+#define SCE_SN_REGEXTAG 13
+#define SCE_SN_SIGNAL 14
+#define SCE_SN_USER 19
+#define SCE_AU3_DEFAULT 0
+#define SCE_AU3_COMMENT 1
+#define SCE_AU3_COMMENTBLOCK 2
+#define SCE_AU3_NUMBER 3
+#define SCE_AU3_FUNCTION 4
+#define SCE_AU3_KEYWORD 5
+#define SCE_AU3_MACRO 6
+#define SCE_AU3_STRING 7
+#define SCE_AU3_OPERATOR 8
+#define SCE_AU3_VARIABLE 9
+#define SCE_AU3_SENT 10
+#define SCE_AU3_PREPROCESSOR 11
+#define SCE_AU3_SPECIAL 12
+#define SCE_AU3_EXPAND 13
+#define SCE_AU3_COMOBJ 14
+#define SCE_AU3_UDF 15
+#define SCE_APDL_DEFAULT 0
+#define SCE_APDL_COMMENT 1
+#define SCE_APDL_COMMENTBLOCK 2
+#define SCE_APDL_NUMBER 3
+#define SCE_APDL_STRING 4
+#define SCE_APDL_OPERATOR 5
+#define SCE_APDL_WORD 6
+#define SCE_APDL_PROCESSOR 7
+#define SCE_APDL_COMMAND 8
+#define SCE_APDL_SLASHCOMMAND 9
+#define SCE_APDL_STARCOMMAND 10
+#define SCE_APDL_ARGUMENT 11
+#define SCE_APDL_FUNCTION 12
+#define SCE_SH_DEFAULT 0
+#define SCE_SH_ERROR 1
+#define SCE_SH_COMMENTLINE 2
+#define SCE_SH_NUMBER 3
+#define SCE_SH_WORD 4
+#define SCE_SH_STRING 5
+#define SCE_SH_CHARACTER 6
+#define SCE_SH_OPERATOR 7
+#define SCE_SH_IDENTIFIER 8
+#define SCE_SH_SCALAR 9
+#define SCE_SH_PARAM 10
+#define SCE_SH_BACKTICKS 11
+#define SCE_SH_HERE_DELIM 12
+#define SCE_SH_HERE_Q 13
+#define SCE_ASN1_DEFAULT 0
+#define SCE_ASN1_COMMENT 1
+#define SCE_ASN1_IDENTIFIER 2
+#define SCE_ASN1_STRING 3
+#define SCE_ASN1_OID 4
+#define SCE_ASN1_SCALAR 5
+#define SCE_ASN1_KEYWORD 6
+#define SCE_ASN1_ATTRIBUTE 7
+#define SCE_ASN1_DESCRIPTOR 8
+#define SCE_ASN1_TYPE 9
+#define SCE_ASN1_OPERATOR 10
+#define SCE_VHDL_DEFAULT 0
+#define SCE_VHDL_COMMENT 1
+#define SCE_VHDL_COMMENTLINEBANG 2
+#define SCE_VHDL_NUMBER 3
+#define SCE_VHDL_STRING 4
+#define SCE_VHDL_OPERATOR 5
+#define SCE_VHDL_IDENTIFIER 6
+#define SCE_VHDL_STRINGEOL 7
+#define SCE_VHDL_KEYWORD 8
+#define SCE_VHDL_STDOPERATOR 9
+#define SCE_VHDL_ATTRIBUTE 10
+#define SCE_VHDL_STDFUNCTION 11
+#define SCE_VHDL_STDPACKAGE 12
+#define SCE_VHDL_STDTYPE 13
+#define SCE_VHDL_USERWORD 14
+#define SCE_VHDL_BLOCK_COMMENT 15
+#define SCE_CAML_DEFAULT 0
+#define SCE_CAML_IDENTIFIER 1
+#define SCE_CAML_TAGNAME 2
+#define SCE_CAML_KEYWORD 3
+#define SCE_CAML_KEYWORD2 4
+#define SCE_CAML_KEYWORD3 5
+#define SCE_CAML_LINENUM 6
+#define SCE_CAML_OPERATOR 7
+#define SCE_CAML_NUMBER 8
+#define SCE_CAML_CHAR 9
+#define SCE_CAML_WHITE 10
+#define SCE_CAML_STRING 11
+#define SCE_CAML_COMMENT 12
+#define SCE_CAML_COMMENT1 13
+#define SCE_CAML_COMMENT2 14
+#define SCE_CAML_COMMENT3 15
+#define SCE_HA_DEFAULT 0
+#define SCE_HA_IDENTIFIER 1
+#define SCE_HA_KEYWORD 2
+#define SCE_HA_NUMBER 3
+#define SCE_HA_STRING 4
+#define SCE_HA_CHARACTER 5
+#define SCE_HA_CLASS 6
+#define SCE_HA_MODULE 7
+#define SCE_HA_CAPITAL 8
+#define SCE_HA_DATA 9
+#define SCE_HA_IMPORT 10
+#define SCE_HA_OPERATOR 11
+#define SCE_HA_INSTANCE 12
+#define SCE_HA_COMMENTLINE 13
+#define SCE_HA_COMMENTBLOCK 14
+#define SCE_HA_COMMENTBLOCK2 15
+#define SCE_HA_COMMENTBLOCK3 16
+#define SCE_HA_PRAGMA 17
+#define SCE_HA_PREPROCESSOR 18
+#define SCE_HA_STRINGEOL 19
+#define SCE_HA_RESERVED_OPERATOR 20
+#define SCE_HA_LITERATE_COMMENT 21
+#define SCE_HA_LITERATE_CODEDELIM 22
+#define SCE_T3_DEFAULT 0
+#define SCE_T3_X_DEFAULT 1
+#define SCE_T3_PREPROCESSOR 2
+#define SCE_T3_BLOCK_COMMENT 3
+#define SCE_T3_LINE_COMMENT 4
+#define SCE_T3_OPERATOR 5
+#define SCE_T3_KEYWORD 6
+#define SCE_T3_NUMBER 7
+#define SCE_T3_IDENTIFIER 8
+#define SCE_T3_S_STRING 9
+#define SCE_T3_D_STRING 10
+#define SCE_T3_X_STRING 11
+#define SCE_T3_LIB_DIRECTIVE 12
+#define SCE_T3_MSG_PARAM 13
+#define SCE_T3_HTML_TAG 14
+#define SCE_T3_HTML_DEFAULT 15
+#define SCE_T3_HTML_STRING 16
+#define SCE_T3_USER1 17
+#define SCE_T3_USER2 18
+#define SCE_T3_USER3 19
+#define SCE_T3_BRACE 20
+#define SCE_REBOL_DEFAULT 0
+#define SCE_REBOL_COMMENTLINE 1
+#define SCE_REBOL_COMMENTBLOCK 2
+#define SCE_REBOL_PREFACE 3
+#define SCE_REBOL_OPERATOR 4
+#define SCE_REBOL_CHARACTER 5
+#define SCE_REBOL_QUOTEDSTRING 6
+#define SCE_REBOL_BRACEDSTRING 7
+#define SCE_REBOL_NUMBER 8
+#define SCE_REBOL_PAIR 9
+#define SCE_REBOL_TUPLE 10
+#define SCE_REBOL_BINARY 11
+#define SCE_REBOL_MONEY 12
+#define SCE_REBOL_ISSUE 13
+#define SCE_REBOL_TAG 14
+#define SCE_REBOL_FILE 15
+#define SCE_REBOL_EMAIL 16
+#define SCE_REBOL_URL 17
+#define SCE_REBOL_DATE 18
+#define SCE_REBOL_TIME 19
+#define SCE_REBOL_IDENTIFIER 20
+#define SCE_REBOL_WORD 21
+#define SCE_REBOL_WORD2 22
+#define SCE_REBOL_WORD3 23
+#define SCE_REBOL_WORD4 24
+#define SCE_REBOL_WORD5 25
+#define SCE_REBOL_WORD6 26
+#define SCE_REBOL_WORD7 27
+#define SCE_REBOL_WORD8 28
+#define SCE_SQL_DEFAULT 0
+#define SCE_SQL_COMMENT 1
+#define SCE_SQL_COMMENTLINE 2
+#define SCE_SQL_COMMENTDOC 3
+#define SCE_SQL_NUMBER 4
+#define SCE_SQL_WORD 5
+#define SCE_SQL_STRING 6
+#define SCE_SQL_CHARACTER 7
+#define SCE_SQL_SQLPLUS 8
+#define SCE_SQL_SQLPLUS_PROMPT 9
+#define SCE_SQL_OPERATOR 10
+#define SCE_SQL_IDENTIFIER 11
+#define SCE_SQL_SQLPLUS_COMMENT 13
+#define SCE_SQL_COMMENTLINEDOC 15
+#define SCE_SQL_WORD2 16
+#define SCE_SQL_COMMENTDOCKEYWORD 17
+#define SCE_SQL_COMMENTDOCKEYWORDERROR 18
+#define SCE_SQL_USER1 19
+#define SCE_SQL_USER2 20
+#define SCE_SQL_USER3 21
+#define SCE_SQL_USER4 22
+#define SCE_SQL_QUOTEDIDENTIFIER 23
+#define SCE_SQL_QOPERATOR 24
+#define SCE_ST_DEFAULT 0
+#define SCE_ST_STRING 1
+#define SCE_ST_NUMBER 2
+#define SCE_ST_COMMENT 3
+#define SCE_ST_SYMBOL 4
+#define SCE_ST_BINARY 5
+#define SCE_ST_BOOL 6
+#define SCE_ST_SELF 7
+#define SCE_ST_SUPER 8
+#define SCE_ST_NIL 9
+#define SCE_ST_GLOBAL 10
+#define SCE_ST_RETURN 11
+#define SCE_ST_SPECIAL 12
+#define SCE_ST_KWSEND 13
+#define SCE_ST_ASSIGN 14
+#define SCE_ST_CHARACTER 15
+#define SCE_ST_SPEC_SEL 16
+#define SCE_FS_DEFAULT 0
+#define SCE_FS_COMMENT 1
+#define SCE_FS_COMMENTLINE 2
+#define SCE_FS_COMMENTDOC 3
+#define SCE_FS_COMMENTLINEDOC 4
+#define SCE_FS_COMMENTDOCKEYWORD 5
+#define SCE_FS_COMMENTDOCKEYWORDERROR 6
+#define SCE_FS_KEYWORD 7
+#define SCE_FS_KEYWORD2 8
+#define SCE_FS_KEYWORD3 9
+#define SCE_FS_KEYWORD4 10
+#define SCE_FS_NUMBER 11
+#define SCE_FS_STRING 12
+#define SCE_FS_PREPROCESSOR 13
+#define SCE_FS_OPERATOR 14
+#define SCE_FS_IDENTIFIER 15
+#define SCE_FS_DATE 16
+#define SCE_FS_STRINGEOL 17
+#define SCE_FS_CONSTANT 18
+#define SCE_FS_WORDOPERATOR 19
+#define SCE_FS_DISABLEDCODE 20
+#define SCE_FS_DEFAULT_C 21
+#define SCE_FS_COMMENTDOC_C 22
+#define SCE_FS_COMMENTLINEDOC_C 23
+#define SCE_FS_KEYWORD_C 24
+#define SCE_FS_KEYWORD2_C 25
+#define SCE_FS_NUMBER_C 26
+#define SCE_FS_STRING_C 27
+#define SCE_FS_PREPROCESSOR_C 28
+#define SCE_FS_OPERATOR_C 29
+#define SCE_FS_IDENTIFIER_C 30
+#define SCE_FS_STRINGEOL_C 31
+#define SCE_CSOUND_DEFAULT 0
+#define SCE_CSOUND_COMMENT 1
+#define SCE_CSOUND_NUMBER 2
+#define SCE_CSOUND_OPERATOR 3
+#define SCE_CSOUND_INSTR 4
+#define SCE_CSOUND_IDENTIFIER 5
+#define SCE_CSOUND_OPCODE 6
+#define SCE_CSOUND_HEADERSTMT 7
+#define SCE_CSOUND_USERKEYWORD 8
+#define SCE_CSOUND_COMMENTBLOCK 9
+#define SCE_CSOUND_PARAM 10
+#define SCE_CSOUND_ARATE_VAR 11
+#define SCE_CSOUND_KRATE_VAR 12
+#define SCE_CSOUND_IRATE_VAR 13
+#define SCE_CSOUND_GLOBAL_VAR 14
+#define SCE_CSOUND_STRINGEOL 15
+#define SCE_INNO_DEFAULT 0
+#define SCE_INNO_COMMENT 1
+#define SCE_INNO_KEYWORD 2
+#define SCE_INNO_PARAMETER 3
+#define SCE_INNO_SECTION 4
+#define SCE_INNO_PREPROC 5
+#define SCE_INNO_INLINE_EXPANSION 6
+#define SCE_INNO_COMMENT_PASCAL 7
+#define SCE_INNO_KEYWORD_PASCAL 8
+#define SCE_INNO_KEYWORD_USER 9
+#define SCE_INNO_STRING_DOUBLE 10
+#define SCE_INNO_STRING_SINGLE 11
+#define SCE_INNO_IDENTIFIER 12
+#define SCE_OPAL_SPACE 0
+#define SCE_OPAL_COMMENT_BLOCK 1
+#define SCE_OPAL_COMMENT_LINE 2
+#define SCE_OPAL_INTEGER 3
+#define SCE_OPAL_KEYWORD 4
+#define SCE_OPAL_SORT 5
+#define SCE_OPAL_STRING 6
+#define SCE_OPAL_PAR 7
+#define SCE_OPAL_BOOL_CONST 8
+#define SCE_OPAL_DEFAULT 32
+#define SCE_SPICE_DEFAULT 0
+#define SCE_SPICE_IDENTIFIER 1
+#define SCE_SPICE_KEYWORD 2
+#define SCE_SPICE_KEYWORD2 3
+#define SCE_SPICE_KEYWORD3 4
+#define SCE_SPICE_NUMBER 5
+#define SCE_SPICE_DELIMITER 6
+#define SCE_SPICE_VALUE 7
+#define SCE_SPICE_COMMENTLINE 8
+#define SCE_CMAKE_DEFAULT 0
+#define SCE_CMAKE_COMMENT 1
+#define SCE_CMAKE_STRINGDQ 2
+#define SCE_CMAKE_STRINGLQ 3
+#define SCE_CMAKE_STRINGRQ 4
+#define SCE_CMAKE_COMMANDS 5
+#define SCE_CMAKE_PARAMETERS 6
+#define SCE_CMAKE_VARIABLE 7
+#define SCE_CMAKE_USERDEFINED 8
+#define SCE_CMAKE_WHILEDEF 9
+#define SCE_CMAKE_FOREACHDEF 10
+#define SCE_CMAKE_IFDEFINEDEF 11
+#define SCE_CMAKE_MACRODEF 12
+#define SCE_CMAKE_STRINGVAR 13
+#define SCE_CMAKE_NUMBER 14
+#define SCE_GAP_DEFAULT 0
+#define SCE_GAP_IDENTIFIER 1
+#define SCE_GAP_KEYWORD 2
+#define SCE_GAP_KEYWORD2 3
+#define SCE_GAP_KEYWORD3 4
+#define SCE_GAP_KEYWORD4 5
+#define SCE_GAP_STRING 6
+#define SCE_GAP_CHAR 7
+#define SCE_GAP_OPERATOR 8
+#define SCE_GAP_COMMENT 9
+#define SCE_GAP_NUMBER 10
+#define SCE_GAP_STRINGEOL 11
+#define SCE_PLM_DEFAULT 0
+#define SCE_PLM_COMMENT 1
+#define SCE_PLM_STRING 2
+#define SCE_PLM_NUMBER 3
+#define SCE_PLM_IDENTIFIER 4
+#define SCE_PLM_OPERATOR 5
+#define SCE_PLM_CONTROL 6
+#define SCE_PLM_KEYWORD 7
+#define SCE_ABL_DEFAULT 0
+#define SCE_ABL_NUMBER 1
+#define SCE_ABL_WORD 2
+#define SCE_ABL_STRING 3
+#define SCE_ABL_CHARACTER 4
+#define SCE_ABL_PREPROCESSOR 5
+#define SCE_ABL_OPERATOR 6
+#define SCE_ABL_IDENTIFIER 7
+#define SCE_ABL_BLOCK 8
+#define SCE_ABL_END 9
+#define SCE_ABL_COMMENT 10
+#define SCE_ABL_TASKMARKER 11
+#define SCE_ABL_LINECOMMENT 12
+#define SCE_ABAQUS_DEFAULT 0
+#define SCE_ABAQUS_COMMENT 1
+#define SCE_ABAQUS_COMMENTBLOCK 2
+#define SCE_ABAQUS_NUMBER 3
+#define SCE_ABAQUS_STRING 4
+#define SCE_ABAQUS_OPERATOR 5
+#define SCE_ABAQUS_WORD 6
+#define SCE_ABAQUS_PROCESSOR 7
+#define SCE_ABAQUS_COMMAND 8
+#define SCE_ABAQUS_SLASHCOMMAND 9
+#define SCE_ABAQUS_STARCOMMAND 10
+#define SCE_ABAQUS_ARGUMENT 11
+#define SCE_ABAQUS_FUNCTION 12
+#define SCE_ASY_DEFAULT 0
+#define SCE_ASY_COMMENT 1
+#define SCE_ASY_COMMENTLINE 2
+#define SCE_ASY_NUMBER 3
+#define SCE_ASY_WORD 4
+#define SCE_ASY_STRING 5
+#define SCE_ASY_CHARACTER 6
+#define SCE_ASY_OPERATOR 7
+#define SCE_ASY_IDENTIFIER 8
+#define SCE_ASY_STRINGEOL 9
+#define SCE_ASY_COMMENTLINEDOC 10
+#define SCE_ASY_WORD2 11
+#define SCE_R_DEFAULT 0
+#define SCE_R_COMMENT 1
+#define SCE_R_KWORD 2
+#define SCE_R_BASEKWORD 3
+#define SCE_R_OTHERKWORD 4
+#define SCE_R_NUMBER 5
+#define SCE_R_STRING 6
+#define SCE_R_STRING2 7
+#define SCE_R_OPERATOR 8
+#define SCE_R_IDENTIFIER 9
+#define SCE_R_INFIX 10
+#define SCE_R_INFIXEOL 11
+#define SCE_MAGIK_DEFAULT 0
+#define SCE_MAGIK_COMMENT 1
+#define SCE_MAGIK_HYPER_COMMENT 16
+#define SCE_MAGIK_STRING 2
+#define SCE_MAGIK_CHARACTER 3
+#define SCE_MAGIK_NUMBER 4
+#define SCE_MAGIK_IDENTIFIER 5
+#define SCE_MAGIK_OPERATOR 6
+#define SCE_MAGIK_FLOW 7
+#define SCE_MAGIK_CONTAINER 8
+#define SCE_MAGIK_BRACKET_BLOCK 9
+#define SCE_MAGIK_BRACE_BLOCK 10
+#define SCE_MAGIK_SQBRACKET_BLOCK 11
+#define SCE_MAGIK_UNKNOWN_KEYWORD 12
+#define SCE_MAGIK_KEYWORD 13
+#define SCE_MAGIK_PRAGMA 14
+#define SCE_MAGIK_SYMBOL 15
+#define SCE_POWERSHELL_DEFAULT 0
+#define SCE_POWERSHELL_COMMENT 1
+#define SCE_POWERSHELL_STRING 2
+#define SCE_POWERSHELL_CHARACTER 3
+#define SCE_POWERSHELL_NUMBER 4
+#define SCE_POWERSHELL_VARIABLE 5
+#define SCE_POWERSHELL_OPERATOR 6
+#define SCE_POWERSHELL_IDENTIFIER 7
+#define SCE_POWERSHELL_KEYWORD 8
+#define SCE_POWERSHELL_CMDLET 9
+#define SCE_POWERSHELL_ALIAS 10
+#define SCE_POWERSHELL_FUNCTION 11
+#define SCE_POWERSHELL_USER1 12
+#define SCE_POWERSHELL_COMMENTSTREAM 13
+#define SCE_POWERSHELL_HERE_STRING 14
+#define SCE_POWERSHELL_HERE_CHARACTER 15
+#define SCE_POWERSHELL_COMMENTDOCKEYWORD 16
+#define SCE_MYSQL_DEFAULT 0
+#define SCE_MYSQL_COMMENT 1
+#define SCE_MYSQL_COMMENTLINE 2
+#define SCE_MYSQL_VARIABLE 3
+#define SCE_MYSQL_SYSTEMVARIABLE 4
+#define SCE_MYSQL_KNOWNSYSTEMVARIABLE 5
+#define SCE_MYSQL_NUMBER 6
+#define SCE_MYSQL_MAJORKEYWORD 7
+#define SCE_MYSQL_KEYWORD 8
+#define SCE_MYSQL_DATABASEOBJECT 9
+#define SCE_MYSQL_PROCEDUREKEYWORD 10
+#define SCE_MYSQL_STRING 11
+#define SCE_MYSQL_SQSTRING 12
+#define SCE_MYSQL_DQSTRING 13
+#define SCE_MYSQL_OPERATOR 14
+#define SCE_MYSQL_FUNCTION 15
+#define SCE_MYSQL_IDENTIFIER 16
+#define SCE_MYSQL_QUOTEDIDENTIFIER 17
+#define SCE_MYSQL_USER1 18
+#define SCE_MYSQL_USER2 19
+#define SCE_MYSQL_USER3 20
+#define SCE_MYSQL_HIDDENCOMMAND 21
+#define SCE_MYSQL_PLACEHOLDER 22
+#define SCE_PO_DEFAULT 0
+#define SCE_PO_COMMENT 1
+#define SCE_PO_MSGID 2
+#define SCE_PO_MSGID_TEXT 3
+#define SCE_PO_MSGSTR 4
+#define SCE_PO_MSGSTR_TEXT 5
+#define SCE_PO_MSGCTXT 6
+#define SCE_PO_MSGCTXT_TEXT 7
+#define SCE_PO_FUZZY 8
+#define SCE_PO_PROGRAMMER_COMMENT 9
+#define SCE_PO_REFERENCE 10
+#define SCE_PO_FLAGS 11
+#define SCE_PO_MSGID_TEXT_EOL 12
+#define SCE_PO_MSGSTR_TEXT_EOL 13
+#define SCE_PO_MSGCTXT_TEXT_EOL 14
+#define SCE_PO_ERROR 15
+#define SCE_PAS_DEFAULT 0
+#define SCE_PAS_IDENTIFIER 1
+#define SCE_PAS_COMMENT 2
+#define SCE_PAS_COMMENT2 3
+#define SCE_PAS_COMMENTLINE 4
+#define SCE_PAS_PREPROCESSOR 5
+#define SCE_PAS_PREPROCESSOR2 6
+#define SCE_PAS_NUMBER 7
+#define SCE_PAS_HEXNUMBER 8
+#define SCE_PAS_WORD 9
+#define SCE_PAS_STRING 10
+#define SCE_PAS_STRINGEOL 11
+#define SCE_PAS_CHARACTER 12
+#define SCE_PAS_OPERATOR 13
+#define SCE_PAS_ASM 14
+#define SCE_SORCUS_DEFAULT 0
+#define SCE_SORCUS_COMMAND 1
+#define SCE_SORCUS_PARAMETER 2
+#define SCE_SORCUS_COMMENTLINE 3
+#define SCE_SORCUS_STRING 4
+#define SCE_SORCUS_STRINGEOL 5
+#define SCE_SORCUS_IDENTIFIER 6
+#define SCE_SORCUS_OPERATOR 7
+#define SCE_SORCUS_NUMBER 8
+#define SCE_SORCUS_CONSTANT 9
+#define SCE_POWERPRO_DEFAULT 0
+#define SCE_POWERPRO_COMMENTBLOCK 1
+#define SCE_POWERPRO_COMMENTLINE 2
+#define SCE_POWERPRO_NUMBER 3
+#define SCE_POWERPRO_WORD 4
+#define SCE_POWERPRO_WORD2 5
+#define SCE_POWERPRO_WORD3 6
+#define SCE_POWERPRO_WORD4 7
+#define SCE_POWERPRO_DOUBLEQUOTEDSTRING 8
+#define SCE_POWERPRO_SINGLEQUOTEDSTRING 9
+#define SCE_POWERPRO_LINECONTINUE 10
+#define SCE_POWERPRO_OPERATOR 11
+#define SCE_POWERPRO_IDENTIFIER 12
+#define SCE_POWERPRO_STRINGEOL 13
+#define SCE_POWERPRO_VERBATIM 14
+#define SCE_POWERPRO_ALTQUOTE 15
+#define SCE_POWERPRO_FUNCTION 16
+#define SCE_SML_DEFAULT 0
+#define SCE_SML_IDENTIFIER 1
+#define SCE_SML_TAGNAME 2
+#define SCE_SML_KEYWORD 3
+#define SCE_SML_KEYWORD2 4
+#define SCE_SML_KEYWORD3 5
+#define SCE_SML_LINENUM 6
+#define SCE_SML_OPERATOR 7
+#define SCE_SML_NUMBER 8
+#define SCE_SML_CHAR 9
+#define SCE_SML_STRING 11
+#define SCE_SML_COMMENT 12
+#define SCE_SML_COMMENT1 13
+#define SCE_SML_COMMENT2 14
+#define SCE_SML_COMMENT3 15
+#define SCE_MARKDOWN_DEFAULT 0
+#define SCE_MARKDOWN_LINE_BEGIN 1
+#define SCE_MARKDOWN_STRONG1 2
+#define SCE_MARKDOWN_STRONG2 3
+#define SCE_MARKDOWN_EM1 4
+#define SCE_MARKDOWN_EM2 5
+#define SCE_MARKDOWN_HEADER1 6
+#define SCE_MARKDOWN_HEADER2 7
+#define SCE_MARKDOWN_HEADER3 8
+#define SCE_MARKDOWN_HEADER4 9
+#define SCE_MARKDOWN_HEADER5 10
+#define SCE_MARKDOWN_HEADER6 11
+#define SCE_MARKDOWN_PRECHAR 12
+#define SCE_MARKDOWN_ULIST_ITEM 13
+#define SCE_MARKDOWN_OLIST_ITEM 14
+#define SCE_MARKDOWN_BLOCKQUOTE 15
+#define SCE_MARKDOWN_STRIKEOUT 16
+#define SCE_MARKDOWN_HRULE 17
+#define SCE_MARKDOWN_LINK 18
+#define SCE_MARKDOWN_CODE 19
+#define SCE_MARKDOWN_CODE2 20
+#define SCE_MARKDOWN_CODEBK 21
+#define SCE_TXT2TAGS_DEFAULT 0
+#define SCE_TXT2TAGS_LINE_BEGIN 1
+#define SCE_TXT2TAGS_STRONG1 2
+#define SCE_TXT2TAGS_STRONG2 3
+#define SCE_TXT2TAGS_EM1 4
+#define SCE_TXT2TAGS_EM2 5
+#define SCE_TXT2TAGS_HEADER1 6
+#define SCE_TXT2TAGS_HEADER2 7
+#define SCE_TXT2TAGS_HEADER3 8
+#define SCE_TXT2TAGS_HEADER4 9
+#define SCE_TXT2TAGS_HEADER5 10
+#define SCE_TXT2TAGS_HEADER6 11
+#define SCE_TXT2TAGS_PRECHAR 12
+#define SCE_TXT2TAGS_ULIST_ITEM 13
+#define SCE_TXT2TAGS_OLIST_ITEM 14
+#define SCE_TXT2TAGS_BLOCKQUOTE 15
+#define SCE_TXT2TAGS_STRIKEOUT 16
+#define SCE_TXT2TAGS_HRULE 17
+#define SCE_TXT2TAGS_LINK 18
+#define SCE_TXT2TAGS_CODE 19
+#define SCE_TXT2TAGS_CODE2 20
+#define SCE_TXT2TAGS_CODEBK 21
+#define SCE_TXT2TAGS_COMMENT 22
+#define SCE_TXT2TAGS_OPTION 23
+#define SCE_TXT2TAGS_PREPROC 24
+#define SCE_TXT2TAGS_POSTPROC 25
+#define SCE_A68K_DEFAULT 0
+#define SCE_A68K_COMMENT 1
+#define SCE_A68K_NUMBER_DEC 2
+#define SCE_A68K_NUMBER_BIN 3
+#define SCE_A68K_NUMBER_HEX 4
+#define SCE_A68K_STRING1 5
+#define SCE_A68K_OPERATOR 6
+#define SCE_A68K_CPUINSTRUCTION 7
+#define SCE_A68K_EXTINSTRUCTION 8
+#define SCE_A68K_REGISTER 9
+#define SCE_A68K_DIRECTIVE 10
+#define SCE_A68K_MACRO_ARG 11
+#define SCE_A68K_LABEL 12
+#define SCE_A68K_STRING2 13
+#define SCE_A68K_IDENTIFIER 14
+#define SCE_A68K_MACRO_DECLARATION 15
+#define SCE_A68K_COMMENT_WORD 16
+#define SCE_A68K_COMMENT_SPECIAL 17
+#define SCE_A68K_COMMENT_DOXYGEN 18
+#define SCE_MODULA_DEFAULT 0
+#define SCE_MODULA_COMMENT 1
+#define SCE_MODULA_DOXYCOMM 2
+#define SCE_MODULA_DOXYKEY 3
+#define SCE_MODULA_KEYWORD 4
+#define SCE_MODULA_RESERVED 5
+#define SCE_MODULA_NUMBER 6
+#define SCE_MODULA_BASENUM 7
+#define SCE_MODULA_FLOAT 8
+#define SCE_MODULA_STRING 9
+#define SCE_MODULA_STRSPEC 10
+#define SCE_MODULA_CHAR 11
+#define SCE_MODULA_CHARSPEC 12
+#define SCE_MODULA_PROC 13
+#define SCE_MODULA_PRAGMA 14
+#define SCE_MODULA_PRGKEY 15
+#define SCE_MODULA_OPERATOR 16
+#define SCE_MODULA_BADSTR 17
+#define SCE_COFFEESCRIPT_DEFAULT 0
+#define SCE_COFFEESCRIPT_COMMENT 1
+#define SCE_COFFEESCRIPT_COMMENTLINE 2
+#define SCE_COFFEESCRIPT_COMMENTDOC 3
+#define SCE_COFFEESCRIPT_NUMBER 4
+#define SCE_COFFEESCRIPT_WORD 5
+#define SCE_COFFEESCRIPT_STRING 6
+#define SCE_COFFEESCRIPT_CHARACTER 7
+#define SCE_COFFEESCRIPT_UUID 8
+#define SCE_COFFEESCRIPT_PREPROCESSOR 9
+#define SCE_COFFEESCRIPT_OPERATOR 10
+#define SCE_COFFEESCRIPT_IDENTIFIER 11
+#define SCE_COFFEESCRIPT_STRINGEOL 12
+#define SCE_COFFEESCRIPT_VERBATIM 13
+#define SCE_COFFEESCRIPT_REGEX 14
+#define SCE_COFFEESCRIPT_COMMENTLINEDOC 15
+#define SCE_COFFEESCRIPT_WORD2 16
+#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORD 17
+#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR 18
+#define SCE_COFFEESCRIPT_GLOBALCLASS 19
+#define SCE_COFFEESCRIPT_STRINGRAW 20
+#define SCE_COFFEESCRIPT_TRIPLEVERBATIM 21
+#define SCE_COFFEESCRIPT_COMMENTBLOCK 22
+#define SCE_COFFEESCRIPT_VERBOSE_REGEX 23
+#define SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT 24
+#define SCE_COFFEESCRIPT_INSTANCEPROPERTY 25
+#define SCE_AVS_DEFAULT 0
+#define SCE_AVS_COMMENTBLOCK 1
+#define SCE_AVS_COMMENTBLOCKN 2
+#define SCE_AVS_COMMENTLINE 3
+#define SCE_AVS_NUMBER 4
+#define SCE_AVS_OPERATOR 5
+#define SCE_AVS_IDENTIFIER 6
+#define SCE_AVS_STRING 7
+#define SCE_AVS_TRIPLESTRING 8
+#define SCE_AVS_KEYWORD 9
+#define SCE_AVS_FILTER 10
+#define SCE_AVS_PLUGIN 11
+#define SCE_AVS_FUNCTION 12
+#define SCE_AVS_CLIPPROP 13
+#define SCE_AVS_USERDFN 14
+#define SCE_ECL_DEFAULT 0
+#define SCE_ECL_COMMENT 1
+#define SCE_ECL_COMMENTLINE 2
+#define SCE_ECL_NUMBER 3
+#define SCE_ECL_STRING 4
+#define SCE_ECL_WORD0 5
+#define SCE_ECL_OPERATOR 6
+#define SCE_ECL_CHARACTER 7
+#define SCE_ECL_UUID 8
+#define SCE_ECL_PREPROCESSOR 9
+#define SCE_ECL_UNKNOWN 10
+#define SCE_ECL_IDENTIFIER 11
+#define SCE_ECL_STRINGEOL 12
+#define SCE_ECL_VERBATIM 13
+#define SCE_ECL_REGEX 14
+#define SCE_ECL_COMMENTLINEDOC 15
+#define SCE_ECL_WORD1 16
+#define SCE_ECL_COMMENTDOCKEYWORD 17
+#define SCE_ECL_COMMENTDOCKEYWORDERROR 18
+#define SCE_ECL_WORD2 19
+#define SCE_ECL_WORD3 20
+#define SCE_ECL_WORD4 21
+#define SCE_ECL_WORD5 22
+#define SCE_ECL_COMMENTDOC 23
+#define SCE_ECL_ADDED 24
+#define SCE_ECL_DELETED 25
+#define SCE_ECL_CHANGED 26
+#define SCE_ECL_MOVED 27
+#define SCE_OSCRIPT_DEFAULT 0
+#define SCE_OSCRIPT_LINE_COMMENT 1
+#define SCE_OSCRIPT_BLOCK_COMMENT 2
+#define SCE_OSCRIPT_DOC_COMMENT 3
+#define SCE_OSCRIPT_PREPROCESSOR 4
+#define SCE_OSCRIPT_NUMBER 5
+#define SCE_OSCRIPT_SINGLEQUOTE_STRING 6
+#define SCE_OSCRIPT_DOUBLEQUOTE_STRING 7
+#define SCE_OSCRIPT_CONSTANT 8
+#define SCE_OSCRIPT_IDENTIFIER 9
+#define SCE_OSCRIPT_GLOBAL 10
+#define SCE_OSCRIPT_KEYWORD 11
+#define SCE_OSCRIPT_OPERATOR 12
+#define SCE_OSCRIPT_LABEL 13
+#define SCE_OSCRIPT_TYPE 14
+#define SCE_OSCRIPT_FUNCTION 15
+#define SCE_OSCRIPT_OBJECT 16
+#define SCE_OSCRIPT_PROPERTY 17
+#define SCE_OSCRIPT_METHOD 18
+#define SCE_VISUALPROLOG_DEFAULT 0
+#define SCE_VISUALPROLOG_KEY_MAJOR 1
+#define SCE_VISUALPROLOG_KEY_MINOR 2
+#define SCE_VISUALPROLOG_KEY_DIRECTIVE 3
+#define SCE_VISUALPROLOG_COMMENT_BLOCK 4
+#define SCE_VISUALPROLOG_COMMENT_LINE 5
+#define SCE_VISUALPROLOG_COMMENT_KEY 6
+#define SCE_VISUALPROLOG_COMMENT_KEY_ERROR 7
+#define SCE_VISUALPROLOG_IDENTIFIER 8
+#define SCE_VISUALPROLOG_VARIABLE 9
+#define SCE_VISUALPROLOG_ANONYMOUS 10
+#define SCE_VISUALPROLOG_NUMBER 11
+#define SCE_VISUALPROLOG_OPERATOR 12
+#define SCE_VISUALPROLOG_CHARACTER 13
+#define SCE_VISUALPROLOG_CHARACTER_TOO_MANY 14
+#define SCE_VISUALPROLOG_CHARACTER_ESCAPE_ERROR 15
+#define SCE_VISUALPROLOG_STRING 16
+#define SCE_VISUALPROLOG_STRING_ESCAPE 17
+#define SCE_VISUALPROLOG_STRING_ESCAPE_ERROR 18
+#define SCE_VISUALPROLOG_STRING_EOL_OPEN 19
+#define SCE_VISUALPROLOG_STRING_VERBATIM 20
+#define SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL 21
+#define SCE_VISUALPROLOG_STRING_VERBATIM_EOL 22
+#define SCE_STTXT_DEFAULT 0
+#define SCE_STTXT_COMMENT 1
+#define SCE_STTXT_COMMENTLINE 2
+#define SCE_STTXT_KEYWORD 3
+#define SCE_STTXT_TYPE 4
+#define SCE_STTXT_FUNCTION 5
+#define SCE_STTXT_FB 6
+#define SCE_STTXT_NUMBER 7
+#define SCE_STTXT_HEXNUMBER 8
+#define SCE_STTXT_PRAGMA 9
+#define SCE_STTXT_OPERATOR 10
+#define SCE_STTXT_CHARACTER 11
+#define SCE_STTXT_STRING1 12
+#define SCE_STTXT_STRING2 13
+#define SCE_STTXT_STRINGEOL 14
+#define SCE_STTXT_IDENTIFIER 15
+#define SCE_STTXT_DATETIME 16
+#define SCE_STTXT_VARS 17
+#define SCE_STTXT_PRAGMAS 18
+#define SCE_KVIRC_DEFAULT 0
+#define SCE_KVIRC_COMMENT 1
+#define SCE_KVIRC_COMMENTBLOCK 2
+#define SCE_KVIRC_STRING 3
+#define SCE_KVIRC_WORD 4
+#define SCE_KVIRC_KEYWORD 5
+#define SCE_KVIRC_FUNCTION_KEYWORD 6
+#define SCE_KVIRC_FUNCTION 7
+#define SCE_KVIRC_VARIABLE 8
+#define SCE_KVIRC_NUMBER 9
+#define SCE_KVIRC_OPERATOR 10
+#define SCE_KVIRC_STRING_FUNCTION 11
+#define SCE_KVIRC_STRING_VARIABLE 12
+#define SCE_RUST_DEFAULT 0
+#define SCE_RUST_COMMENTBLOCK 1
+#define SCE_RUST_COMMENTLINE 2
+#define SCE_RUST_COMMENTBLOCKDOC 3
+#define SCE_RUST_COMMENTLINEDOC 4
+#define SCE_RUST_NUMBER 5
+#define SCE_RUST_WORD 6
+#define SCE_RUST_WORD2 7
+#define SCE_RUST_WORD3 8
+#define SCE_RUST_WORD4 9
+#define SCE_RUST_WORD5 10
+#define SCE_RUST_WORD6 11
+#define SCE_RUST_WORD7 12
+#define SCE_RUST_STRING 13
+#define SCE_RUST_STRINGR 14
+#define SCE_RUST_CHARACTER 15
+#define SCE_RUST_OPERATOR 16
+#define SCE_RUST_IDENTIFIER 17
+#define SCE_RUST_LIFETIME 18
+#define SCE_RUST_MACRO 19
+#define SCE_RUST_LEXERROR 20
+#define SCE_RUST_BYTESTRING 21
+#define SCE_RUST_BYTESTRINGR 22
+#define SCE_RUST_BYTECHARACTER 23
+#define SCE_DMAP_DEFAULT 0
+#define SCE_DMAP_COMMENT 1
+#define SCE_DMAP_NUMBER 2
+#define SCE_DMAP_STRING1 3
+#define SCE_DMAP_STRING2 4
+#define SCE_DMAP_STRINGEOL 5
+#define SCE_DMAP_OPERATOR 6
+#define SCE_DMAP_IDENTIFIER 7
+#define SCE_DMAP_WORD 8
+#define SCE_DMAP_WORD2 9
+#define SCE_DMAP_WORD3 10
+#define SCE_DMIS_DEFAULT 0
+#define SCE_DMIS_COMMENT 1
+#define SCE_DMIS_STRING 2
+#define SCE_DMIS_NUMBER 3
+#define SCE_DMIS_KEYWORD 4
+#define SCE_DMIS_MAJORWORD 5
+#define SCE_DMIS_MINORWORD 6
+#define SCE_DMIS_UNSUPPORTED_MAJOR 7
+#define SCE_DMIS_UNSUPPORTED_MINOR 8
+#define SCE_DMIS_LABEL 9
+#define SCE_REG_DEFAULT 0
+#define SCE_REG_COMMENT 1
+#define SCE_REG_VALUENAME 2
+#define SCE_REG_STRING 3
+#define SCE_REG_HEXDIGIT 4
+#define SCE_REG_VALUETYPE 5
+#define SCE_REG_ADDEDKEY 6
+#define SCE_REG_DELETEDKEY 7
+#define SCE_REG_ESCAPED 8
+#define SCE_REG_KEYPATH_GUID 9
+#define SCE_REG_STRING_GUID 10
+#define SCE_REG_PARAMETER 11
+#define SCE_REG_OPERATOR 12
+#define SCE_BIBTEX_DEFAULT 0
+#define SCE_BIBTEX_ENTRY 1
+#define SCE_BIBTEX_UNKNOWN_ENTRY 2
+#define SCE_BIBTEX_KEY 3
+#define SCE_BIBTEX_PARAMETER 4
+#define SCE_BIBTEX_VALUE 5
+#define SCE_BIBTEX_COMMENT 6
+#define SCE_HEX_DEFAULT 0
+#define SCE_HEX_RECSTART 1
+#define SCE_HEX_RECTYPE 2
+#define SCE_HEX_RECTYPE_UNKNOWN 3
+#define SCE_HEX_BYTECOUNT 4
+#define SCE_HEX_BYTECOUNT_WRONG 5
+#define SCE_HEX_NOADDRESS 6
+#define SCE_HEX_DATAADDRESS 7
+#define SCE_HEX_RECCOUNT 8
+#define SCE_HEX_STARTADDRESS 9
+#define SCE_HEX_ADDRESSFIELD_UNKNOWN 10
+#define SCE_HEX_EXTENDEDADDRESS 11
+#define SCE_HEX_DATA_ODD 12
+#define SCE_HEX_DATA_EVEN 13
+#define SCE_HEX_DATA_UNKNOWN 14
+#define SCE_HEX_DATA_EMPTY 15
+#define SCE_HEX_CHECKSUM 16
+#define SCE_HEX_CHECKSUM_WRONG 17
+#define SCE_HEX_GARBAGE 18
+#define SCE_JSON_DEFAULT 0
+#define SCE_JSON_NUMBER 1
+#define SCE_JSON_STRING 2
+#define SCE_JSON_STRINGEOL 3
+#define SCE_JSON_PROPERTYNAME 4
+#define SCE_JSON_ESCAPESEQUENCE 5
+#define SCE_JSON_LINECOMMENT 6
+#define SCE_JSON_BLOCKCOMMENT 7
+#define SCE_JSON_OPERATOR 8
+#define SCE_JSON_URI 9
+#define SCE_JSON_COMPACTIRI 10
+#define SCE_JSON_KEYWORD 11
+#define SCE_JSON_LDKEYWORD 12
+#define SCE_JSON_ERROR 13
+#define SCE_EDI_DEFAULT 0
+#define SCE_EDI_SEGMENTSTART 1
+#define SCE_EDI_SEGMENTEND 2
+#define SCE_EDI_SEP_ELEMENT 3
+#define SCE_EDI_SEP_COMPOSITE 4
+#define SCE_EDI_SEP_RELEASE 5
+#define SCE_EDI_UNA 6
+#define SCE_EDI_UNH 7
+#define SCE_EDI_BADSEGMENT 8
+#define SCE_STATA_DEFAULT 0
+#define SCE_STATA_COMMENT 1
+#define SCE_STATA_COMMENTLINE 2
+#define SCE_STATA_COMMENTBLOCK 3
+#define SCE_STATA_NUMBER 4
+#define SCE_STATA_OPERATOR 5
+#define SCE_STATA_IDENTIFIER 6
+#define SCE_STATA_STRING 7
+#define SCE_STATA_TYPE 8
+#define SCE_STATA_WORD 9
+#define SCE_STATA_GLOBAL_MACRO 10
+#define SCE_STATA_MACRO 11
+#define SCE_SAS_DEFAULT 0
+#define SCE_SAS_COMMENT 1
+#define SCE_SAS_COMMENTLINE 2
+#define SCE_SAS_COMMENTBLOCK 3
+#define SCE_SAS_NUMBER 4
+#define SCE_SAS_OPERATOR 5
+#define SCE_SAS_IDENTIFIER 6
+#define SCE_SAS_STRING 7
+#define SCE_SAS_TYPE 8
+#define SCE_SAS_WORD 9
+#define SCE_SAS_GLOBAL_MACRO 10
+#define SCE_SAS_MACRO 11
+#define SCE_SAS_MACRO_KEYWORD 12
+#define SCE_SAS_BLOCK_KEYWORD 13
+#define SCE_SAS_MACRO_FUNCTION 14
+#define SCE_SAS_STATEMENT 15
+#define SCE_NIM_DEFAULT 0
+#define SCE_NIM_COMMENT 1
+#define SCE_NIM_COMMENTDOC 2
+#define SCE_NIM_COMMENTLINE 3
+#define SCE_NIM_COMMENTLINEDOC 4
+#define SCE_NIM_NUMBER 5
+#define SCE_NIM_STRING 6
+#define SCE_NIM_CHARACTER 7
+#define SCE_NIM_WORD 8
+#define SCE_NIM_TRIPLE 9
+#define SCE_NIM_TRIPLEDOUBLE 10
+#define SCE_NIM_BACKTICKS 11
+#define SCE_NIM_FUNCNAME 12
+#define SCE_NIM_STRINGEOL 13
+#define SCE_NIM_NUMERROR 14
+#define SCE_NIM_OPERATOR 15
+#define SCE_NIM_IDENTIFIER 16
+#define SCE_CIL_DEFAULT 0
+#define SCE_CIL_COMMENT 1
+#define SCE_CIL_COMMENTLINE 2
+#define SCE_CIL_WORD 3
+#define SCE_CIL_WORD2 4
+#define SCE_CIL_WORD3 5
+#define SCE_CIL_STRING 6
+#define SCE_CIL_LABEL 7
+#define SCE_CIL_OPERATOR 8
+#define SCE_CIL_IDENTIFIER 9
+#define SCE_CIL_STRINGEOL 10
+#define SCE_X12_DEFAULT 0
+#define SCE_X12_BAD 1
+#define SCE_X12_ENVELOPE 2
+#define SCE_X12_FUNCTIONGROUP 3
+#define SCE_X12_TRANSACTIONSET 4
+#define SCE_X12_SEGMENTHEADER 5
+#define SCE_X12_SEGMENTEND 6
+#define SCE_X12_SEP_ELEMENT 7
+#define SCE_X12_SEP_SUBELEMENT 8
+#define SCE_DF_DEFAULT 0
+#define SCE_DF_IDENTIFIER 1
+#define SCE_DF_METATAG 2
+#define SCE_DF_IMAGE 3
+#define SCE_DF_COMMENTLINE 4
+#define SCE_DF_PREPROCESSOR 5
+#define SCE_DF_PREPROCESSOR2 6
+#define SCE_DF_NUMBER 7
+#define SCE_DF_HEXNUMBER 8
+#define SCE_DF_WORD 9
+#define SCE_DF_STRING 10
+#define SCE_DF_STRINGEOL 11
+#define SCE_DF_SCOPEWORD 12
+#define SCE_DF_OPERATOR 13
+#define SCE_DF_ICODE 14
+#define SCE_HOLLYWOOD_DEFAULT 0
+#define SCE_HOLLYWOOD_COMMENT 1
+#define SCE_HOLLYWOOD_COMMENTBLOCK 2
+#define SCE_HOLLYWOOD_NUMBER 3
+#define SCE_HOLLYWOOD_KEYWORD 4
+#define SCE_HOLLYWOOD_STDAPI 5
+#define SCE_HOLLYWOOD_PLUGINAPI 6
+#define SCE_HOLLYWOOD_PLUGINMETHOD 7
+#define SCE_HOLLYWOOD_STRING 8
+#define SCE_HOLLYWOOD_STRINGBLOCK 9
+#define SCE_HOLLYWOOD_PREPROCESSOR 10
+#define SCE_HOLLYWOOD_OPERATOR 11
+#define SCE_HOLLYWOOD_IDENTIFIER 12
+#define SCE_HOLLYWOOD_CONSTANT 13
+#define SCE_HOLLYWOOD_HEXNUMBER 14
+#define SCE_RAKU_DEFAULT 0
+#define SCE_RAKU_ERROR 1
+#define SCE_RAKU_COMMENTLINE 2
+#define SCE_RAKU_COMMENTEMBED 3
+#define SCE_RAKU_POD 4
+#define SCE_RAKU_CHARACTER 5
+#define SCE_RAKU_HEREDOC_Q 6
+#define SCE_RAKU_HEREDOC_QQ 7
+#define SCE_RAKU_STRING 8
+#define SCE_RAKU_STRING_Q 9
+#define SCE_RAKU_STRING_QQ 10
+#define SCE_RAKU_STRING_Q_LANG 11
+#define SCE_RAKU_STRING_VAR 12
+#define SCE_RAKU_REGEX 13
+#define SCE_RAKU_REGEX_VAR 14
+#define SCE_RAKU_ADVERB 15
+#define SCE_RAKU_NUMBER 16
+#define SCE_RAKU_PREPROCESSOR 17
+#define SCE_RAKU_OPERATOR 18
+#define SCE_RAKU_WORD 19
+#define SCE_RAKU_FUNCTION 20
+#define SCE_RAKU_IDENTIFIER 21
+#define SCE_RAKU_TYPEDEF 22
+#define SCE_RAKU_MU 23
+#define SCE_RAKU_POSITIONAL 24
+#define SCE_RAKU_ASSOCIATIVE 25
+#define SCE_RAKU_CALLABLE 26
+#define SCE_RAKU_GRAMMAR 27
+#define SCE_RAKU_CLASS 28
+/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
 
-#define SCLEX_AUTOMATIC 1000
-
-
-
-//For All lexer
-#define SCE_UNIVERSAL_FOUND_STYLE 31
-#define SCE_UNIVERSAL_FOUND_STYLE_SMART 29
-#define SCE_UNIVERSAL_FOUND_STYLE_INC 28
-#define SCE_UNIVERSAL_TAGMATCH 27
-#define SCE_UNIVERSAL_TAGATTR 26
-#define SCE_UNIVERSAL_FOUND_STYLE_EXT1 25
-#define SCE_UNIVERSAL_FOUND_STYLE_EXT2 24
-#define SCE_UNIVERSAL_FOUND_STYLE_EXT3 23
-#define SCE_UNIVERSAL_FOUND_STYLE_EXT4 22
-#define SCE_UNIVERSAL_FOUND_STYLE_EXT5 21
-
-#define SCE_UDL_VERSION_MAJOR       2
-#define SCE_UDL_VERSION_MINOR       1
-#define SCE_UDL_VERSION_BUILD       0
-#define SCE_UDL_VERSION_REVISION    12
-
-#define SCE_USER_KWLIST_COMMENTS                    0
-#define SCE_USER_KWLIST_NUMBER_PREFIX1              1
-#define SCE_USER_KWLIST_NUMBER_PREFIX2              2
-#define SCE_USER_KWLIST_NUMBER_EXTRAS1              3
-#define SCE_USER_KWLIST_NUMBER_EXTRAS2              4
-#define SCE_USER_KWLIST_NUMBER_SUFFIX1              5
-#define SCE_USER_KWLIST_NUMBER_SUFFIX2              6
-#define SCE_USER_KWLIST_NUMBER_RANGE                7
-#define SCE_USER_KWLIST_OPERATORS1                  8
-#define SCE_USER_KWLIST_OPERATORS2                  9
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_OPEN       10
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_MIDDLE     11
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE1_CLOSE      12
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_OPEN       13
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_MIDDLE     14
-#define SCE_USER_KWLIST_FOLDERS_IN_CODE2_CLOSE      15
-#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_OPEN     16
-#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_MIDDLE   17
-#define SCE_USER_KWLIST_FOLDERS_IN_COMMENT_CLOSE    18
-#define SCE_USER_KWLIST_KEYWORDS1                   19
-#define SCE_USER_KWLIST_KEYWORDS2                   20
-#define SCE_USER_KWLIST_KEYWORDS3                   21
-#define SCE_USER_KWLIST_KEYWORDS4                   22
-#define SCE_USER_KWLIST_KEYWORDS5                   23
-#define SCE_USER_KWLIST_KEYWORDS6                   24
-#define SCE_USER_KWLIST_KEYWORDS7                   25
-#define SCE_USER_KWLIST_KEYWORDS8                   26
-#define SCE_USER_KWLIST_DELIMITERS                  27
-#define SCE_USER_KWLIST_TOTAL                       28  // must always be <= KEYWORDSET_MAX
-
-#define SCE_USER_TOTAL_DELIMITERS           8
-#define SCE_USER_TOTAL_KEYWORD_GROUPS       8
-#define SCE_USER_TOTAL_FOLDERS              6
-
-#define SCE_USER_STYLE_DEFAULT              0
-#define SCE_USER_STYLE_COMMENT              1
-#define SCE_USER_STYLE_COMMENTLINE          2
-#define SCE_USER_STYLE_NUMBER               3
-#define SCE_USER_STYLE_KEYWORD1             4
-#define SCE_USER_STYLE_KEYWORD2             5
-#define SCE_USER_STYLE_KEYWORD3             6
-#define SCE_USER_STYLE_KEYWORD4             7
-#define SCE_USER_STYLE_KEYWORD5             8
-#define SCE_USER_STYLE_KEYWORD6             9
-#define SCE_USER_STYLE_KEYWORD7             10
-#define SCE_USER_STYLE_KEYWORD8             11
-#define SCE_USER_STYLE_OPERATOR             12
-#define SCE_USER_STYLE_FOLDER_IN_CODE1      13
-#define SCE_USER_STYLE_FOLDER_IN_CODE2      14
-#define SCE_USER_STYLE_FOLDER_IN_COMMENT    15
-#define SCE_USER_STYLE_DELIMITER1           16
-#define SCE_USER_STYLE_DELIMITER2           17
-#define SCE_USER_STYLE_DELIMITER3           18
-#define SCE_USER_STYLE_DELIMITER4           19
-#define SCE_USER_STYLE_DELIMITER5           20
-#define SCE_USER_STYLE_DELIMITER6           21
-#define SCE_USER_STYLE_DELIMITER7           22
-#define SCE_USER_STYLE_DELIMITER8           23
-#define SCE_USER_STYLE_IDENTIFIER           24
-#define SCE_USER_STYLE_TOTAL_STYLES         SCE_USER_STYLE_IDENTIFIER
-#define SCE_USER_STYLE_MAPPER_TOTAL         17
-
-#define SCE_USER_MASK_NESTING_NONE                          0
-#define SCE_USER_MASK_NESTING_DELIMITER1                    0x1
-#define SCE_USER_MASK_NESTING_DELIMITER2                    0x2
-#define SCE_USER_MASK_NESTING_DELIMITER3                    0x4
-#define SCE_USER_MASK_NESTING_DELIMITER4                    0x8
-#define SCE_USER_MASK_NESTING_DELIMITER5                    0x10
-#define SCE_USER_MASK_NESTING_DELIMITER6                    0x20
-#define SCE_USER_MASK_NESTING_DELIMITER7                    0x40
-#define SCE_USER_MASK_NESTING_DELIMITER8                    0x80
-#define SCE_USER_MASK_NESTING_COMMENT                       0x100
-#define SCE_USER_MASK_NESTING_COMMENT_LINE                  0x200
-#define SCE_USER_MASK_NESTING_KEYWORD1                      0x400
-#define SCE_USER_MASK_NESTING_KEYWORD2                      0x800
-#define SCE_USER_MASK_NESTING_KEYWORD3                      0x1000
-#define SCE_USER_MASK_NESTING_KEYWORD4                      0x2000
-#define SCE_USER_MASK_NESTING_KEYWORD5                      0x4000
-#define SCE_USER_MASK_NESTING_KEYWORD6                      0x8000
-#define SCE_USER_MASK_NESTING_KEYWORD7                      0x10000
-#define SCE_USER_MASK_NESTING_KEYWORD8                      0x20000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_OPEN         0x40000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_MIDDLE       0x80000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_CODE2_CLOSE        0x100000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_OPEN       0x200000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_MIDDLE     0x400000
-#define SCE_USER_MASK_NESTING_FOLDERS_IN_COMMENT_CLOSE      0x800000
-#define SCE_USER_MASK_NESTING_OPERATORS1                    0x1000000
-#define SCE_USER_MASK_NESTING_OPERATORS2                    0x2000000
-#define SCE_USER_MASK_NESTING_NUMBERS                       0x4000000
-
-#define SCE_TXT_DEFAULT 0
-#define SCE_TXT_ASCII 1
-#define SCE_TXT_KEYWORD 2
-#define SCE_TXT_IDENTIFIER 4
-
-#define SCE_P_DEFAULT 0
-#define SCE_P_COMMENTLINE 1
-#define SCE_P_NUMBER 2
-#define SCE_P_STRING 3
-#define SCE_P_CHARACTER 4
-#define SCE_P_WORD 5
-#define SCE_P_TRIPLE 6
-#define SCE_P_TRIPLEDOUBLE 7
-#define SCE_P_CLASSNAME 8
-#define SCE_P_DEFNAME 9
-#define SCE_P_OPERATOR 10
-#define SCE_P_IDENTIFIER 11
-#define SCE_P_COMMENTBLOCK 12
-#define SCE_P_STRINGEOL 13
-#define SCE_P_WORD2 14
-#define SCE_P_DECORATOR 15
-#define SCE_P_FSTRING 16
-#define SCE_P_FCHARACTER 17
-#define SCE_P_FTRIPLE 18
-#define SCE_P_FTRIPLEDOUBLE 19
-#define SCE_C_DEFAULT 0
-#define SCE_C_COMMENT 1
-#define SCE_C_COMMENTLINE 2
-#define SCE_C_COMMENTDOC 3
-#define SCE_C_NUMBER 4
-#define SCE_C_WORD 5
-#define SCE_C_STRING 6
-#define SCE_C_CHARACTER 7
-#define SCE_C_UUID 8
-#define SCE_C_PREPROCESSOR 9
-#define SCE_C_OPERATOR 10
-#define SCE_C_IDENTIFIER 11
-#define SCE_C_STRINGEOL 12
-#define SCE_C_VERBATIM 13
-#define SCE_C_REGEX 14
-#define SCE_C_COMMENTLINEDOC 15
-#define SCE_C_WORD2 16
-#define SCE_C_COMMENTDOCKEYWORD 17
-#define SCE_C_COMMENTDOCKEYWORDERROR 18
-#define SCE_C_GLOBALCLASS 19
-#define SCE_C_STRINGRAW 20
-#define SCE_C_TRIPLEVERBATIM 21
-#define SCE_C_HASHQUOTEDSTRING 22
-#define SCE_C_PREPROCESSORCOMMENT 23
-#define SCE_C_PREPROCESSORCOMMENTDOC 24
-#define SCE_C_USERLITERAL 25
-#define SCE_C_TASKMARKER 26
-#define SCE_C_ESCAPESEQUENCE 27
-#define SCE_D_DEFAULT 0
-#define SCE_D_COMMENT 1
-#define SCE_D_COMMENTLINE 2
-#define SCE_D_COMMENTDOC 3
-#define SCE_D_COMMENTNESTED 4
-#define SCE_D_NUMBER 5
-#define SCE_D_WORD 6
-#define SCE_D_WORD2 7
-#define SCE_D_WORD3 8
-#define SCE_D_TYPEDEF 9
-#define SCE_D_STRING 10
-#define SCE_D_STRINGEOL 11
-#define SCE_D_CHARACTER 12
-#define SCE_D_OPERATOR 13
-#define SCE_D_IDENTIFIER 14
-#define SCE_D_COMMENTLINEDOC 15
-#define SCE_D_COMMENTDOCKEYWORD 16
-#define SCE_D_COMMENTDOCKEYWORDERROR 17
-#define SCE_D_STRINGB 18
-#define SCE_D_STRINGR 19
-#define SCE_D_WORD5 20
-#define SCE_D_WORD6 21
-#define SCE_D_WORD7 22
-
-#define SCE_SEARCHRESULT_DEFAULT 0
-#define SCE_SEARCHRESULT_SEARCH_HEADER 1
-#define SCE_SEARCHRESULT_FILE_HEADER 2
-#define SCE_SEARCHRESULT_LINE_NUMBER 3
-#define SCE_SEARCHRESULT_WORD2SEARCH 4
-//#define SCE_SEARCHRESULT_HIGHLIGHT_LINE 5 // (no use anymore)
-#define SCE_SEARCHRESULT_CURRENT_LINE 6
-#define SCE_OBJC_DIRECTIVE 20
-#define SCE_OBJC_QUALIFIER 21
-
-#define SCE_TCL_DEFAULT 0
-#define SCE_TCL_COMMENT 1
-#define SCE_TCL_COMMENTLINE 2
-#define SCE_TCL_NUMBER 3
-#define SCE_TCL_WORD_IN_QUOTE 4
-#define SCE_TCL_IN_QUOTE 5
-#define SCE_TCL_OPERATOR 6
-#define SCE_TCL_IDENTIFIER 7
-#define SCE_TCL_SUBSTITUTION 8
-#define SCE_TCL_SUB_BRACE 9
-#define SCE_TCL_MODIFIER 10
-#define SCE_TCL_EXPAND 11
-#define SCE_TCL_WORD 12
-#define SCE_TCL_WORD2 13
-#define SCE_TCL_WORD3 14
-#define SCE_TCL_WORD4 15
-#define SCE_TCL_WORD5 16
-#define SCE_TCL_WORD6 17
-#define SCE_TCL_WORD7 18
-#define SCE_TCL_WORD8 19
-#define SCE_TCL_COMMENT_BOX 20
-#define SCE_TCL_BLOCK_COMMENT 21
-#define SCE_H_DEFAULT 0
-#define SCE_H_TAG 1
-#define SCE_H_TAGUNKNOWN 2
-#define SCE_H_ATTRIBUTE 3
-#define SCE_H_ATTRIBUTEUNKNOWN 4
-#define SCE_H_NUMBER 5
-#define SCE_H_DOUBLESTRING 6
-#define SCE_H_SINGLESTRING 7
-#define SCE_H_OTHER 8
-#define SCE_H_COMMENT 9
-#define SCE_H_ENTITY 10
-#define SCE_H_TAGEND 11
-#define SCE_H_XMLSTART 12
-#define SCE_H_XMLEND 13
-#define SCE_H_SCRIPT 14
-#define SCE_H_ASP 15
-#define SCE_H_ASPAT 16
-#define SCE_H_CDATA 17
-#define SCE_H_QUESTION 18
-#define SCE_H_VALUE 19
-#define SCE_H_XCCOMMENT 20
-#define SCE_H_SGML_DEFAULT 21
-#define SCE_H_SGML_COMMAND 22
-#define SCE_H_SGML_1ST_PARAM 23
-#define SCE_H_SGML_DOUBLESTRING 24
-#define SCE_H_SGML_SIMPLESTRING 25
-#define SCE_H_SGML_ERROR 26
-#define SCE_H_SGML_SPECIAL 27
-#define SCE_H_SGML_ENTITY 28
-#define SCE_H_SGML_COMMENT 29
-#define SCE_H_SGML_1ST_PARAM_COMMENT 30
-#define SCE_H_SGML_BLOCK_DEFAULT 31
-#define SCE_HJ_START 40
-#define SCE_HJ_DEFAULT 41
-#define SCE_HJ_COMMENT 42
-#define SCE_HJ_COMMENTLINE 43
-#define SCE_HJ_COMMENTDOC 44
-#define SCE_HJ_NUMBER 45
-#define SCE_HJ_WORD 46
-#define SCE_HJ_KEYWORD 47
-#define SCE_HJ_DOUBLESTRING 48
-#define SCE_HJ_SINGLESTRING 49
-#define SCE_HJ_SYMBOLS 50
-#define SCE_HJ_STRINGEOL 51
-#define SCE_HJ_REGEX 52
-#define SCE_HJA_START 55
-#define SCE_HJA_DEFAULT 56
-#define SCE_HJA_COMMENT 57
-#define SCE_HJA_COMMENTLINE 58
-#define SCE_HJA_COMMENTDOC 59
-#define SCE_HJA_NUMBER 60
-#define SCE_HJA_WORD 61
-#define SCE_HJA_KEYWORD 62
-#define SCE_HJA_DOUBLESTRING 63
-#define SCE_HJA_SINGLESTRING 64
-#define SCE_HJA_SYMBOLS 65
-#define SCE_HJA_STRINGEOL 66
-#define SCE_HJA_REGEX 67
-#define SCE_HB_START 70
-#define SCE_HB_DEFAULT 71
-#define SCE_HB_COMMENTLINE 72
-#define SCE_HB_NUMBER 73
-#define SCE_HB_WORD 74
-#define SCE_HB_STRING 75
-#define SCE_HB_IDENTIFIER 76
-#define SCE_HB_STRINGEOL 77
-#define SCE_HBA_START 80
-#define SCE_HBA_DEFAULT 81
-#define SCE_HBA_COMMENTLINE 82
-#define SCE_HBA_NUMBER 83
-#define SCE_HBA_WORD 84
-#define SCE_HBA_STRING 85
-#define SCE_HBA_IDENTIFIER 86
-#define SCE_HBA_STRINGEOL 87
-#define SCE_HP_START 90
-#define SCE_HP_DEFAULT 91
-#define SCE_HP_COMMENTLINE 92
-#define SCE_HP_NUMBER 93
-#define SCE_HP_STRING 94
-#define SCE_HP_CHARACTER 95
-#define SCE_HP_WORD 96
-#define SCE_HP_TRIPLE 97
-#define SCE_HP_TRIPLEDOUBLE 98
-#define SCE_HP_CLASSNAME 99
-#define SCE_HP_DEFNAME 100
-#define SCE_HP_OPERATOR 101
-#define SCE_HP_IDENTIFIER 102
-#define SCE_HPHP_COMPLEX_VARIABLE 104
-#define SCE_HPA_START 105
-#define SCE_HPA_DEFAULT 106
-#define SCE_HPA_COMMENTLINE 107
-#define SCE_HPA_NUMBER 108
-#define SCE_HPA_STRING 109
-#define SCE_HPA_CHARACTER 110
-#define SCE_HPA_WORD 111
-#define SCE_HPA_TRIPLE 112
-#define SCE_HPA_TRIPLEDOUBLE 113
-#define SCE_HPA_CLASSNAME 114
-#define SCE_HPA_DEFNAME 115
-#define SCE_HPA_OPERATOR 116
-#define SCE_HPA_IDENTIFIER 117
-#define SCE_HPHP_DEFAULT 118
-#define SCE_HPHP_HSTRING 119
-#define SCE_HPHP_SIMPLESTRING 120
-#define SCE_HPHP_WORD 121
-#define SCE_HPHP_NUMBER 122
-#define SCE_HPHP_VARIABLE 123
-#define SCE_HPHP_COMMENT 124
-#define SCE_HPHP_COMMENTLINE 125
-#define SCE_HPHP_HSTRING_VARIABLE 126
-#define SCE_HPHP_OPERATOR 127
-#define SCE_PL_DEFAULT 0
-#define SCE_PL_ERROR 1
-#define SCE_PL_COMMENTLINE 2
-#define SCE_PL_POD 3
-#define SCE_PL_NUMBER 4
-#define SCE_PL_WORD 5
-#define SCE_PL_STRING 6
-#define SCE_PL_CHARACTER 7
-#define SCE_PL_PUNCTUATION 8
-#define SCE_PL_PREPROCESSOR 9
-#define SCE_PL_OPERATOR 10
-#define SCE_PL_IDENTIFIER 11
-#define SCE_PL_SCALAR 12
-#define SCE_PL_ARRAY 13
-#define SCE_PL_HASH 14
-#define SCE_PL_SYMBOLTABLE 15
-#define SCE_PL_VARIABLE_INDEXER 16
-#define SCE_PL_REGEX 17
-#define SCE_PL_REGSUBST 18
-#define SCE_PL_LONGQUOTE 19
-#define SCE_PL_BACKTICKS 20
-#define SCE_PL_DATASECTION 21
-#define SCE_PL_HERE_DELIM 22
-#define SCE_PL_HERE_Q 23
-#define SCE_PL_HERE_QQ 24
-#define SCE_PL_HERE_QX 25
-#define SCE_PL_STRING_Q 26
-#define SCE_PL_STRING_QQ 27
-#define SCE_PL_STRING_QX 28
-#define SCE_PL_STRING_QR 29
-#define SCE_PL_STRING_QW 30
-#define SCE_PL_POD_VERB 31
-#define SCE_PL_SUB_PROTOTYPE 40
-#define SCE_PL_FORMAT_IDENT 41
-#define SCE_PL_FORMAT 42
-#define SCE_PL_STRING_VAR 43
-#define SCE_PL_XLAT 44
-#define SCE_PL_REGEX_VAR 54
-#define SCE_PL_REGSUBST_VAR 55
-#define SCE_PL_BACKTICKS_VAR 57
-#define SCE_PL_HERE_QQ_VAR 61
-#define SCE_PL_HERE_QX_VAR 62
-#define SCE_PL_STRING_QQ_VAR 64
-#define SCE_PL_STRING_QX_VAR 65
-#define SCE_PL_STRING_QR_VAR 66
-#define SCE_RB_DEFAULT 0
-#define SCE_RB_ERROR 1
-#define SCE_RB_COMMENTLINE 2
-#define SCE_RB_POD 3
-#define SCE_RB_NUMBER 4
-#define SCE_RB_WORD 5
-#define SCE_RB_STRING 6
-#define SCE_RB_CHARACTER 7
-#define SCE_RB_CLASSNAME 8
-#define SCE_RB_DEFNAME 9
-#define SCE_RB_OPERATOR 10
-#define SCE_RB_IDENTIFIER 11
-#define SCE_RB_REGEX 12
-#define SCE_RB_GLOBAL 13
-#define SCE_RB_SYMBOL 14
-#define SCE_RB_MODULE_NAME 15
-#define SCE_RB_INSTANCE_VAR 16
-#define SCE_RB_CLASS_VAR 17
-#define SCE_RB_BACKTICKS 18
-#define SCE_RB_DATASECTION 19
-#define SCE_RB_HERE_DELIM 20
-#define SCE_RB_HERE_Q 21
-#define SCE_RB_HERE_QQ 22
-#define SCE_RB_HERE_QX 23
-#define SCE_RB_STRING_Q 24
-#define SCE_RB_STRING_QQ 25
-#define SCE_RB_STRING_QX 26
-#define SCE_RB_STRING_QR 27
-#define SCE_RB_STRING_QW 28
-#define SCE_RB_WORD_DEMOTED 29
-#define SCE_RB_STDIN 30
-#define SCE_RB_STDOUT 31
-#define SCE_RB_STDERR 40
-#define SCE_RB_UPPER_BOUND 41
-#define SCE_B_DEFAULT 0
-#define SCE_B_COMMENT 1
-#define SCE_B_NUMBER 2
-#define SCE_B_KEYWORD 3
-#define SCE_B_STRING 4
-#define SCE_B_PREPROCESSOR 5
-#define SCE_B_OPERATOR 6
-#define SCE_B_IDENTIFIER 7
-#define SCE_B_DATE 8
-#define SCE_B_STRINGEOL 9
-#define SCE_B_KEYWORD2 10
-#define SCE_B_KEYWORD3 11
-#define SCE_B_KEYWORD4 12
-#define SCE_B_CONSTANT 13
-#define SCE_B_ASM 14
-#define SCE_B_LABEL 15
-#define SCE_B_ERROR 16
-#define SCE_B_HEXNUMBER 17
-#define SCE_B_BINNUMBER 18
-#define SCE_B_COMMENTBLOCK 19
-#define SCE_B_DOCLINE 20
-#define SCE_B_DOCBLOCK 21
-#define SCE_B_DOCKEYWORD 22
-#define SCE_PROPS_DEFAULT 0
-#define SCE_PROPS_COMMENT 1
-#define SCE_PROPS_SECTION 2
-#define SCE_PROPS_ASSIGNMENT 3
-#define SCE_PROPS_DEFVAL 4
-#define SCE_PROPS_KEY 5
-#define SCE_L_DEFAULT 0
-#define SCE_L_COMMAND 1
-#define SCE_L_TAG 2
-#define SCE_L_MATH 3
-#define SCE_L_COMMENT 4
-#define SCE_L_TAG2 5
-#define SCE_L_MATH2 6
-#define SCE_L_COMMENT2 7
-#define SCE_L_VERBATIM 8
-#define SCE_L_SHORTCMD 9
-#define SCE_L_SPECIAL 10
-#define SCE_L_CMDOPT 11
-#define SCE_L_ERROR 12
-#define SCE_LUA_DEFAULT 0
-#define SCE_LUA_COMMENT 1
-#define SCE_LUA_COMMENTLINE 2
-#define SCE_LUA_COMMENTDOC 3
-#define SCE_LUA_NUMBER 4
-#define SCE_LUA_WORD 5
-#define SCE_LUA_STRING 6
-#define SCE_LUA_CHARACTER 7
-#define SCE_LUA_LITERALSTRING 8
-#define SCE_LUA_PREPROCESSOR 9
-#define SCE_LUA_OPERATOR 10
-#define SCE_LUA_IDENTIFIER 11
-#define SCE_LUA_STRINGEOL 12
-#define SCE_LUA_WORD2 13
-#define SCE_LUA_WORD3 14
-#define SCE_LUA_WORD4 15
-#define SCE_LUA_WORD5 16
-#define SCE_LUA_WORD6 17
-#define SCE_LUA_WORD7 18
-#define SCE_LUA_WORD8 19
-#define SCE_LUA_LABEL 20
-#define SCE_ERR_DEFAULT 0
-#define SCE_ERR_PYTHON 1
-#define SCE_ERR_GCC 2
-#define SCE_ERR_MS 3
-#define SCE_ERR_CMD 4
-#define SCE_ERR_BORLAND 5
-#define SCE_ERR_PERL 6
-#define SCE_ERR_NET 7
-#define SCE_ERR_LUA 8
-#define SCE_ERR_CTAG 9
-#define SCE_ERR_DIFF_CHANGED 10
-#define SCE_ERR_DIFF_ADDITION 11
-#define SCE_ERR_DIFF_DELETION 12
-#define SCE_ERR_DIFF_MESSAGE 13
-#define SCE_ERR_PHP 14
-#define SCE_ERR_ELF 15
-#define SCE_ERR_IFC 16
-#define SCE_ERR_IFORT 17
-#define SCE_ERR_ABSF 18
-#define SCE_ERR_TIDY 19
-#define SCE_ERR_JAVA_STACK 20
-#define SCE_ERR_VALUE 21
-#define SCE_ERR_GCC_INCLUDED_FROM 22
-#define SCE_ERR_ESCSEQ 23
-#define SCE_ERR_ESCSEQ_UNKNOWN 24
-#define SCE_ERR_GCC_EXCERPT 25
-#define SCE_ERR_ES_BLACK 40
-#define SCE_ERR_ES_RED 41
-#define SCE_ERR_ES_GREEN 42
-#define SCE_ERR_ES_BROWN 43
-#define SCE_ERR_ES_BLUE 44
-#define SCE_ERR_ES_MAGENTA 45
-#define SCE_ERR_ES_CYAN 46
-#define SCE_ERR_ES_GRAY 47
-#define SCE_ERR_ES_DARK_GRAY 48
-#define SCE_ERR_ES_BRIGHT_RED 49
-#define SCE_ERR_ES_BRIGHT_GREEN 50
-#define SCE_ERR_ES_YELLOW 51
-#define SCE_ERR_ES_BRIGHT_BLUE 52
-#define SCE_ERR_ES_BRIGHT_MAGENTA 53
-#define SCE_ERR_ES_BRIGHT_CYAN 54
-#define SCE_ERR_ES_WHITE 55
-#define SCE_BAT_DEFAULT 0
-#define SCE_BAT_COMMENT 1
-#define SCE_BAT_WORD 2
-#define SCE_BAT_LABEL 3
-#define SCE_BAT_HIDE 4
-#define SCE_BAT_COMMAND 5
-#define SCE_BAT_IDENTIFIER 6
-#define SCE_BAT_OPERATOR 7
-#define SCE_TCMD_DEFAULT 0
-#define SCE_TCMD_COMMENT 1
-#define SCE_TCMD_WORD 2
-#define SCE_TCMD_LABEL 3
-#define SCE_TCMD_HIDE 4
-#define SCE_TCMD_COMMAND 5
-#define SCE_TCMD_IDENTIFIER 6
-#define SCE_TCMD_OPERATOR 7
-#define SCE_TCMD_ENVIRONMENT 8
-#define SCE_TCMD_EXPANSION 9
-#define SCE_TCMD_CLABEL 10
-#define SCE_MAKE_DEFAULT 0
-#define SCE_MAKE_COMMENT 1
-#define SCE_MAKE_PREPROCESSOR 2
-#define SCE_MAKE_IDENTIFIER 3
-#define SCE_MAKE_OPERATOR 4
-#define SCE_MAKE_TARGET 5
-#define SCE_MAKE_IDEOL 9
-#define SCE_DIFF_DEFAULT 0
-#define SCE_DIFF_COMMENT 1
-#define SCE_DIFF_COMMAND 2
-#define SCE_DIFF_HEADER 3
-#define SCE_DIFF_POSITION 4
-#define SCE_DIFF_DELETED 5
-#define SCE_DIFF_ADDED 6
-#define SCE_DIFF_CHANGED 7
-#define SCE_DIFF_PATCH_ADD 8
-#define SCE_DIFF_PATCH_DELETE 9
-#define SCE_DIFF_REMOVED_PATCH_ADD 10
-#define SCE_DIFF_REMOVED_PATCH_DELETE 11
-#define SCE_CONF_DEFAULT 0
-#define SCE_CONF_COMMENT 1
-#define SCE_CONF_NUMBER 2
-#define SCE_CONF_IDENTIFIER 3
-#define SCE_CONF_EXTENSION 4
-#define SCE_CONF_PARAMETER 5
-#define SCE_CONF_STRING 6
-#define SCE_CONF_OPERATOR 7
-#define SCE_CONF_IP 8
-#define SCE_CONF_DIRECTIVE 9
-#define SCE_AVE_DEFAULT 0
-#define SCE_AVE_COMMENT 1
-#define SCE_AVE_NUMBER 2
-#define SCE_AVE_WORD 3
-#define SCE_AVE_STRING 6
-#define SCE_AVE_ENUM 7
-#define SCE_AVE_STRINGEOL 8
-#define SCE_AVE_IDENTIFIER 9
-#define SCE_AVE_OPERATOR 10
-#define SCE_AVE_WORD1 11
-#define SCE_AVE_WORD2 12
-#define SCE_AVE_WORD3 13
-#define SCE_AVE_WORD4 14
-#define SCE_AVE_WORD5 15
-#define SCE_AVE_WORD6 16
-#define SCE_ADA_DEFAULT 0
-#define SCE_ADA_WORD 1
-#define SCE_ADA_IDENTIFIER 2
-#define SCE_ADA_NUMBER 3
-#define SCE_ADA_DELIMITER 4
-#define SCE_ADA_CHARACTER 5
-#define SCE_ADA_CHARACTEREOL 6
-#define SCE_ADA_STRING 7
-#define SCE_ADA_STRINGEOL 8
-#define SCE_ADA_LABEL 9
-#define SCE_ADA_COMMENTLINE 10
-#define SCE_ADA_ILLEGAL 11
-#define SCE_BAAN_DEFAULT 0
-#define SCE_BAAN_COMMENT 1
-#define SCE_BAAN_COMMENTDOC 2
-#define SCE_BAAN_NUMBER 3
-#define SCE_BAAN_WORD 4
-#define SCE_BAAN_STRING 5
-#define SCE_BAAN_PREPROCESSOR 6
-#define SCE_BAAN_OPERATOR 7
-#define SCE_BAAN_IDENTIFIER 8
-#define SCE_BAAN_STRINGEOL 9
-#define SCE_BAAN_WORD2 10
-#define SCE_BAAN_WORD3 11
-#define SCE_BAAN_WORD4 12
-#define SCE_BAAN_WORD5 13
-#define SCE_BAAN_WORD6 14
-#define SCE_BAAN_WORD7 15
-#define SCE_BAAN_WORD8 16
-#define SCE_BAAN_WORD9 17
-#define SCE_BAAN_TABLEDEF 18
-#define SCE_BAAN_TABLESQL 19
-#define SCE_BAAN_FUNCTION 20
-#define SCE_BAAN_DOMDEF 21
-#define SCE_BAAN_FUNCDEF 22
-#define SCE_BAAN_OBJECTDEF 23
-#define SCE_BAAN_DEFINEDEF 24
-#define SCE_LISP_DEFAULT 0
-#define SCE_LISP_COMMENT 1
-#define SCE_LISP_NUMBER 2
-#define SCE_LISP_KEYWORD 3
-#define SCE_LISP_KEYWORD_KW 4
-#define SCE_LISP_SYMBOL 5
-#define SCE_LISP_STRING 6
-#define SCE_LISP_STRINGEOL 8
-#define SCE_LISP_IDENTIFIER 9
-#define SCE_LISP_OPERATOR 10
-#define SCE_LISP_SPECIAL 11
-#define SCE_LISP_MULTI_COMMENT 12
-#define SCE_EIFFEL_DEFAULT 0
-#define SCE_EIFFEL_COMMENTLINE 1
-#define SCE_EIFFEL_NUMBER 2
-#define SCE_EIFFEL_WORD 3
-#define SCE_EIFFEL_STRING 4
-#define SCE_EIFFEL_CHARACTER 5
-#define SCE_EIFFEL_OPERATOR 6
-#define SCE_EIFFEL_IDENTIFIER 7
-#define SCE_EIFFEL_STRINGEOL 8
-#define SCE_NNCRONTAB_DEFAULT 0
-#define SCE_NNCRONTAB_COMMENT 1
-#define SCE_NNCRONTAB_TASK 2
-#define SCE_NNCRONTAB_SECTION 3
-#define SCE_NNCRONTAB_KEYWORD 4
-#define SCE_NNCRONTAB_MODIFIER 5
-#define SCE_NNCRONTAB_ASTERISK 6
-#define SCE_NNCRONTAB_NUMBER 7
-#define SCE_NNCRONTAB_STRING 8
-#define SCE_NNCRONTAB_ENVIRONMENT 9
-#define SCE_NNCRONTAB_IDENTIFIER 10
-#define SCE_FORTH_DEFAULT 0
-#define SCE_FORTH_COMMENT 1
-#define SCE_FORTH_COMMENT_ML 2
-#define SCE_FORTH_IDENTIFIER 3
-#define SCE_FORTH_CONTROL 4
-#define SCE_FORTH_KEYWORD 5
-#define SCE_FORTH_DEFWORD 6
-#define SCE_FORTH_PREWORD1 7
-#define SCE_FORTH_PREWORD2 8
-#define SCE_FORTH_NUMBER 9
-#define SCE_FORTH_STRING 10
-#define SCE_FORTH_LOCALE 11
-#define SCE_MATLAB_DEFAULT 0
-#define SCE_MATLAB_COMMENT 1
-#define SCE_MATLAB_COMMAND 2
-#define SCE_MATLAB_NUMBER 3
-#define SCE_MATLAB_KEYWORD 4
-#define SCE_MATLAB_STRING 5
-#define SCE_MATLAB_OPERATOR 6
-#define SCE_MATLAB_IDENTIFIER 7
-#define SCE_MATLAB_DOUBLEQUOTESTRING 8
-#define SCE_MAXIMA_OPERATOR 0
-#define SCE_MAXIMA_COMMANDENDING 1
-#define SCE_MAXIMA_COMMENT 2
-#define SCE_MAXIMA_NUMBER 3
-#define SCE_MAXIMA_STRING 4
-#define SCE_MAXIMA_COMMAND 5
-#define SCE_MAXIMA_VARIABLE 6
-#define SCE_MAXIMA_UNKNOWN 7
-#define SCE_SCRIPTOL_DEFAULT 0
-#define SCE_SCRIPTOL_WHITE 1
-#define SCE_SCRIPTOL_COMMENTLINE 2
-#define SCE_SCRIPTOL_PERSISTENT 3
-#define SCE_SCRIPTOL_CSTYLE 4
-#define SCE_SCRIPTOL_COMMENTBLOCK 5
-#define SCE_SCRIPTOL_NUMBER 6
-#define SCE_SCRIPTOL_STRING 7
-#define SCE_SCRIPTOL_CHARACTER 8
-#define SCE_SCRIPTOL_STRINGEOL 9
-#define SCE_SCRIPTOL_KEYWORD 10
-#define SCE_SCRIPTOL_OPERATOR 11
-#define SCE_SCRIPTOL_IDENTIFIER 12
-#define SCE_SCRIPTOL_TRIPLE 13
-#define SCE_SCRIPTOL_CLASSNAME 14
-#define SCE_SCRIPTOL_PREPROCESSOR 15
-#define SCE_ASM_DEFAULT 0
-#define SCE_ASM_COMMENT 1
-#define SCE_ASM_NUMBER 2
-#define SCE_ASM_STRING 3
-#define SCE_ASM_OPERATOR 4
-#define SCE_ASM_IDENTIFIER 5
-#define SCE_ASM_CPUINSTRUCTION 6
-#define SCE_ASM_MATHINSTRUCTION 7
-#define SCE_ASM_REGISTER 8
-#define SCE_ASM_DIRECTIVE 9
-#define SCE_ASM_DIRECTIVEOPERAND 10
-#define SCE_ASM_COMMENTBLOCK 11
-#define SCE_ASM_CHARACTER 12
-#define SCE_ASM_STRINGEOL 13
-#define SCE_ASM_EXTINSTRUCTION 14
-#define SCE_ASM_COMMENTDIRECTIVE 15
-#define SCE_F_DEFAULT 0
-#define SCE_F_COMMENT 1
-#define SCE_F_NUMBER 2
-#define SCE_F_STRING1 3
-#define SCE_F_STRING2 4
-#define SCE_F_STRINGEOL 5
-#define SCE_F_OPERATOR 6
-#define SCE_F_IDENTIFIER 7
-#define SCE_F_WORD 8
-#define SCE_F_WORD2 9
-#define SCE_F_WORD3 10
-#define SCE_F_PREPROCESSOR 11
-#define SCE_F_OPERATOR2 12
-#define SCE_F_LABEL 13
-#define SCE_F_CONTINUATION 14
-#define SCE_CSS_DEFAULT 0
-#define SCE_CSS_TAG 1
-#define SCE_CSS_CLASS 2
-#define SCE_CSS_PSEUDOCLASS 3
-#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4
-#define SCE_CSS_OPERATOR 5
-#define SCE_CSS_IDENTIFIER 6
-#define SCE_CSS_UNKNOWN_IDENTIFIER 7
-#define SCE_CSS_VALUE 8
-#define SCE_CSS_COMMENT 9
-#define SCE_CSS_ID 10
-#define SCE_CSS_IMPORTANT 11
-#define SCE_CSS_DIRECTIVE 12
-#define SCE_CSS_DOUBLESTRING 13
-#define SCE_CSS_SINGLESTRING 14
-#define SCE_CSS_IDENTIFIER2 15
-#define SCE_CSS_ATTRIBUTE 16
-#define SCE_CSS_IDENTIFIER3 17
-#define SCE_CSS_PSEUDOELEMENT 18
-#define SCE_CSS_EXTENDED_IDENTIFIER 19
-#define SCE_CSS_EXTENDED_PSEUDOCLASS 20
-#define SCE_CSS_EXTENDED_PSEUDOELEMENT 21
-#define SCE_CSS_MEDIA 22
-#define SCE_CSS_VARIABLE 23
-#define SCE_POV_DEFAULT 0
-#define SCE_POV_COMMENT 1
-#define SCE_POV_COMMENTLINE 2
-#define SCE_POV_NUMBER 3
-#define SCE_POV_OPERATOR 4
-#define SCE_POV_IDENTIFIER 5
-#define SCE_POV_STRING 6
-#define SCE_POV_STRINGEOL 7
-#define SCE_POV_DIRECTIVE 8
-#define SCE_POV_BADDIRECTIVE 9
-#define SCE_POV_WORD2 10
-#define SCE_POV_WORD3 11
-#define SCE_POV_WORD4 12
-#define SCE_POV_WORD5 13
-#define SCE_POV_WORD6 14
-#define SCE_POV_WORD7 15
-#define SCE_POV_WORD8 16
-#define SCE_LOUT_DEFAULT 0
-#define SCE_LOUT_COMMENT 1
-#define SCE_LOUT_NUMBER 2
-#define SCE_LOUT_WORD 3
-#define SCE_LOUT_WORD2 4
-#define SCE_LOUT_WORD3 5
-#define SCE_LOUT_WORD4 6
-#define SCE_LOUT_STRING 7
-#define SCE_LOUT_OPERATOR 8
-#define SCE_LOUT_IDENTIFIER 9
-#define SCE_LOUT_STRINGEOL 10
-#define SCE_ESCRIPT_DEFAULT 0
-#define SCE_ESCRIPT_COMMENT 1
-#define SCE_ESCRIPT_COMMENTLINE 2
-#define SCE_ESCRIPT_COMMENTDOC 3
-#define SCE_ESCRIPT_NUMBER 4
-#define SCE_ESCRIPT_WORD 5
-#define SCE_ESCRIPT_STRING 6
-#define SCE_ESCRIPT_OPERATOR 7
-#define SCE_ESCRIPT_IDENTIFIER 8
-#define SCE_ESCRIPT_BRACE 9
-#define SCE_ESCRIPT_WORD2 10
-#define SCE_ESCRIPT_WORD3 11
-#define SCE_PS_DEFAULT 0
-#define SCE_PS_COMMENT 1
-#define SCE_PS_DSC_COMMENT 2
-#define SCE_PS_DSC_VALUE 3
-#define SCE_PS_NUMBER 4
-#define SCE_PS_NAME 5
-#define SCE_PS_KEYWORD 6
-#define SCE_PS_LITERAL 7
-#define SCE_PS_IMMEVAL 8
-#define SCE_PS_PAREN_ARRAY 9
-#define SCE_PS_PAREN_DICT 10
-#define SCE_PS_PAREN_PROC 11
-#define SCE_PS_TEXT 12
-#define SCE_PS_HEXSTRING 13
-#define SCE_PS_BASE85STRING 14
-#define SCE_PS_BADSTRINGCHAR 15
-#define SCE_NSIS_DEFAULT 0
-#define SCE_NSIS_COMMENT 1
-#define SCE_NSIS_STRINGDQ 2
-#define SCE_NSIS_STRINGLQ 3
-#define SCE_NSIS_STRINGRQ 4
-#define SCE_NSIS_FUNCTION 5
-#define SCE_NSIS_VARIABLE 6
-#define SCE_NSIS_LABEL 7
-#define SCE_NSIS_USERDEFINED 8
-#define SCE_NSIS_SECTIONDEF 9
-#define SCE_NSIS_SUBSECTIONDEF 10
-#define SCE_NSIS_IFDEFINEDEF 11
-#define SCE_NSIS_MACRODEF 12
-#define SCE_NSIS_STRINGVAR 13
-#define SCE_NSIS_NUMBER 14
-#define SCE_NSIS_SECTIONGROUP 15
-#define SCE_NSIS_PAGEEX 16
-#define SCE_NSIS_FUNCTIONDEF 17
-#define SCE_NSIS_COMMENTBOX 18
-#define SCE_MMIXAL_LEADWS 0
-#define SCE_MMIXAL_COMMENT 1
-#define SCE_MMIXAL_LABEL 2
-#define SCE_MMIXAL_OPCODE 3
-#define SCE_MMIXAL_OPCODE_PRE 4
-#define SCE_MMIXAL_OPCODE_VALID 5
-#define SCE_MMIXAL_OPCODE_UNKNOWN 6
-#define SCE_MMIXAL_OPCODE_POST 7
-#define SCE_MMIXAL_OPERANDS 8
-#define SCE_MMIXAL_NUMBER 9
-#define SCE_MMIXAL_REF 10
-#define SCE_MMIXAL_CHAR 11
-#define SCE_MMIXAL_STRING 12
-#define SCE_MMIXAL_REGISTER 13
-#define SCE_MMIXAL_HEX 14
-#define SCE_MMIXAL_OPERATOR 15
-#define SCE_MMIXAL_SYMBOL 16
-#define SCE_MMIXAL_INCLUDE 17
-#define SCE_CLW_DEFAULT 0
-#define SCE_CLW_LABEL 1
-#define SCE_CLW_COMMENT 2
-#define SCE_CLW_STRING 3
-#define SCE_CLW_USER_IDENTIFIER 4
-#define SCE_CLW_INTEGER_CONSTANT 5
-#define SCE_CLW_REAL_CONSTANT 6
-#define SCE_CLW_PICTURE_STRING 7
-#define SCE_CLW_KEYWORD 8
-#define SCE_CLW_COMPILER_DIRECTIVE 9
-#define SCE_CLW_RUNTIME_EXPRESSIONS 10
-#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11
-#define SCE_CLW_STRUCTURE_DATA_TYPE 12
-#define SCE_CLW_ATTRIBUTE 13
-#define SCE_CLW_STANDARD_EQUATE 14
-#define SCE_CLW_ERROR 15
-#define SCE_CLW_DEPRECATED 16
-#define SCE_LOT_DEFAULT 0
-#define SCE_LOT_HEADER 1
-#define SCE_LOT_BREAK 2
-#define SCE_LOT_SET 3
-#define SCE_LOT_PASS 4
-#define SCE_LOT_FAIL 5
-#define SCE_LOT_ABORT 6
-#define SCE_YAML_DEFAULT 0
-#define SCE_YAML_COMMENT 1
-#define SCE_YAML_IDENTIFIER 2
-#define SCE_YAML_KEYWORD 3
-#define SCE_YAML_NUMBER 4
-#define SCE_YAML_REFERENCE 5
-#define SCE_YAML_DOCUMENT 6
-#define SCE_YAML_TEXT 7
-#define SCE_YAML_ERROR 8
-#define SCE_YAML_OPERATOR 9
-#define SCE_TEX_DEFAULT 0
-#define SCE_TEX_SPECIAL 1
-#define SCE_TEX_GROUP 2
-#define SCE_TEX_SYMBOL 3
-#define SCE_TEX_COMMAND 4
-#define SCE_TEX_TEXT 5
-#define SCE_METAPOST_DEFAULT 0
-#define SCE_METAPOST_SPECIAL 1
-#define SCE_METAPOST_GROUP 2
-#define SCE_METAPOST_SYMBOL 3
-#define SCE_METAPOST_COMMAND 4
-#define SCE_METAPOST_TEXT 5
-#define SCE_METAPOST_EXTRA 6
-#define SCE_ERLANG_DEFAULT 0
-#define SCE_ERLANG_COMMENT 1
-#define SCE_ERLANG_VARIABLE 2
-#define SCE_ERLANG_NUMBER 3
-#define SCE_ERLANG_KEYWORD 4
-#define SCE_ERLANG_STRING 5
-#define SCE_ERLANG_OPERATOR 6
-#define SCE_ERLANG_ATOM 7
-#define SCE_ERLANG_FUNCTION_NAME 8
-#define SCE_ERLANG_CHARACTER 9
-#define SCE_ERLANG_MACRO 10
-#define SCE_ERLANG_RECORD 11
-#define SCE_ERLANG_PREPROC 12
-#define SCE_ERLANG_NODE_NAME 13
-#define SCE_ERLANG_COMMENT_FUNCTION 14
-#define SCE_ERLANG_COMMENT_MODULE 15
-#define SCE_ERLANG_COMMENT_DOC 16
-#define SCE_ERLANG_COMMENT_DOC_MACRO 17
-#define SCE_ERLANG_ATOM_QUOTED 18
-#define SCE_ERLANG_MACRO_QUOTED 19
-#define SCE_ERLANG_RECORD_QUOTED 20
-#define SCE_ERLANG_NODE_NAME_QUOTED 21
-#define SCE_ERLANG_BIFS 22
-#define SCE_ERLANG_MODULES 23
-#define SCE_ERLANG_MODULES_ATT 24
-#define SCE_ERLANG_UNKNOWN 31
-#define SCE_MSSQL_DEFAULT 0
-#define SCE_MSSQL_COMMENT 1
-#define SCE_MSSQL_LINE_COMMENT 2
-#define SCE_MSSQL_NUMBER 3
-#define SCE_MSSQL_STRING 4
-#define SCE_MSSQL_OPERATOR 5
-#define SCE_MSSQL_IDENTIFIER 6
-#define SCE_MSSQL_VARIABLE 7
-#define SCE_MSSQL_COLUMN_NAME 8
-#define SCE_MSSQL_STATEMENT 9
-#define SCE_MSSQL_DATATYPE 10
-#define SCE_MSSQL_SYSTABLE 11
-#define SCE_MSSQL_GLOBAL_VARIABLE 12
-#define SCE_MSSQL_FUNCTION 13
-#define SCE_MSSQL_STORED_PROCEDURE 14
-#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15
-#define SCE_MSSQL_COLUMN_NAME_2 16
-#define SCE_V_DEFAULT 0
-#define SCE_V_COMMENT 1
-#define SCE_V_COMMENTLINE 2
-#define SCE_V_COMMENTLINEBANG 3
-#define SCE_V_NUMBER 4
-#define SCE_V_WORD 5
-#define SCE_V_STRING 6
-#define SCE_V_WORD2 7
-#define SCE_V_WORD3 8
-#define SCE_V_PREPROCESSOR 9
-#define SCE_V_OPERATOR 10
-#define SCE_V_IDENTIFIER 11
-#define SCE_V_STRINGEOL 12
-#define SCE_V_USER 19
-#define SCE_V_COMMENT_WORD 20
-#define SCE_V_INPUT 21
-#define SCE_V_OUTPUT 22
-#define SCE_V_INOUT 23
-#define SCE_V_PORT_CONNECT 24
-#define SCE_KIX_DEFAULT 0
-#define SCE_KIX_COMMENT 1
-#define SCE_KIX_STRING1 2
-#define SCE_KIX_STRING2 3
-#define SCE_KIX_NUMBER 4
-#define SCE_KIX_VAR 5
-#define SCE_KIX_MACRO 6
-#define SCE_KIX_KEYWORD 7
-#define SCE_KIX_FUNCTIONS 8
-#define SCE_KIX_OPERATOR 9
-#define SCE_KIX_COMMENTSTREAM 10
-#define SCE_KIX_IDENTIFIER 31
-#define SCE_GC_DEFAULT 0
-#define SCE_GC_COMMENTLINE 1
-#define SCE_GC_COMMENTBLOCK 2
-#define SCE_GC_GLOBAL 3
-#define SCE_GC_EVENT 4
-#define SCE_GC_ATTRIBUTE 5
-#define SCE_GC_CONTROL 6
-#define SCE_GC_COMMAND 7
-#define SCE_GC_STRING 8
-#define SCE_GC_OPERATOR 9
-#define SCE_SN_DEFAULT 0
-#define SCE_SN_CODE 1
-#define SCE_SN_COMMENTLINE 2
-#define SCE_SN_COMMENTLINEBANG 3
-#define SCE_SN_NUMBER 4
-#define SCE_SN_WORD 5
-#define SCE_SN_STRING 6
-#define SCE_SN_WORD2 7
-#define SCE_SN_WORD3 8
-#define SCE_SN_PREPROCESSOR 9
-#define SCE_SN_OPERATOR 10
-#define SCE_SN_IDENTIFIER 11
-#define SCE_SN_STRINGEOL 12
-#define SCE_SN_REGEXTAG 13
-#define SCE_SN_SIGNAL 14
-#define SCE_SN_USER 19
-#define SCE_AU3_DEFAULT 0
-#define SCE_AU3_COMMENT 1
-#define SCE_AU3_COMMENTBLOCK 2
-#define SCE_AU3_NUMBER 3
-#define SCE_AU3_FUNCTION 4
-#define SCE_AU3_KEYWORD 5
-#define SCE_AU3_MACRO 6
-#define SCE_AU3_STRING 7
-#define SCE_AU3_OPERATOR 8
-#define SCE_AU3_VARIABLE 9
-#define SCE_AU3_SENT 10
-#define SCE_AU3_PREPROCESSOR 11
-#define SCE_AU3_SPECIAL 12
-#define SCE_AU3_EXPAND 13
-#define SCE_AU3_COMOBJ 14
-#define SCE_AU3_UDF 15
-#define SCE_APDL_DEFAULT 0
-#define SCE_APDL_COMMENT 1
-#define SCE_APDL_COMMENTBLOCK 2
-#define SCE_APDL_NUMBER 3
-#define SCE_APDL_STRING 4
-#define SCE_APDL_OPERATOR 5
-#define SCE_APDL_WORD 6
-#define SCE_APDL_PROCESSOR 7
-#define SCE_APDL_COMMAND 8
-#define SCE_APDL_SLASHCOMMAND 9
-#define SCE_APDL_STARCOMMAND 10
-#define SCE_APDL_ARGUMENT 11
-#define SCE_APDL_FUNCTION 12
-#define SCE_SH_DEFAULT 0
-#define SCE_SH_ERROR 1
-#define SCE_SH_COMMENTLINE 2
-#define SCE_SH_NUMBER 3
-#define SCE_SH_WORD 4
-#define SCE_SH_STRING 5
-#define SCE_SH_CHARACTER 6
-#define SCE_SH_OPERATOR 7
-#define SCE_SH_IDENTIFIER 8
-#define SCE_SH_SCALAR 9
-#define SCE_SH_PARAM 10
-#define SCE_SH_BACKTICKS 11
-#define SCE_SH_HERE_DELIM 12
-#define SCE_SH_HERE_Q 13
-#define SCE_ASN1_DEFAULT 0
-#define SCE_ASN1_COMMENT 1
-#define SCE_ASN1_IDENTIFIER 2
-#define SCE_ASN1_STRING 3
-#define SCE_ASN1_OID 4
-#define SCE_ASN1_SCALAR 5
-#define SCE_ASN1_KEYWORD 6
-#define SCE_ASN1_ATTRIBUTE 7
-#define SCE_ASN1_DESCRIPTOR 8
-#define SCE_ASN1_TYPE 9
-#define SCE_ASN1_OPERATOR 10
-#define SCE_VHDL_DEFAULT 0
-#define SCE_VHDL_COMMENT 1
-#define SCE_VHDL_COMMENTLINEBANG 2
-#define SCE_VHDL_NUMBER 3
-#define SCE_VHDL_STRING 4
-#define SCE_VHDL_OPERATOR 5
-#define SCE_VHDL_IDENTIFIER 6
-#define SCE_VHDL_STRINGEOL 7
-#define SCE_VHDL_KEYWORD 8
-#define SCE_VHDL_STDOPERATOR 9
-#define SCE_VHDL_ATTRIBUTE 10
-#define SCE_VHDL_STDFUNCTION 11
-#define SCE_VHDL_STDPACKAGE 12
-#define SCE_VHDL_STDTYPE 13
-#define SCE_VHDL_USERWORD 14
-#define SCE_VHDL_BLOCK_COMMENT 15
-#define SCE_CAML_DEFAULT 0
-#define SCE_CAML_IDENTIFIER 1
-#define SCE_CAML_TAGNAME 2
-#define SCE_CAML_KEYWORD 3
-#define SCE_CAML_KEYWORD2 4
-#define SCE_CAML_KEYWORD3 5
-#define SCE_CAML_LINENUM 6
-#define SCE_CAML_OPERATOR 7
-#define SCE_CAML_NUMBER 8
-#define SCE_CAML_CHAR 9
-#define SCE_CAML_WHITE 10
-#define SCE_CAML_STRING 11
-#define SCE_CAML_COMMENT 12
-#define SCE_CAML_COMMENT1 13
-#define SCE_CAML_COMMENT2 14
-#define SCE_CAML_COMMENT3 15
-#define SCE_HA_DEFAULT 0
-#define SCE_HA_IDENTIFIER 1
-#define SCE_HA_KEYWORD 2
-#define SCE_HA_NUMBER 3
-#define SCE_HA_STRING 4
-#define SCE_HA_CHARACTER 5
-#define SCE_HA_CLASS 6
-#define SCE_HA_MODULE 7
-#define SCE_HA_CAPITAL 8
-#define SCE_HA_DATA 9
-#define SCE_HA_IMPORT 10
-#define SCE_HA_OPERATOR 11
-#define SCE_HA_INSTANCE 12
-#define SCE_HA_COMMENTLINE 13
-#define SCE_HA_COMMENTBLOCK 14
-#define SCE_HA_COMMENTBLOCK2 15
-#define SCE_HA_COMMENTBLOCK3 16
-#define SCE_HA_PRAGMA 17
-#define SCE_HA_PREPROCESSOR 18
-#define SCE_HA_STRINGEOL 19
-#define SCE_HA_RESERVED_OPERATOR 20
-#define SCE_HA_LITERATE_COMMENT 21
-#define SCE_HA_LITERATE_CODEDELIM 22
-#define SCE_T3_DEFAULT 0
-#define SCE_T3_X_DEFAULT 1
-#define SCE_T3_PREPROCESSOR 2
-#define SCE_T3_BLOCK_COMMENT 3
-#define SCE_T3_LINE_COMMENT 4
-#define SCE_T3_OPERATOR 5
-#define SCE_T3_KEYWORD 6
-#define SCE_T3_NUMBER 7
-#define SCE_T3_IDENTIFIER 8
-#define SCE_T3_S_STRING 9
-#define SCE_T3_D_STRING 10
-#define SCE_T3_X_STRING 11
-#define SCE_T3_LIB_DIRECTIVE 12
-#define SCE_T3_MSG_PARAM 13
-#define SCE_T3_HTML_TAG 14
-#define SCE_T3_HTML_DEFAULT 15
-#define SCE_T3_HTML_STRING 16
-#define SCE_T3_USER1 17
-#define SCE_T3_USER2 18
-#define SCE_T3_USER3 19
-#define SCE_T3_BRACE 20
-#define SCE_REBOL_DEFAULT 0
-#define SCE_REBOL_COMMENTLINE 1
-#define SCE_REBOL_COMMENTBLOCK 2
-#define SCE_REBOL_PREFACE 3
-#define SCE_REBOL_OPERATOR 4
-#define SCE_REBOL_CHARACTER 5
-#define SCE_REBOL_QUOTEDSTRING 6
-#define SCE_REBOL_BRACEDSTRING 7
-#define SCE_REBOL_NUMBER 8
-#define SCE_REBOL_PAIR 9
-#define SCE_REBOL_TUPLE 10
-#define SCE_REBOL_BINARY 11
-#define SCE_REBOL_MONEY 12
-#define SCE_REBOL_ISSUE 13
-#define SCE_REBOL_TAG 14
-#define SCE_REBOL_FILE 15
-#define SCE_REBOL_EMAIL 16
-#define SCE_REBOL_URL 17
-#define SCE_REBOL_DATE 18
-#define SCE_REBOL_TIME 19
-#define SCE_REBOL_IDENTIFIER 20
-#define SCE_REBOL_WORD 21
-#define SCE_REBOL_WORD2 22
-#define SCE_REBOL_WORD3 23
-#define SCE_REBOL_WORD4 24
-#define SCE_REBOL_WORD5 25
-#define SCE_REBOL_WORD6 26
-#define SCE_REBOL_WORD7 27
-#define SCE_REBOL_WORD8 28
-#define SCE_SQL_DEFAULT 0
-#define SCE_SQL_COMMENT 1
-#define SCE_SQL_COMMENTLINE 2
-#define SCE_SQL_COMMENTDOC 3
-#define SCE_SQL_NUMBER 4
-#define SCE_SQL_WORD 5
-#define SCE_SQL_STRING 6
-#define SCE_SQL_CHARACTER 7
-#define SCE_SQL_SQLPLUS 8
-#define SCE_SQL_SQLPLUS_PROMPT 9
-#define SCE_SQL_OPERATOR 10
-#define SCE_SQL_IDENTIFIER 11
-#define SCE_SQL_SQLPLUS_COMMENT 13
-#define SCE_SQL_COMMENTLINEDOC 15
-#define SCE_SQL_WORD2 16
-#define SCE_SQL_COMMENTDOCKEYWORD 17
-#define SCE_SQL_COMMENTDOCKEYWORDERROR 18
-#define SCE_SQL_USER1 19
-#define SCE_SQL_USER2 20
-#define SCE_SQL_USER3 21
-#define SCE_SQL_USER4 22
-#define SCE_SQL_QUOTEDIDENTIFIER 23
-#define SCE_SQL_QOPERATOR 24
-#define SCE_ST_DEFAULT 0
-#define SCE_ST_STRING 1
-#define SCE_ST_NUMBER 2
-#define SCE_ST_COMMENT 3
-#define SCE_ST_SYMBOL 4
-#define SCE_ST_BINARY 5
-#define SCE_ST_BOOL 6
-#define SCE_ST_SELF 7
-#define SCE_ST_SUPER 8
-#define SCE_ST_NIL 9
-#define SCE_ST_GLOBAL 10
-#define SCE_ST_RETURN 11
-#define SCE_ST_SPECIAL 12
-#define SCE_ST_KWSEND 13
-#define SCE_ST_ASSIGN 14
-#define SCE_ST_CHARACTER 15
-#define SCE_ST_SPEC_SEL 16
-#define SCE_FS_DEFAULT 0
-#define SCE_FS_COMMENT 1
-#define SCE_FS_COMMENTLINE 2
-#define SCE_FS_COMMENTDOC 3
-#define SCE_FS_COMMENTLINEDOC 4
-#define SCE_FS_COMMENTDOCKEYWORD 5
-#define SCE_FS_COMMENTDOCKEYWORDERROR 6
-#define SCE_FS_KEYWORD 7
-#define SCE_FS_KEYWORD2 8
-#define SCE_FS_KEYWORD3 9
-#define SCE_FS_KEYWORD4 10
-#define SCE_FS_NUMBER 11
-#define SCE_FS_STRING 12
-#define SCE_FS_PREPROCESSOR 13
-#define SCE_FS_OPERATOR 14
-#define SCE_FS_IDENTIFIER 15
-#define SCE_FS_DATE 16
-#define SCE_FS_STRINGEOL 17
-#define SCE_FS_CONSTANT 18
-#define SCE_FS_WORDOPERATOR 19
-#define SCE_FS_DISABLEDCODE 20
-#define SCE_FS_DEFAULT_C 21
-#define SCE_FS_COMMENTDOC_C 22
-#define SCE_FS_COMMENTLINEDOC_C 23
-#define SCE_FS_KEYWORD_C 24
-#define SCE_FS_KEYWORD2_C 25
-#define SCE_FS_NUMBER_C 26
-#define SCE_FS_STRING_C 27
-#define SCE_FS_PREPROCESSOR_C 28
-#define SCE_FS_OPERATOR_C 29
-#define SCE_FS_IDENTIFIER_C 30
-#define SCE_FS_STRINGEOL_C 31
-#define SCE_CSOUND_DEFAULT 0
-#define SCE_CSOUND_COMMENT 1
-#define SCE_CSOUND_NUMBER 2
-#define SCE_CSOUND_OPERATOR 3
-#define SCE_CSOUND_INSTR 4
-#define SCE_CSOUND_IDENTIFIER 5
-#define SCE_CSOUND_OPCODE 6
-#define SCE_CSOUND_HEADERSTMT 7
-#define SCE_CSOUND_USERKEYWORD 8
-#define SCE_CSOUND_COMMENTBLOCK 9
-#define SCE_CSOUND_PARAM 10
-#define SCE_CSOUND_ARATE_VAR 11
-#define SCE_CSOUND_KRATE_VAR 12
-#define SCE_CSOUND_IRATE_VAR 13
-#define SCE_CSOUND_GLOBAL_VAR 14
-#define SCE_CSOUND_STRINGEOL 15
-#define SCE_INNO_DEFAULT 0
-#define SCE_INNO_COMMENT 1
-#define SCE_INNO_KEYWORD 2
-#define SCE_INNO_PARAMETER 3
-#define SCE_INNO_SECTION 4
-#define SCE_INNO_PREPROC 5
-#define SCE_INNO_INLINE_EXPANSION 6
-#define SCE_INNO_COMMENT_PASCAL 7
-#define SCE_INNO_KEYWORD_PASCAL 8
-#define SCE_INNO_KEYWORD_USER 9
-#define SCE_INNO_STRING_DOUBLE 10
-#define SCE_INNO_STRING_SINGLE 11
-#define SCE_INNO_IDENTIFIER 12
-#define SCE_OPAL_SPACE 0
-#define SCE_OPAL_COMMENT_BLOCK 1
-#define SCE_OPAL_COMMENT_LINE 2
-#define SCE_OPAL_INTEGER 3
-#define SCE_OPAL_KEYWORD 4
-#define SCE_OPAL_SORT 5
-#define SCE_OPAL_STRING 6
-#define SCE_OPAL_PAR 7
-#define SCE_OPAL_BOOL_CONST 8
-#define SCE_OPAL_DEFAULT 32
-#define SCE_SPICE_DEFAULT 0
-#define SCE_SPICE_IDENTIFIER 1
-#define SCE_SPICE_KEYWORD 2
-#define SCE_SPICE_KEYWORD2 3
-#define SCE_SPICE_KEYWORD3 4
-#define SCE_SPICE_NUMBER 5
-#define SCE_SPICE_DELIMITER 6
-#define SCE_SPICE_VALUE 7
-#define SCE_SPICE_COMMENTLINE 8
-#define SCE_CMAKE_DEFAULT 0
-#define SCE_CMAKE_COMMENT 1
-#define SCE_CMAKE_STRINGDQ 2
-#define SCE_CMAKE_STRINGLQ 3
-#define SCE_CMAKE_STRINGRQ 4
-#define SCE_CMAKE_COMMANDS 5
-#define SCE_CMAKE_PARAMETERS 6
-#define SCE_CMAKE_VARIABLE 7
-#define SCE_CMAKE_USERDEFINED 8
-#define SCE_CMAKE_WHILEDEF 9
-#define SCE_CMAKE_FOREACHDEF 10
-#define SCE_CMAKE_IFDEFINEDEF 11
-#define SCE_CMAKE_MACRODEF 12
-#define SCE_CMAKE_STRINGVAR 13
-#define SCE_CMAKE_NUMBER 14
-#define SCE_GAP_DEFAULT 0
-#define SCE_GAP_IDENTIFIER 1
-#define SCE_GAP_KEYWORD 2
-#define SCE_GAP_KEYWORD2 3
-#define SCE_GAP_KEYWORD3 4
-#define SCE_GAP_KEYWORD4 5
-#define SCE_GAP_STRING 6
-#define SCE_GAP_CHAR 7
-#define SCE_GAP_OPERATOR 8
-#define SCE_GAP_COMMENT 9
-#define SCE_GAP_NUMBER 10
-#define SCE_GAP_STRINGEOL 11
-#define SCE_PLM_DEFAULT 0
-#define SCE_PLM_COMMENT 1
-#define SCE_PLM_STRING 2
-#define SCE_PLM_NUMBER 3
-#define SCE_PLM_IDENTIFIER 4
-#define SCE_PLM_OPERATOR 5
-#define SCE_PLM_CONTROL 6
-#define SCE_PLM_KEYWORD 7
-#define SCE_ABL_DEFAULT 0
-#define SCE_ABL_NUMBER 1
-#define SCE_ABL_WORD 2
-#define SCE_ABL_STRING 3
-#define SCE_ABL_CHARACTER 4
-#define SCE_ABL_PREPROCESSOR 5
-#define SCE_ABL_OPERATOR 6
-#define SCE_ABL_IDENTIFIER 7
-#define SCE_ABL_BLOCK 8
-#define SCE_ABL_END 9
-#define SCE_ABL_COMMENT 10
-#define SCE_ABL_TASKMARKER 11
-#define SCE_ABL_LINECOMMENT 12
-#define SCE_ABAQUS_DEFAULT 0
-#define SCE_ABAQUS_COMMENT 1
-#define SCE_ABAQUS_COMMENTBLOCK 2
-#define SCE_ABAQUS_NUMBER 3
-#define SCE_ABAQUS_STRING 4
-#define SCE_ABAQUS_OPERATOR 5
-#define SCE_ABAQUS_WORD 6
-#define SCE_ABAQUS_PROCESSOR 7
-#define SCE_ABAQUS_COMMAND 8
-#define SCE_ABAQUS_SLASHCOMMAND 9
-#define SCE_ABAQUS_STARCOMMAND 10
-#define SCE_ABAQUS_ARGUMENT 11
-#define SCE_ABAQUS_FUNCTION 12
-#define SCE_ASY_DEFAULT 0
-#define SCE_ASY_COMMENT 1
-#define SCE_ASY_COMMENTLINE 2
-#define SCE_ASY_NUMBER 3
-#define SCE_ASY_WORD 4
-#define SCE_ASY_STRING 5
-#define SCE_ASY_CHARACTER 6
-#define SCE_ASY_OPERATOR 7
-#define SCE_ASY_IDENTIFIER 8
-#define SCE_ASY_STRINGEOL 9
-#define SCE_ASY_COMMENTLINEDOC 10
-#define SCE_ASY_WORD2 11
-#define SCE_R_DEFAULT 0
-#define SCE_R_COMMENT 1
-#define SCE_R_KWORD 2
-#define SCE_R_BASEKWORD 3
-#define SCE_R_OTHERKWORD 4
-#define SCE_R_NUMBER 5
-#define SCE_R_STRING 6
-#define SCE_R_STRING2 7
-#define SCE_R_OPERATOR 8
-#define SCE_R_IDENTIFIER 9
-#define SCE_R_INFIX 10
-#define SCE_R_INFIXEOL 11
-#define SCE_MAGIK_DEFAULT 0
-#define SCE_MAGIK_COMMENT 1
-#define SCE_MAGIK_HYPER_COMMENT 16
-#define SCE_MAGIK_STRING 2
-#define SCE_MAGIK_CHARACTER 3
-#define SCE_MAGIK_NUMBER 4
-#define SCE_MAGIK_IDENTIFIER 5
-#define SCE_MAGIK_OPERATOR 6
-#define SCE_MAGIK_FLOW 7
-#define SCE_MAGIK_CONTAINER 8
-#define SCE_MAGIK_BRACKET_BLOCK 9
-#define SCE_MAGIK_BRACE_BLOCK 10
-#define SCE_MAGIK_SQBRACKET_BLOCK 11
-#define SCE_MAGIK_UNKNOWN_KEYWORD 12
-#define SCE_MAGIK_KEYWORD 13
-#define SCE_MAGIK_PRAGMA 14
-#define SCE_MAGIK_SYMBOL 15
-#define SCE_POWERSHELL_DEFAULT 0
-#define SCE_POWERSHELL_COMMENT 1
-#define SCE_POWERSHELL_STRING 2
-#define SCE_POWERSHELL_CHARACTER 3
-#define SCE_POWERSHELL_NUMBER 4
-#define SCE_POWERSHELL_VARIABLE 5
-#define SCE_POWERSHELL_OPERATOR 6
-#define SCE_POWERSHELL_IDENTIFIER 7
-#define SCE_POWERSHELL_KEYWORD 8
-#define SCE_POWERSHELL_CMDLET 9
-#define SCE_POWERSHELL_ALIAS 10
-#define SCE_POWERSHELL_FUNCTION 11
-#define SCE_POWERSHELL_USER1 12
-#define SCE_POWERSHELL_COMMENTSTREAM 13
-#define SCE_POWERSHELL_HERE_STRING 14
-#define SCE_POWERSHELL_HERE_CHARACTER 15
-#define SCE_POWERSHELL_COMMENTDOCKEYWORD 16
-#define SCE_MYSQL_DEFAULT 0
-#define SCE_MYSQL_COMMENT 1
-#define SCE_MYSQL_COMMENTLINE 2
-#define SCE_MYSQL_VARIABLE 3
-#define SCE_MYSQL_SYSTEMVARIABLE 4
-#define SCE_MYSQL_KNOWNSYSTEMVARIABLE 5
-#define SCE_MYSQL_NUMBER 6
-#define SCE_MYSQL_MAJORKEYWORD 7
-#define SCE_MYSQL_KEYWORD 8
-#define SCE_MYSQL_DATABASEOBJECT 9
-#define SCE_MYSQL_PROCEDUREKEYWORD 10
-#define SCE_MYSQL_STRING 11
-#define SCE_MYSQL_SQSTRING 12
-#define SCE_MYSQL_DQSTRING 13
-#define SCE_MYSQL_OPERATOR 14
-#define SCE_MYSQL_FUNCTION 15
-#define SCE_MYSQL_IDENTIFIER 16
-#define SCE_MYSQL_QUOTEDIDENTIFIER 17
-#define SCE_MYSQL_USER1 18
-#define SCE_MYSQL_USER2 19
-#define SCE_MYSQL_USER3 20
-#define SCE_MYSQL_HIDDENCOMMAND 21
-#define SCE_MYSQL_PLACEHOLDER 22
-#define SCE_PO_DEFAULT 0
-#define SCE_PO_COMMENT 1
-#define SCE_PO_MSGID 2
-#define SCE_PO_MSGID_TEXT 3
-#define SCE_PO_MSGSTR 4
-#define SCE_PO_MSGSTR_TEXT 5
-#define SCE_PO_MSGCTXT 6
-#define SCE_PO_MSGCTXT_TEXT 7
-#define SCE_PO_FUZZY 8
-#define SCE_PO_PROGRAMMER_COMMENT 9
-#define SCE_PO_REFERENCE 10
-#define SCE_PO_FLAGS 11
-#define SCE_PO_MSGID_TEXT_EOL 12
-#define SCE_PO_MSGSTR_TEXT_EOL 13
-#define SCE_PO_MSGCTXT_TEXT_EOL 14
-#define SCE_PO_ERROR 15
-#define SCE_PAS_DEFAULT 0
-#define SCE_PAS_IDENTIFIER 1
-#define SCE_PAS_COMMENT 2
-#define SCE_PAS_COMMENT2 3
-#define SCE_PAS_COMMENTLINE 4
-#define SCE_PAS_PREPROCESSOR 5
-#define SCE_PAS_PREPROCESSOR2 6
-#define SCE_PAS_NUMBER 7
-#define SCE_PAS_HEXNUMBER 8
-#define SCE_PAS_WORD 9
-#define SCE_PAS_STRING 10
-#define SCE_PAS_STRINGEOL 11
-#define SCE_PAS_CHARACTER 12
-#define SCE_PAS_OPERATOR 13
-#define SCE_PAS_ASM 14
-#define SCE_SORCUS_DEFAULT 0
-#define SCE_SORCUS_COMMAND 1
-#define SCE_SORCUS_PARAMETER 2
-#define SCE_SORCUS_COMMENTLINE 3
-#define SCE_SORCUS_STRING 4
-#define SCE_SORCUS_STRINGEOL 5
-#define SCE_SORCUS_IDENTIFIER 6
-#define SCE_SORCUS_OPERATOR 7
-#define SCE_SORCUS_NUMBER 8
-#define SCE_SORCUS_CONSTANT 9
-#define SCE_POWERPRO_DEFAULT 0
-#define SCE_POWERPRO_COMMENTBLOCK 1
-#define SCE_POWERPRO_COMMENTLINE 2
-#define SCE_POWERPRO_NUMBER 3
-#define SCE_POWERPRO_WORD 4
-#define SCE_POWERPRO_WORD2 5
-#define SCE_POWERPRO_WORD3 6
-#define SCE_POWERPRO_WORD4 7
-#define SCE_POWERPRO_DOUBLEQUOTEDSTRING 8
-#define SCE_POWERPRO_SINGLEQUOTEDSTRING 9
-#define SCE_POWERPRO_LINECONTINUE 10
-#define SCE_POWERPRO_OPERATOR 11
-#define SCE_POWERPRO_IDENTIFIER 12
-#define SCE_POWERPRO_STRINGEOL 13
-#define SCE_POWERPRO_VERBATIM 14
-#define SCE_POWERPRO_ALTQUOTE 15
-#define SCE_POWERPRO_FUNCTION 16
-#define SCE_SML_DEFAULT 0
-#define SCE_SML_IDENTIFIER 1
-#define SCE_SML_TAGNAME 2
-#define SCE_SML_KEYWORD 3
-#define SCE_SML_KEYWORD2 4
-#define SCE_SML_KEYWORD3 5
-#define SCE_SML_LINENUM 6
-#define SCE_SML_OPERATOR 7
-#define SCE_SML_NUMBER 8
-#define SCE_SML_CHAR 9
-#define SCE_SML_STRING 11
-#define SCE_SML_COMMENT 12
-#define SCE_SML_COMMENT1 13
-#define SCE_SML_COMMENT2 14
-#define SCE_SML_COMMENT3 15
-#define SCE_MARKDOWN_DEFAULT 0
-#define SCE_MARKDOWN_LINE_BEGIN 1
-#define SCE_MARKDOWN_STRONG1 2
-#define SCE_MARKDOWN_STRONG2 3
-#define SCE_MARKDOWN_EM1 4
-#define SCE_MARKDOWN_EM2 5
-#define SCE_MARKDOWN_HEADER1 6
-#define SCE_MARKDOWN_HEADER2 7
-#define SCE_MARKDOWN_HEADER3 8
-#define SCE_MARKDOWN_HEADER4 9
-#define SCE_MARKDOWN_HEADER5 10
-#define SCE_MARKDOWN_HEADER6 11
-#define SCE_MARKDOWN_PRECHAR 12
-#define SCE_MARKDOWN_ULIST_ITEM 13
-#define SCE_MARKDOWN_OLIST_ITEM 14
-#define SCE_MARKDOWN_BLOCKQUOTE 15
-#define SCE_MARKDOWN_STRIKEOUT 16
-#define SCE_MARKDOWN_HRULE 17
-#define SCE_MARKDOWN_LINK 18
-#define SCE_MARKDOWN_CODE 19
-#define SCE_MARKDOWN_CODE2 20
-#define SCE_MARKDOWN_CODEBK 21
-#define SCE_TXT2TAGS_DEFAULT 0
-#define SCE_TXT2TAGS_LINE_BEGIN 1
-#define SCE_TXT2TAGS_STRONG1 2
-#define SCE_TXT2TAGS_STRONG2 3
-#define SCE_TXT2TAGS_EM1 4
-#define SCE_TXT2TAGS_EM2 5
-#define SCE_TXT2TAGS_HEADER1 6
-#define SCE_TXT2TAGS_HEADER2 7
-#define SCE_TXT2TAGS_HEADER3 8
-#define SCE_TXT2TAGS_HEADER4 9
-#define SCE_TXT2TAGS_HEADER5 10
-#define SCE_TXT2TAGS_HEADER6 11
-#define SCE_TXT2TAGS_PRECHAR 12
-#define SCE_TXT2TAGS_ULIST_ITEM 13
-#define SCE_TXT2TAGS_OLIST_ITEM 14
-#define SCE_TXT2TAGS_BLOCKQUOTE 15
-#define SCE_TXT2TAGS_STRIKEOUT 16
-#define SCE_TXT2TAGS_HRULE 17
-#define SCE_TXT2TAGS_LINK 18
-#define SCE_TXT2TAGS_CODE 19
-#define SCE_TXT2TAGS_CODE2 20
-#define SCE_TXT2TAGS_CODEBK 21
-#define SCE_TXT2TAGS_COMMENT 22
-#define SCE_TXT2TAGS_OPTION 23
-#define SCE_TXT2TAGS_PREPROC 24
-#define SCE_TXT2TAGS_POSTPROC 25
-#define SCE_A68K_DEFAULT 0
-#define SCE_A68K_COMMENT 1
-#define SCE_A68K_NUMBER_DEC 2
-#define SCE_A68K_NUMBER_BIN 3
-#define SCE_A68K_NUMBER_HEX 4
-#define SCE_A68K_STRING1 5
-#define SCE_A68K_OPERATOR 6
-#define SCE_A68K_CPUINSTRUCTION 7
-#define SCE_A68K_EXTINSTRUCTION 8
-#define SCE_A68K_REGISTER 9
-#define SCE_A68K_DIRECTIVE 10
-#define SCE_A68K_MACRO_ARG 11
-#define SCE_A68K_LABEL 12
-#define SCE_A68K_STRING2 13
-#define SCE_A68K_IDENTIFIER 14
-#define SCE_A68K_MACRO_DECLARATION 15
-#define SCE_A68K_COMMENT_WORD 16
-#define SCE_A68K_COMMENT_SPECIAL 17
-#define SCE_A68K_COMMENT_DOXYGEN 18
-#define SCE_MODULA_DEFAULT 0
-#define SCE_MODULA_COMMENT 1
-#define SCE_MODULA_DOXYCOMM 2
-#define SCE_MODULA_DOXYKEY 3
-#define SCE_MODULA_KEYWORD 4
-#define SCE_MODULA_RESERVED 5
-#define SCE_MODULA_NUMBER 6
-#define SCE_MODULA_BASENUM 7
-#define SCE_MODULA_FLOAT 8
-#define SCE_MODULA_STRING 9
-#define SCE_MODULA_STRSPEC 10
-#define SCE_MODULA_CHAR 11
-#define SCE_MODULA_CHARSPEC 12
-#define SCE_MODULA_PROC 13
-#define SCE_MODULA_PRAGMA 14
-#define SCE_MODULA_PRGKEY 15
-#define SCE_MODULA_OPERATOR 16
-#define SCE_MODULA_BADSTR 17
-#define SCE_COFFEESCRIPT_DEFAULT 0
-#define SCE_COFFEESCRIPT_COMMENT 1
-#define SCE_COFFEESCRIPT_COMMENTLINE 2
-#define SCE_COFFEESCRIPT_COMMENTDOC 3
-#define SCE_COFFEESCRIPT_NUMBER 4
-#define SCE_COFFEESCRIPT_WORD 5
-#define SCE_COFFEESCRIPT_STRING 6
-#define SCE_COFFEESCRIPT_CHARACTER 7
-#define SCE_COFFEESCRIPT_UUID 8
-#define SCE_COFFEESCRIPT_PREPROCESSOR 9
-#define SCE_COFFEESCRIPT_OPERATOR 10
-#define SCE_COFFEESCRIPT_IDENTIFIER 11
-#define SCE_COFFEESCRIPT_STRINGEOL 12
-#define SCE_COFFEESCRIPT_VERBATIM 13
-#define SCE_COFFEESCRIPT_REGEX 14
-#define SCE_COFFEESCRIPT_COMMENTLINEDOC 15
-#define SCE_COFFEESCRIPT_WORD2 16
-#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORD 17
-#define SCE_COFFEESCRIPT_COMMENTDOCKEYWORDERROR 18
-#define SCE_COFFEESCRIPT_GLOBALCLASS 19
-#define SCE_COFFEESCRIPT_STRINGRAW 20
-#define SCE_COFFEESCRIPT_TRIPLEVERBATIM 21
-#define SCE_COFFEESCRIPT_COMMENTBLOCK 22
-#define SCE_COFFEESCRIPT_VERBOSE_REGEX 23
-#define SCE_COFFEESCRIPT_VERBOSE_REGEX_COMMENT 24
-#define SCE_COFFEESCRIPT_INSTANCEPROPERTY 25
-#define SCE_AVS_DEFAULT 0
-#define SCE_AVS_COMMENTBLOCK 1
-#define SCE_AVS_COMMENTBLOCKN 2
-#define SCE_AVS_COMMENTLINE 3
-#define SCE_AVS_NUMBER 4
-#define SCE_AVS_OPERATOR 5
-#define SCE_AVS_IDENTIFIER 6
-#define SCE_AVS_STRING 7
-#define SCE_AVS_TRIPLESTRING 8
-#define SCE_AVS_KEYWORD 9
-#define SCE_AVS_FILTER 10
-#define SCE_AVS_PLUGIN 11
-#define SCE_AVS_FUNCTION 12
-#define SCE_AVS_CLIPPROP 13
-#define SCE_AVS_USERDFN 14
-#define SCE_ECL_DEFAULT 0
-#define SCE_ECL_COMMENT 1
-#define SCE_ECL_COMMENTLINE 2
-#define SCE_ECL_NUMBER 3
-#define SCE_ECL_STRING 4
-#define SCE_ECL_WORD0 5
-#define SCE_ECL_OPERATOR 6
-#define SCE_ECL_CHARACTER 7
-#define SCE_ECL_UUID 8
-#define SCE_ECL_PREPROCESSOR 9
-#define SCE_ECL_UNKNOWN 10
-#define SCE_ECL_IDENTIFIER 11
-#define SCE_ECL_STRINGEOL 12
-#define SCE_ECL_VERBATIM 13
-#define SCE_ECL_REGEX 14
-#define SCE_ECL_COMMENTLINEDOC 15
-#define SCE_ECL_WORD1 16
-#define SCE_ECL_COMMENTDOCKEYWORD 17
-#define SCE_ECL_COMMENTDOCKEYWORDERROR 18
-#define SCE_ECL_WORD2 19
-#define SCE_ECL_WORD3 20
-#define SCE_ECL_WORD4 21
-#define SCE_ECL_WORD5 22
-#define SCE_ECL_COMMENTDOC 23
-#define SCE_ECL_ADDED 24
-#define SCE_ECL_DELETED 25
-#define SCE_ECL_CHANGED 26
-#define SCE_ECL_MOVED 27
-#define SCE_OSCRIPT_DEFAULT 0
-#define SCE_OSCRIPT_LINE_COMMENT 1
-#define SCE_OSCRIPT_BLOCK_COMMENT 2
-#define SCE_OSCRIPT_DOC_COMMENT 3
-#define SCE_OSCRIPT_PREPROCESSOR 4
-#define SCE_OSCRIPT_NUMBER 5
-#define SCE_OSCRIPT_SINGLEQUOTE_STRING 6
-#define SCE_OSCRIPT_DOUBLEQUOTE_STRING 7
-#define SCE_OSCRIPT_CONSTANT 8
-#define SCE_OSCRIPT_IDENTIFIER 9
-#define SCE_OSCRIPT_GLOBAL 10
-#define SCE_OSCRIPT_KEYWORD 11
-#define SCE_OSCRIPT_OPERATOR 12
-#define SCE_OSCRIPT_LABEL 13
-#define SCE_OSCRIPT_TYPE 14
-#define SCE_OSCRIPT_FUNCTION 15
-#define SCE_OSCRIPT_OBJECT 16
-#define SCE_OSCRIPT_PROPERTY 17
-#define SCE_OSCRIPT_METHOD 18
-#define SCE_VISUALPROLOG_DEFAULT 0
-#define SCE_VISUALPROLOG_KEY_MAJOR 1
-#define SCE_VISUALPROLOG_KEY_MINOR 2
-#define SCE_VISUALPROLOG_KEY_DIRECTIVE 3
-#define SCE_VISUALPROLOG_COMMENT_BLOCK 4
-#define SCE_VISUALPROLOG_COMMENT_LINE 5
-#define SCE_VISUALPROLOG_COMMENT_KEY 6
-#define SCE_VISUALPROLOG_COMMENT_KEY_ERROR 7
-#define SCE_VISUALPROLOG_IDENTIFIER 8
-#define SCE_VISUALPROLOG_VARIABLE 9
-#define SCE_VISUALPROLOG_ANONYMOUS 10
-#define SCE_VISUALPROLOG_NUMBER 11
-#define SCE_VISUALPROLOG_OPERATOR 12
-#define SCE_VISUALPROLOG_CHARACTER 13
-#define SCE_VISUALPROLOG_CHARACTER_TOO_MANY 14
-#define SCE_VISUALPROLOG_CHARACTER_ESCAPE_ERROR 15
-#define SCE_VISUALPROLOG_STRING 16
-#define SCE_VISUALPROLOG_STRING_ESCAPE 17
-#define SCE_VISUALPROLOG_STRING_ESCAPE_ERROR 18
-#define SCE_VISUALPROLOG_STRING_EOL_OPEN 19
-#define SCE_VISUALPROLOG_STRING_VERBATIM 20
-#define SCE_VISUALPROLOG_STRING_VERBATIM_SPECIAL 21
-#define SCE_VISUALPROLOG_STRING_VERBATIM_EOL 22
-#define SCE_STTXT_DEFAULT 0
-#define SCE_STTXT_COMMENT 1
-#define SCE_STTXT_COMMENTLINE 2
-#define SCE_STTXT_KEYWORD 3
-#define SCE_STTXT_TYPE 4
-#define SCE_STTXT_FUNCTION 5
-#define SCE_STTXT_FB 6
-#define SCE_STTXT_NUMBER 7
-#define SCE_STTXT_HEXNUMBER 8
-#define SCE_STTXT_PRAGMA 9
-#define SCE_STTXT_OPERATOR 10
-#define SCE_STTXT_CHARACTER 11
-#define SCE_STTXT_STRING1 12
-#define SCE_STTXT_STRING2 13
-#define SCE_STTXT_STRINGEOL 14
-#define SCE_STTXT_IDENTIFIER 15
-#define SCE_STTXT_DATETIME 16
-#define SCE_STTXT_VARS 17
-#define SCE_STTXT_PRAGMAS 18
-#define SCE_KVIRC_DEFAULT 0
-#define SCE_KVIRC_COMMENT 1
-#define SCE_KVIRC_COMMENTBLOCK 2
-#define SCE_KVIRC_STRING 3
-#define SCE_KVIRC_WORD 4
-#define SCE_KVIRC_KEYWORD 5
-#define SCE_KVIRC_FUNCTION_KEYWORD 6
-#define SCE_KVIRC_FUNCTION 7
-#define SCE_KVIRC_VARIABLE 8
-#define SCE_KVIRC_NUMBER 9
-#define SCE_KVIRC_OPERATOR 10
-#define SCE_KVIRC_STRING_FUNCTION 11
-#define SCE_KVIRC_STRING_VARIABLE 12
-#define SCE_RUST_DEFAULT 0
-#define SCE_RUST_COMMENTBLOCK 1
-#define SCE_RUST_COMMENTLINE 2
-#define SCE_RUST_COMMENTBLOCKDOC 3
-#define SCE_RUST_COMMENTLINEDOC 4
-#define SCE_RUST_NUMBER 5
-#define SCE_RUST_WORD 6
-#define SCE_RUST_WORD2 7
-#define SCE_RUST_WORD3 8
-#define SCE_RUST_WORD4 9
-#define SCE_RUST_WORD5 10
-#define SCE_RUST_WORD6 11
-#define SCE_RUST_WORD7 12
-#define SCE_RUST_STRING 13
-#define SCE_RUST_STRINGR 14
-#define SCE_RUST_CHARACTER 15
-#define SCE_RUST_OPERATOR 16
-#define SCE_RUST_IDENTIFIER 17
-#define SCE_RUST_LIFETIME 18
-#define SCE_RUST_MACRO 19
-#define SCE_RUST_LEXERROR 20
-#define SCE_RUST_BYTESTRING 21
-#define SCE_RUST_BYTESTRINGR 22
-#define SCE_RUST_BYTECHARACTER 23
-#define SCE_DMAP_DEFAULT 0
-#define SCE_DMAP_COMMENT 1
-#define SCE_DMAP_NUMBER 2
-#define SCE_DMAP_STRING1 3
-#define SCE_DMAP_STRING2 4
-#define SCE_DMAP_STRINGEOL 5
-#define SCE_DMAP_OPERATOR 6
-#define SCE_DMAP_IDENTIFIER 7
-#define SCE_DMAP_WORD 8
-#define SCE_DMAP_WORD2 9
-#define SCE_DMAP_WORD3 10
-#define SCE_DMIS_DEFAULT 0
-#define SCE_DMIS_COMMENT 1
-#define SCE_DMIS_STRING 2
-#define SCE_DMIS_NUMBER 3
-#define SCE_DMIS_KEYWORD 4
-#define SCE_DMIS_MAJORWORD 5
-#define SCE_DMIS_MINORWORD 6
-#define SCE_DMIS_UNSUPPORTED_MAJOR 7
-#define SCE_DMIS_UNSUPPORTED_MINOR 8
-#define SCE_DMIS_LABEL 9
-#define SCE_REG_DEFAULT 0
-#define SCE_REG_COMMENT 1
-#define SCE_REG_VALUENAME 2
-#define SCE_REG_STRING 3
-#define SCE_REG_HEXDIGIT 4
-#define SCE_REG_VALUETYPE 5
-#define SCE_REG_ADDEDKEY 6
-#define SCE_REG_DELETEDKEY 7
-#define SCE_REG_ESCAPED 8
-#define SCE_REG_KEYPATH_GUID 9
-#define SCE_REG_STRING_GUID 10
-#define SCE_REG_PARAMETER 11
-#define SCE_REG_OPERATOR 12
-#define SCE_BIBTEX_DEFAULT 0
-#define SCE_BIBTEX_ENTRY 1
-#define SCE_BIBTEX_UNKNOWN_ENTRY 2
-#define SCE_BIBTEX_KEY 3
-#define SCE_BIBTEX_PARAMETER 4
-#define SCE_BIBTEX_VALUE 5
-#define SCE_BIBTEX_COMMENT 6
-#define SCE_HEX_DEFAULT 0
-#define SCE_HEX_RECSTART 1
-#define SCE_HEX_RECTYPE 2
-#define SCE_HEX_RECTYPE_UNKNOWN 3
-#define SCE_HEX_BYTECOUNT 4
-#define SCE_HEX_BYTECOUNT_WRONG 5
-#define SCE_HEX_NOADDRESS 6
-#define SCE_HEX_DATAADDRESS 7
-#define SCE_HEX_RECCOUNT 8
-#define SCE_HEX_STARTADDRESS 9
-#define SCE_HEX_ADDRESSFIELD_UNKNOWN 10
-#define SCE_HEX_EXTENDEDADDRESS 11
-#define SCE_HEX_DATA_ODD 12
-#define SCE_HEX_DATA_EVEN 13
-#define SCE_HEX_DATA_UNKNOWN 14
-#define SCE_HEX_DATA_EMPTY 15
-#define SCE_HEX_CHECKSUM 16
-#define SCE_HEX_CHECKSUM_WRONG 17
-#define SCE_HEX_GARBAGE 18
-#define SCE_JSON_DEFAULT 0
-#define SCE_JSON_NUMBER 1
-#define SCE_JSON_STRING 2
-#define SCE_JSON_STRINGEOL 3
-#define SCE_JSON_PROPERTYNAME 4
-#define SCE_JSON_ESCAPESEQUENCE 5
-#define SCE_JSON_LINECOMMENT 6
-#define SCE_JSON_BLOCKCOMMENT 7
-#define SCE_JSON_OPERATOR 8
-#define SCE_JSON_URI 9
-#define SCE_JSON_COMPACTIRI 10
-#define SCE_JSON_KEYWORD 11
-#define SCE_JSON_LDKEYWORD 12
-#define SCE_JSON_ERROR 13
-#define SCE_EDI_DEFAULT 0
-#define SCE_EDI_SEGMENTSTART 1
-#define SCE_EDI_SEGMENTEND 2
-#define SCE_EDI_SEP_ELEMENT 3
-#define SCE_EDI_SEP_COMPOSITE 4
-#define SCE_EDI_SEP_RELEASE 5
-#define SCE_EDI_UNA 6
-#define SCE_EDI_UNH 7
-#define SCE_EDI_BADSEGMENT 8
-#define SCE_STATA_DEFAULT 0
-#define SCE_STATA_COMMENT 1
-#define SCE_STATA_COMMENTLINE 2
-#define SCE_STATA_COMMENTBLOCK 3
-#define SCE_STATA_NUMBER 4
-#define SCE_STATA_OPERATOR 5
-#define SCE_STATA_IDENTIFIER 6
-#define SCE_STATA_STRING 7
-#define SCE_STATA_TYPE 8
-#define SCE_STATA_WORD 9
-#define SCE_STATA_GLOBAL_MACRO 10
-#define SCE_STATA_MACRO 11
-#define SCE_SAS_DEFAULT 0
-#define SCE_SAS_COMMENT 1
-#define SCE_SAS_COMMENTLINE 2
-#define SCE_SAS_COMMENTBLOCK 3
-#define SCE_SAS_NUMBER 4
-#define SCE_SAS_OPERATOR 5
-#define SCE_SAS_IDENTIFIER 6
-#define SCE_SAS_STRING 7
-#define SCE_SAS_TYPE 8
-#define SCE_SAS_WORD 9
-#define SCE_SAS_GLOBAL_MACRO 10
-#define SCE_SAS_MACRO 11
-#define SCE_SAS_MACRO_KEYWORD 12
-#define SCE_SAS_BLOCK_KEYWORD 13
-#define SCE_SAS_MACRO_FUNCTION 14
-#define SCE_SAS_STATEMENT 15
-#define SCE_NIM_DEFAULT 0
-#define SCE_NIM_COMMENT 1
-#define SCE_NIM_COMMENTDOC 2
-#define SCE_NIM_COMMENTLINE 3
-#define SCE_NIM_COMMENTLINEDOC 4
-#define SCE_NIM_NUMBER 5
-#define SCE_NIM_STRING 6
-#define SCE_NIM_CHARACTER 7
-#define SCE_NIM_WORD 8
-#define SCE_NIM_TRIPLE 9
-#define SCE_NIM_TRIPLEDOUBLE 10
-#define SCE_NIM_BACKTICKS 11
-#define SCE_NIM_FUNCNAME 12
-#define SCE_NIM_STRINGEOL 13
-#define SCE_NIM_NUMERROR 14
-#define SCE_NIM_OPERATOR 15
-#define SCE_NIM_IDENTIFIER 16
-#define SCE_CIL_DEFAULT 0
-#define SCE_CIL_COMMENT 1
-#define SCE_CIL_COMMENTLINE 2
-#define SCE_CIL_WORD 3
-#define SCE_CIL_WORD2 4
-#define SCE_CIL_WORD3 5
-#define SCE_CIL_STRING 6
-#define SCE_CIL_LABEL 7
-#define SCE_CIL_OPERATOR 8
-#define SCE_CIL_IDENTIFIER 9
-#define SCE_CIL_STRINGEOL 10
-#define SCE_X12_DEFAULT 0
-#define SCE_X12_BAD 1
-#define SCE_X12_ENVELOPE 2
-#define SCE_X12_FUNCTIONGROUP 3
-#define SCE_X12_TRANSACTIONSET 4
-#define SCE_X12_SEGMENTHEADER 5
-#define SCE_X12_SEGMENTEND 6
-#define SCE_X12_SEP_ELEMENT 7
-#define SCE_X12_SEP_SUBELEMENT 8
-#define SCE_DF_DEFAULT 0
-#define SCE_DF_IDENTIFIER 1
-#define SCE_DF_METATAG 2
-#define SCE_DF_IMAGE 3
-#define SCE_DF_COMMENTLINE 4
-#define SCE_DF_PREPROCESSOR 5
-#define SCE_DF_PREPROCESSOR2 6
-#define SCE_DF_NUMBER 7
-#define SCE_DF_HEXNUMBER 8
-#define SCE_DF_WORD 9
-#define SCE_DF_STRING 10
-#define SCE_DF_STRINGEOL 11
-#define SCE_DF_SCOPEWORD 12
-#define SCE_DF_OPERATOR 13
-#define SCE_DF_ICODE 14
-#define SCE_HOLLYWOOD_DEFAULT 0
-#define SCE_HOLLYWOOD_COMMENT 1
-#define SCE_HOLLYWOOD_COMMENTBLOCK 2
-#define SCE_HOLLYWOOD_NUMBER 3
-#define SCE_HOLLYWOOD_KEYWORD 4
-#define SCE_HOLLYWOOD_STDAPI 5
-#define SCE_HOLLYWOOD_PLUGINAPI 6
-#define SCE_HOLLYWOOD_PLUGINMETHOD 7
-#define SCE_HOLLYWOOD_STRING 8
-#define SCE_HOLLYWOOD_STRINGBLOCK 9
-#define SCE_HOLLYWOOD_PREPROCESSOR 10
-#define SCE_HOLLYWOOD_OPERATOR 11
-#define SCE_HOLLYWOOD_IDENTIFIER 12
-#define SCE_HOLLYWOOD_CONSTANT 13
-#define SCE_HOLLYWOOD_HEXNUMBER 14
-#define SCE_RAKU_DEFAULT 0
-#define SCE_RAKU_ERROR 1
-#define SCE_RAKU_COMMENTLINE 2
-#define SCE_RAKU_COMMENTEMBED 3
-#define SCE_RAKU_POD 4
-#define SCE_RAKU_CHARACTER 5
-#define SCE_RAKU_HEREDOC_Q 6
-#define SCE_RAKU_HEREDOC_QQ 7
-#define SCE_RAKU_STRING 8
-#define SCE_RAKU_STRING_Q 9
-#define SCE_RAKU_STRING_QQ 10
-#define SCE_RAKU_STRING_Q_LANG 11
-#define SCE_RAKU_STRING_VAR 12
-#define SCE_RAKU_REGEX 13
-#define SCE_RAKU_REGEX_VAR 14
-#define SCE_RAKU_ADVERB 15
-#define SCE_RAKU_NUMBER 16
-#define SCE_RAKU_PREPROCESSOR 17
-#define SCE_RAKU_OPERATOR 18
-#define SCE_RAKU_WORD 19
-#define SCE_RAKU_FUNCTION 20
-#define SCE_RAKU_IDENTIFIER 21
-#define SCE_RAKU_TYPEDEF 22
-#define SCE_RAKU_MU 23
-#define SCE_RAKU_POSITIONAL 24
-#define SCE_RAKU_ASSOCIATIVE 25
-#define SCE_RAKU_CALLABLE 26
-#define SCE_RAKU_GRAMMAR 27
-#define SCE_RAKU_CLASS 28
-/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
-
-#endif
+#endif

+ 2 - 1
src/qscint/scintilla/include/Scintilla.h

@@ -989,6 +989,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCI_CLEARREPRESENTATION 2667
 #define SCI_STARTRECORD 3001
 #define SCI_STOPRECORD 3002
+#define SCI_GETRECORSTATUS 3003
 #define SCI_SETLEXER 4001
 #define SCI_GETLEXER 4002
 #define SCI_COLOURISE 4003
@@ -1093,7 +1094,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCN_DOUBLECLICK 2006
 #define SCN_UPDATEUI 2007
 #define SCN_MODIFIED 2008
-#define SCN_MACRORECORD 2009
+#define SCN_MACRORECORD_ID 2009
 #define SCN_MARGINCLICK 2010
 #define SCN_NEEDSHOWN 2011
 #define SCN_PAINTED 2013

+ 170 - 109
src/qscint/scintilla/lexers/LexCPP.cpp

@@ -1,4 +1,4 @@
-// Scintilla source code edit control
+// Scintilla source code edit control
 /** @file LexCPP.cxx
  ** Lexer for C++, C, Java, and JavaScript.
  ** Further folding features and configuration properties added by "Udo Lechner" <dlchnr(at)gmx(dot)net>
@@ -6,18 +6,16 @@
 // Copyright 1998-2005 by Neil Hodgson <[email protected]>
 // The License.txt file describes the conditions under which this software may be distributed.
 
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <ctype.h>
+#include <cstdlib>
+#include <cassert>
+#include <cstring>
 
 #include <utility>
 #include <string>
 #include <vector>
 #include <map>
 #include <algorithm>
+#include <iterator>
 
 #include "ILexer.h"
 #include "Scintilla.h"
@@ -39,7 +37,7 @@ using namespace Scintilla;
 namespace {
 	// Use an unnamed namespace to protect the functions and classes from name conflicts
 
-bool IsSpaceEquiv(int state) noexcept {
+constexpr bool IsSpaceEquiv(int state) noexcept {
 	return (state <= SCE_C_COMMENTDOC) ||
 		// including SCE_C_DEFAULT, SCE_C_COMMENT, SCE_C_COMMENTLINE
 		(state == SCE_C_COMMENTLINEDOC) || (state == SCE_C_COMMENTDOCKEYWORD) ||
@@ -86,7 +84,7 @@ bool followsReturnKeyword(const StyleContext &sc, LexAccessor &styler) {
 	return !*s;
 }
 
-bool IsSpaceOrTab(int ch) noexcept {
+constexpr bool IsSpaceOrTab(int ch) noexcept {
 	return ch == ' ' || ch == '\t';
 }
 
@@ -143,10 +141,10 @@ BracketPair FindBracketPair(std::vector<std::string> &tokens) {
 void highlightTaskMarker(StyleContext &sc, LexAccessor &styler,
 		int activity, const WordList &markerList, bool caseSensitive){
 	if ((isoperator(sc.chPrev) || IsASpace(sc.chPrev)) && markerList.Length()) {
-		const int lengthMarker = 50;
+		constexpr Sci_PositionU lengthMarker = 50;
 		char marker[lengthMarker+1] = "";
-		const Sci_Position currPos = static_cast<Sci_Position>(sc.currentPos);
-		int i = 0;
+		const Sci_PositionU currPos = sc.currentPos;
+		Sci_PositionU i = 0;
 		while (i < lengthMarker) {
 			const char ch = styler.SafeGetCharAt(currPos + i);
 			if (IsASpace(ch) || isoperator(ch)) {
@@ -165,18 +163,14 @@ void highlightTaskMarker(StyleContext &sc, LexAccessor &styler,
 	}
 }
 
-struct EscapeSequence {
-	int digitsLeft;
-	CharacterSet setHexDigits;
-	CharacterSet setOctDigits;
-	CharacterSet setNoneNumeric;
-	CharacterSet *escapeSetValid;
-	EscapeSequence() {
-		digitsLeft = 0;
-		escapeSetValid = 0;
-		setHexDigits = CharacterSet(CharacterSet::setDigits, "ABCDEFabcdef");
-		setOctDigits = CharacterSet(CharacterSet::setNone, "01234567");
-	}
+class EscapeSequence {
+	const CharacterSet setHexDigits = CharacterSet(CharacterSet::setDigits, "ABCDEFabcdef");
+	const CharacterSet setOctDigits = CharacterSet(CharacterSet::setNone, "01234567");
+	const CharacterSet setNoneNumeric;
+	const CharacterSet *escapeSetValid = nullptr;
+	int digitsLeft = 0;
+public:
+	EscapeSequence() = default;
 	void resetEscapeState(int nextChar) {
 		digitsLeft = 0;
 		escapeSetValid = &setNoneNumeric;
@@ -197,26 +191,39 @@ struct EscapeSequence {
 	bool atEscapeEnd(int currChar) const {
 		return (digitsLeft <= 0) || !escapeSetValid->Contains(currChar);
 	}
+	void consumeDigit() noexcept {
+		digitsLeft--;
+	}
 };
 
 std::string GetRestOfLine(LexAccessor &styler, Sci_Position start, bool allowSpace) {
 	std::string restOfLine;
-	Sci_Position i =0;
+	Sci_Position line = styler.GetLine(start);
+	Sci_Position pos = start;
+	Sci_Position endLine = styler.LineEnd(line);
 	char ch = styler.SafeGetCharAt(start, '\n');
-	const Sci_Position endLine = styler.LineEnd(styler.GetLine(start));
-	while (((start+i) < endLine) && (ch != '\r')) {
-		const char chNext = styler.SafeGetCharAt(start + i + 1, '\n');
+	while (pos < endLine) {
+		if (ch == '\\' && ((pos + 1) == endLine)) {
+			// Continuation line
+			line++;
+			pos = styler.LineStart(line);
+			endLine = styler.LineEnd(line);
+			ch = styler.SafeGetCharAt(pos, '\n');
+		} else {
+			const char chNext = styler.SafeGetCharAt(pos + 1, '\n');
 		if (ch == '/' && (chNext == '/' || chNext == '*'))
 			break;
-		if (allowSpace || (ch != ' '))
+			if (allowSpace || (ch != ' ')) {
 			restOfLine += ch;
-		i++;
+			}
+			pos++;
 		ch = chNext;
 	}
+	}
 	return restOfLine;
 }
 
-bool IsStreamCommentStyle(int style) noexcept {
+constexpr bool IsStreamCommentStyle(int style) noexcept {
 	return style == SCE_C_COMMENT ||
 		style == SCE_C_COMMENTDOC ||
 		style == SCE_C_COMMENTDOCKEYWORD ||
@@ -234,12 +241,24 @@ struct PPDefinition {
 	}
 };
 
+constexpr int inactiveFlag = 0x40;
+
 class LinePPState {
-	int state;
-	int ifTaken;
-	int level;
+	// Track the state of preprocessor conditionals to allow showing active and inactive
+	// code in different styles.
+	// Only works up to 31 levels of conditional nesting.
+
+	// state is a bit mask with 1 bit per level
+	// bit is 1 for level if section inactive, so any bits set = inactive style
+	int state = 0;
+	// ifTaken is a bit mask with 1 bit per level
+	// bit is 1 for level if some branch at this level has been taken
+	int ifTaken = 0;
+	// level is the nesting level of #if constructs
+	int level = -1;
+	static const int maximumNestingLevel = 31;
 	bool ValidLevel() const noexcept {
-		return level >= 0 && level < 32;
+		return level >= 0 && level < maximumNestingLevel;
 	}
 	int maskLevel() const noexcept {
 		if (level >= 0) {
@@ -249,11 +268,17 @@ class LinePPState {
 		}
 	}
 public:
-	LinePPState() : state(0), ifTaken(0), level(-1) {
+	LinePPState() noexcept {
+	}
+	bool IsActive() const noexcept {
+		return state == 0;
 	}
 	bool IsInactive() const noexcept {
 		return state != 0;
 	}
+	int ActiveState() const noexcept {
+		return state ? inactiveFlag : 0;
+	}
 	bool CurrentIfTaken() const noexcept {
 		return (ifTaken & maskLevel()) != 0;
 	}
@@ -289,7 +314,7 @@ public:
 class PPStates {
 	std::vector<LinePPState> vlls;
 public:
-	LinePPState ForLine(Sci_Position line) const {
+	LinePPState ForLine(Sci_Position line) const noexcept {
 		if ((line > 0) && (vlls.size() > static_cast<size_t>(line))) {
 			return vlls[line];
 		} else {
@@ -359,7 +384,7 @@ const char *const cppWordLists[] = {
             "Global classes and typedefs",
             "Preprocessor definitions",
             "Task marker and error marker keywords",
-            0,
+            nullptr,
 };
 
 struct OptionSetCPP : public OptionSet<OptionsCPP> {
@@ -468,13 +493,17 @@ LexicalClass lexicalClasses[] = {
 	27, "SCE_C_ESCAPESEQUENCE", "literal string escapesequence", "Escape sequence",
 };
 
+const int sizeLexicalClasses = static_cast<int>(ELEMENTS(lexicalClasses));
+
 }
+enum { lvRelease4 = 2, lvRelease5 = 3 };
 
 class LexerCPP : public ILexerWithMetaData {
 	bool caseSensitive;
 	CharacterSet setWord;
 	CharacterSet setNegationOp;
-	CharacterSet setArithmethicOp;
+	CharacterSet setAddOp;
+	CharacterSet setMultOp;
 	CharacterSet setRelOp;
 	CharacterSet setLogicalOp;
 	CharacterSet setWordStart;
@@ -489,7 +518,8 @@ class LexerCPP : public ILexerWithMetaData {
 	struct SymbolValue {
 		std::string value;
 		std::string arguments;
-		SymbolValue(const std::string &value_="", const std::string &arguments_="") : value(value_), arguments(arguments_) {
+		SymbolValue() noexcept = default;
+		SymbolValue(const std::string &value_, const std::string &arguments_) : value(value_), arguments(arguments_) {
 		}
 		SymbolValue &operator = (const std::string &value_) {
 			value = value_;
@@ -506,7 +536,6 @@ class LexerCPP : public ILexerWithMetaData {
 	OptionSetCPP osCPP;
 	EscapeSequence escapeSeq;
 	SparseState<std::string> rawStringTerminators;
-	enum { activeFlag = 0x40 };
 	enum { ssIdentifier, ssDocKeyword };
 	SubStyles subStyles;
 	std::string returnBuffer;
@@ -515,18 +544,24 @@ public:
 		caseSensitive(caseSensitive_),
 		setWord(CharacterSet::setAlphaNum, "._", 0x80, true),
 		setNegationOp(CharacterSet::setNone, "!"),
-		setArithmethicOp(CharacterSet::setNone, "+-/*%"),
+		setAddOp(CharacterSet::setNone, "+-"),
+		setMultOp(CharacterSet::setNone, "*/%"),
 		setRelOp(CharacterSet::setNone, "=!<>"),
 		setLogicalOp(CharacterSet::setNone, "|&"),
-		subStyles(styleSubable, 0x80, 0x40, activeFlag) {
+		subStyles(styleSubable, 0x80, 0x40, inactiveFlag) {
 	}
+	// Deleted so LexerCPP objects can not be copied.
+	LexerCPP(const LexerCPP &) = delete;
+	LexerCPP(LexerCPP &&) = delete;
+	void operator=(const LexerCPP &) = delete;
+	void operator=(LexerCPP &&) = delete;
 	virtual ~LexerCPP() {
 	}
-	void SCI_METHOD Release() override {
+	void SCI_METHOD Release() noexcept override {
 		delete this;
 	}
-	int SCI_METHOD Version() const override {
-		return lvMetaData;
+	int SCI_METHOD Version() const noexcept override {
+		return lvRelease4;
 	}
 	const char * SCI_METHOD PropertyNames() override {
 		return osCPP.PropertyNames();
@@ -545,11 +580,11 @@ public:
 	void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
 	void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
 
-	void * SCI_METHOD PrivateCall(int, void *) override {
-		return 0;
+	void * SCI_METHOD PrivateCall(int, void *) noexcept override {
+		return nullptr;
 	}
 
-	int SCI_METHOD LineEndTypesSupported() override {
+	int SCI_METHOD LineEndTypesSupported() noexcept override {
 		return SC_LINE_END_TYPE_UNICODE;
 	}
 
@@ -564,10 +599,10 @@ public:
 	}
 	int SCI_METHOD StyleFromSubStyle(int subStyle) override {
 		const int styleBase = subStyles.BaseStyle(MaskActive(subStyle));
-		const int active = subStyle & activeFlag;
-		return styleBase | active;
+		const int inactive = subStyle & inactiveFlag;
+		return styleBase | inactive;
 	}
-	int SCI_METHOD PrimaryStyleFromStyle(int style) override {
+	int SCI_METHOD PrimaryStyleFromStyle(int style) noexcept override {
 		return MaskActive(style);
 	}
 	void SCI_METHOD FreeSubStyles() override {
@@ -576,21 +611,21 @@ public:
 	void SCI_METHOD SetIdentifiers(int style, const char *identifiers) override {
 		subStyles.SetIdentifiers(style, identifiers);
 	}
-	int SCI_METHOD DistanceToSecondaryStyles() override {
-		return activeFlag;
+	int SCI_METHOD DistanceToSecondaryStyles() noexcept override {
+		return inactiveFlag;
 	}
-	const char * SCI_METHOD GetSubStyleBases() override {
+	const char * SCI_METHOD GetSubStyleBases() noexcept override {
 		return styleSubable;
 	}
 	int SCI_METHOD NamedStyles() override {
 		return std::max(subStyles.LastAllocated() + 1,
-			static_cast<int>(ELEMENTS(lexicalClasses))) +
-			activeFlag;
+			sizeLexicalClasses) +
+			inactiveFlag;
 	}
 	const char * SCI_METHOD NameOfStyle(int style) override {
 		if (style >= NamedStyles())
 			return "";
-		if (style < static_cast<int>(ELEMENTS(lexicalClasses)))
+		if (style < sizeLexicalClasses)
 			return lexicalClasses[style].name;
 		// TODO: inactive and substyles
 		return "";
@@ -603,23 +638,23 @@ public:
 		if (firstSubStyle >= 0) {
 			const int lastSubStyle = subStyles.LastAllocated();
 			if (((style >= firstSubStyle) && (style <= (lastSubStyle))) ||
-				((style >= firstSubStyle + activeFlag) && (style <= (lastSubStyle + activeFlag)))) {
+				((style >= firstSubStyle + inactiveFlag) && (style <= (lastSubStyle + inactiveFlag)))) {
 				int styleActive = style;
 				if (style > lastSubStyle) {
 					returnBuffer = "inactive ";
-					styleActive -= activeFlag;
+					styleActive -= inactiveFlag;
 				}
 				const int styleMain = StyleFromSubStyle(styleActive);
 				returnBuffer += lexicalClasses[styleMain].tags;
 				return returnBuffer.c_str();
 			}
 		}
-		if (style < static_cast<int>(ELEMENTS(lexicalClasses)))
+		if (style < sizeLexicalClasses)
 			return lexicalClasses[style].tags;
-		if (style >= activeFlag) {
+		if (style >= inactiveFlag) {
 			returnBuffer = "inactive ";
-			const int styleActive = style - activeFlag;
-			if (styleActive < static_cast<int>(ELEMENTS(lexicalClasses)))
+			const int styleActive = style - inactiveFlag;
+			if (styleActive < sizeLexicalClasses)
 				returnBuffer += lexicalClasses[styleActive].tags;
 			else
 				returnBuffer = "";
@@ -630,20 +665,29 @@ public:
 	const char * SCI_METHOD DescriptionOfStyle(int style) override {
 		if (style >= NamedStyles())
 			return "";
-		if (style < static_cast<int>(ELEMENTS(lexicalClasses)))
+		if (style < sizeLexicalClasses)
 			return lexicalClasses[style].description;
 		// TODO: inactive and substyles
 		return "";
 	}
 
+	// ILexer5 methods
+	//const char * SCI_METHOD GetName() {
+	//	return caseSensitive ? "cpp" : "cppnocase";
+	//}
+	/*int SCI_METHOD  GetIdentifier() {
+		return caseSensitive ? SCLEX_CPP : SCLEX_CPPNOCASE;
+	}*/
+	//const char * SCI_METHOD PropertyGet(const char *key);
+
 	static ILexer *LexerFactoryCPP() {
 		return new LexerCPP(true);
 	}
 	static ILexer *LexerFactoryCPPInsensitive() {
 		return new LexerCPP(false);
 	}
-	static int MaskActive(int style) noexcept {
-		return style & ~activeFlag;
+	constexpr static int MaskActive(int style) noexcept {
+		return style & ~inactiveFlag;
 	}
 	void EvaluateTokens(std::vector<std::string> &tokens, const SymbolTable &preprocessorDefinitions);
 	std::vector<std::string> Tokenize(const std::string &expr) const;
@@ -663,8 +707,12 @@ Sci_Position SCI_METHOD LexerCPP::PropertySet(const char *key, const char *val)
 	return -1;
 }
 
+//const char * SCI_METHOD LexerCPP::PropertyGet(const char *key) {
+//	return osCPP.PropertyGet(key);
+//}
+
 Sci_Position SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) {
-	WordList *wordListN = 0;
+	WordList *wordListN = nullptr;
 	switch (n) {
 	case 0:
 		wordListN = &keywords;
@@ -784,7 +832,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 		ppDefineHistory.clear();
 
 	std::vector<PPDefinition>::iterator itInvalid = std::find_if(ppDefineHistory.begin(), ppDefineHistory.end(),
-		[lineCurrent](const PPDefinition &p) { return p.line >= lineCurrent; });
+		[lineCurrent](const PPDefinition &p) noexcept { return p.line >= lineCurrent; });
 	if (itInvalid != ppDefineHistory.end()) {
 		ppDefineHistory.erase(itInvalid, ppDefineHistory.end());
 		definitionsChanged = true;
@@ -801,12 +849,12 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 	std::string rawStringTerminator = rawStringTerminators.ValueAt(lineCurrent-1);
 	SparseState<std::string> rawSTNew(lineCurrent);
 
-	int activitySet = preproc.IsInactive() ? activeFlag : 0;
+	int activitySet = preproc.ActiveState();
 
 	const WordClassifier &classifierIdentifiers = subStyles.Classifier(SCE_C_IDENTIFIER);
 	const WordClassifier &classifierDocKeyWords = subStyles.Classifier(SCE_C_COMMENTDOCKEYWORD);
 
-	Sci_Position lineEndNext = styler.LineEnd(lineCurrent);
+	Sci_PositionU lineEndNext = styler.LineEnd(lineCurrent);
 
 	for (; sc.More();) {
 
@@ -828,7 +876,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 			isIncludePreprocessor = false;
 			inRERange = false;
 			if (preproc.IsInactive()) {
-				activitySet = activeFlag;
+				activitySet = inactiveFlag;
 				sc.SetState(sc.state | activitySet);
 			}
 		}
@@ -844,7 +892,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 
 		// Handle line continuation generically.
 		if (sc.ch == '\\') {
-			if (static_cast<Sci_Position>((sc.currentPos+1)) >= lineEndNext) {
+			if ((sc.currentPos+1) >= lineEndNext) {
 				lineCurrent++;
 				lineEndNext = styler.LineEnd(lineCurrent);
 				vlls.Add(lineCurrent, preproc);
@@ -938,7 +986,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 				break;
 			case SCE_C_PREPROCESSOR:
 				if (options.stylingWithinPreprocessor) {
-					if (IsASpace(sc.ch)) {
+					if (IsASpace(sc.ch) || (sc.ch == '(')) {
 						sc.SetState(SCE_C_DEFAULT|activitySet);
 					}
 				} else if (isStringInPreprocessor && (sc.Match('>') || sc.Match('\"') || sc.atLineEnd)) {
@@ -1059,7 +1107,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 				}
 				break;
 			case SCE_C_ESCAPESEQUENCE:
-				escapeSeq.digitsLeft--;
+				escapeSeq.consumeDigit();
 				if (!escapeSeq.atEscapeEnd(sc.ch)) {
 					break;
 				}
@@ -1111,12 +1159,12 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 			case SCE_C_REGEX:
 				if (sc.atLineStart) {
 					sc.SetState(SCE_C_DEFAULT|activitySet);
-				} else if (! inRERange && sc.ch == '/') {
+				} else if (!inRERange && sc.ch == '/') {
 					sc.Forward();
-					while ((sc.ch < 0x80) && islower(sc.ch))
+					while (IsLowerCase(sc.ch))
 						sc.Forward();    // gobble regex flags
 					sc.SetState(SCE_C_DEFAULT|activitySet);
-				} else if (sc.ch == '\\' && (static_cast<Sci_Position>(sc.currentPos+1) < lineEndNext)) {
+				} else if (sc.ch == '\\' && ((sc.currentPos+1) < lineEndNext)) {
 					// Gobble up the escaped character
 					sc.Forward();
 				} else if (sc.ch == '[') {
@@ -1253,6 +1301,8 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 					isIncludePreprocessor = true;
 				} else {
 					if (options.trackPreprocessor) {
+						// If #if is nested too deeply (>31 levels) the active/inactive appearance
+						// will stop reflecting the code.
 						if (sc.Match("ifdef") || sc.Match("ifndef")) {
 							const bool isIfDef = sc.Match("ifdef");
 							const int startRest = isIfDef ? 5 : 6;
@@ -1264,47 +1314,58 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 							const bool ifGood = EvaluateExpression(restOfLine, preprocessorDefinitions);
 							preproc.StartSection(ifGood);
 						} else if (sc.Match("else")) {
+							// #else is shown as active if either preceding or following section is active
+							// as that means that it contributed to the result.
 							if (!preproc.CurrentIfTaken()) {
+								// Inactive, may become active if parent scope active
+								assert(sc.state == (SCE_C_PREPROCESSOR|inactiveFlag));
 								preproc.InvertCurrentLevel();
-								activitySet = preproc.IsInactive() ? activeFlag : 0;
+								activitySet = preproc.ActiveState();
+								// If following is active then show "else" as active
 								if (!activitySet)
-									sc.ChangeState(SCE_C_PREPROCESSOR|activitySet);
-							} else if (!preproc.IsInactive()) {
+									sc.ChangeState(SCE_C_PREPROCESSOR);
+							} else if (preproc.IsActive()) {
+								// Active -> inactive
+								assert(sc.state == SCE_C_PREPROCESSOR);
 								preproc.InvertCurrentLevel();
-								activitySet = preproc.IsInactive() ? activeFlag : 0;
-								if (!activitySet)
-									sc.ChangeState(SCE_C_PREPROCESSOR|activitySet);
+								activitySet = preproc.ActiveState();
+								// Continue to show "else" as active as it ends active section.
 							}
 						} else if (sc.Match("elif")) {
 							// Ensure only one chosen out of #if .. #elif .. #elif .. #else .. #endif
+							// #elif is shown as active if either preceding or following section is active
+							// as that means that it contributed to the result.
 							if (!preproc.CurrentIfTaken()) {
+								// Inactive, if expression true then may become active if parent scope active
+								assert(sc.state == (SCE_C_PREPROCESSOR|inactiveFlag));
 								// Similar to #if
 								std::string restOfLine = GetRestOfLine(styler, sc.currentPos + 4, true);
 								const bool ifGood = EvaluateExpression(restOfLine, preprocessorDefinitions);
 								if (ifGood) {
 									preproc.InvertCurrentLevel();
-									activitySet = preproc.IsInactive() ? activeFlag : 0;
+									activitySet = preproc.ActiveState();
 									if (!activitySet)
-										sc.ChangeState(SCE_C_PREPROCESSOR|activitySet);
+										sc.ChangeState(SCE_C_PREPROCESSOR);
 								}
-							} else if (!preproc.IsInactive()) {
+							} else if (preproc.IsActive()) {
+								// Active -> inactive
+								assert(sc.state == SCE_C_PREPROCESSOR);
 								preproc.InvertCurrentLevel();
-								activitySet = preproc.IsInactive() ? activeFlag : 0;
-								if (!activitySet)
-									sc.ChangeState(SCE_C_PREPROCESSOR|activitySet);
+								activitySet = preproc.ActiveState();
+								// Continue to show "elif" as active as it ends active section.
 							}
 						} else if (sc.Match("endif")) {
 							preproc.EndSection();
-							activitySet = preproc.IsInactive() ? activeFlag : 0;
+							activitySet = preproc.ActiveState();
 							sc.ChangeState(SCE_C_PREPROCESSOR|activitySet);
 						} else if (sc.Match("define")) {
-							if (options.updatePreprocessor && !preproc.IsInactive()) {
+							if (options.updatePreprocessor && preproc.IsActive()) {
 								std::string restOfLine = GetRestOfLine(styler, sc.currentPos + 6, true);
 								size_t startName = 0;
 								while ((startName < restOfLine.length()) && IsSpaceOrTab(restOfLine[startName]))
 									startName++;
 								size_t endName = startName;
-								while ((endName < restOfLine.length()) && setWord.Contains(static_cast<unsigned char>(restOfLine[endName])))
+								while ((endName < restOfLine.length()) && setWord.Contains(restOfLine[endName]))
 									endName++;
 								std::string key = restOfLine.substr(startName, endName-startName);
 								if ((endName < restOfLine.length()) && (restOfLine.at(endName) == '(')) {
@@ -1336,7 +1397,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
 								}
 							}
 						} else if (sc.Match("undef")) {
-							if (options.updatePreprocessor && !preproc.IsInactive()) {
+							if (options.updatePreprocessor && preproc.IsActive()) {
 								const std::string restOfLine = GetRestOfLine(styler, sc.currentPos + 5, false);
 								std::vector<std::string> tokens = Tokenize(restOfLine);
 								if (tokens.size() >= 1) {
@@ -1526,11 +1587,11 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl
 	}
 
 	// Evaluate identifiers
-	const size_t maxIterations = 100;
+	constexpr size_t maxIterations = 100;
 	size_t iterations = 0;	// Limit number of iterations in case there is a recursive macro.
 	for (size_t i = 0; (i<tokens.size()) && (iterations < maxIterations);) {
 		iterations++;
-		if (setWordStart.Contains(static_cast<unsigned char>(tokens[i][0]))) {
+		if (setWordStart.Contains(tokens[i][0])) {
 			SymbolTable::const_iterator it = preprocessorDefinitions.find(tokens[i]);
 			if (it != preprocessorDefinitions.end()) {
 				// Tokenize value
@@ -1557,7 +1618,7 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl
 						macroTokens.erase(std::remove_if(macroTokens.begin(), macroTokens.end(), OnlySpaceOrTab), macroTokens.end());
 
 						for (size_t iMacro = 0; iMacro < macroTokens.size();) {
-							if (setWordStart.Contains(static_cast<unsigned char>(macroTokens[iMacro][0]))) {
+							if (setWordStart.Contains(macroTokens[iMacro][0])) {
 								std::map<std::string, std::string>::const_iterator itFind = arguments.find(macroTokens[iMacro]);
 								if (itFind != arguments.end()) {
 									// TODO: Possible that value will be expression so should insert tokenized form
@@ -1618,13 +1679,15 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl
 	}
 
 	// Evaluate expressions in precedence order
-	enum precedence { precArithmetic, precRelative, precLogical };
-	for (int prec=precArithmetic; prec <= precLogical; prec++) {
+	enum precedence { precMult, precAdd, precRelative
+		, precLogical, /* end marker */ precLast };
+	for (int prec = precMult; prec < precLast; prec++) {
 		// Looking at 3 tokens at a time so end at 2 before end
 		for (size_t k=0; (k+2)<tokens.size();) {
 			const char chOp = tokens[k+1][0];
 			if (
-				((prec==precArithmetic) && setArithmethicOp.Contains(chOp)) ||
+				((prec==precMult) && setMultOp.Contains(chOp)) ||
+				((prec==precAdd) && setAddOp.Contains(chOp)) ||
 				((prec==precRelative) && setRelOp.Contains(chOp)) ||
 				((prec==precLogical) && setLogicalOp.Contains(chOp))
 				) {
@@ -1657,11 +1720,9 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl
 					result = valA || valB;
 				else if (tokens[k+1] == "&&")
 					result = valA && valB;
-				char sResult[30];
-				sprintf(sResult, "%d", result);
 				std::vector<std::string>::iterator itInsert =
 					tokens.erase(tokens.begin() + k, tokens.begin() + k + 3);
-				tokens.insert(itInsert, sResult);
+				tokens.insert(itInsert, std::to_string(result));
 			} else {
 				k++;
 			}
@@ -1675,9 +1736,9 @@ std::vector<std::string> LexerCPP::Tokenize(const std::string &expr) const {
 	const char *cp = expr.c_str();
 	while (*cp) {
 		std::string word;
-		if (setWord.Contains(static_cast<unsigned char>(*cp))) {
+		if (setWord.Contains(*cp)) {
 			// Identifiers and numbers
-			while (setWord.Contains(static_cast<unsigned char>(*cp))) {
+			while (setWord.Contains(*cp)) {
 				word += *cp;
 				cp++;
 			}
@@ -1686,17 +1747,17 @@ std::vector<std::string> LexerCPP::Tokenize(const std::string &expr) const {
 				word += *cp;
 				cp++;
 			}
-		} else if (setRelOp.Contains(static_cast<unsigned char>(*cp))) {
+		} else if (setRelOp.Contains(*cp)) {
 			word += *cp;
 			cp++;
-			if (setRelOp.Contains(static_cast<unsigned char>(*cp))) {
+			if (setRelOp.Contains(*cp)) {
 				word += *cp;
 				cp++;
 			}
-		} else if (setLogicalOp.Contains(static_cast<unsigned char>(*cp))) {
+		} else if (setLogicalOp.Contains(*cp)) {
 			word += *cp;
 			cp++;
-			if (setLogicalOp.Contains(static_cast<unsigned char>(*cp))) {
+			if (setLogicalOp.Contains(*cp)) {
 				word += *cp;
 				cp++;
 			}

+ 429 - 0
src/qscint/scintilla/lexers/LexGCode.cpp

@@ -0,0 +1,429 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <string>
+#include <vector>
+#include <map>
+#include <algorithm>
+#include <regex>
+
+#include "ILexer.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#include "StringCopy.h"
+#include "WordList.h"
+#include "LexAccessor.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "CharacterSet.h"
+#include "CharacterCategory.h"
+#include "LexerModule.h"
+#include "OptionSet.h"
+#include "SubStyles.h"
+#include "DefaultLexer.h"
+#include "LexAccessor.h"
+
+#include "UniConversion.h"
+
+
+using namespace Scintilla;
+
+//const char styleSubable[] = { SCE_P_IDENTIFIER, 0 };
+
+//Default = 0,//中文
+//Ascii = 1,//英文
+//Keyword = 2, //关键字,只有以TXT为母版的
+
+static LexicalClass lexicalClasses[] = {
+	// Lexer Python SCLEX_PYTHON SCE_P_:
+	0, "SCE_GCODE_DEFAULT", "default", "default",
+	1, "SCE_GCODE_KEYWORD", "keyword", "keyword",
+	2, "SCE_GCODE_KEYWORD1", "keyword", "keyword",
+	3, "SCE_GCODE_COMMNET", "Comment", "Comment",
+	4, "SCE_GCODE_POSITION", "Position", "Position",
+	5, "SCE_GCODE_VELOCITY","velocity","velocity",
+	
+};
+
+enum LOG_STATUS { 
+	SCE_GCODE_DEFAULT=0,
+	SCE_GCODE_KEYWORD, //关键字
+	SCE_GCODE_KEYWORD1, //关键字
+	SCE_GCODE_COMMNET, //数字
+	SCE_GCODE_POSITION_X, //位置 X Y Z 
+	SCE_GCODE_POSITION_Y, //位置 X Y Z 
+	SCE_GCODE_POSITION_Z, //位置 X Y Z 
+	SCE_GCODE_OFFSET,//I J K 偏移
+	SCE_GCODE_VELOCITY,//速度 F
+	SCE_GCODE_TIMES,// P 次数
+	SCE_GCODE_IDENTIFIER,
+	SCE_GCODE_IDENTIFIER_KEYWORD,
+	SCE_GCODE_IDENTIFIER_KEYWORD1,
+	SCE_GCODE_IDENTIFIER_POSITION_X,
+	SCE_GCODE_IDENTIFIER_POSITION_Y,
+	SCE_GCODE_IDENTIFIER_POSITION_Z,
+	SCE_GCODE_IDENTIFIER_OFFSET,
+	SCE_GCODE_IDENTIFIER_VELOCITY,
+	SCE_GCODE_IDENTIFIER_TIMES,
+	SCE_GCODE_IDENTIFIER_COMMENT,
+};
+
+// Options used for LexerPython
+struct OptionsTxt {
+	bool num;
+	bool data;
+	bool keyword;
+
+	OptionsTxt() {
+		num = true;
+		data = true;
+		keyword = true;
+	}
+
+};
+
+//获取行,最多获取1024个字符串
+static std::string GetLineContents(LexAccessor& styler, Sci_Position start, const int len = 1024) {
+	std::string lineContent;
+	Sci_Position i = 0;
+	char ch = styler.SafeGetCharAt(start, '\n');
+	const Sci_Position endLine = styler.LineEnd(styler.GetLine(start));
+	while (((start + i) < endLine) && (i < len)) {
+		const char chNext = styler.SafeGetCharAt(start + i + 1, '\n');
+		lineContent += ch;
+		i++;
+		ch = chNext;
+	}
+	return lineContent;
+}
+
+struct OptionSetTxt : public OptionSet<OptionsTxt> {
+	OptionSetTxt() {
+		DefineProperty("lexer.log.num", &OptionsTxt::num,
+			"text Unicode string");
+
+		DefineProperty("lexer.txt.keyword", &OptionsTxt::keyword,
+			"text keyword");
+	}
+};
+
+class LexGCode :public DefaultLexer
+{
+	WordList keywords;
+	WordList keywords1;
+	OptionsTxt options;
+	OptionSetTxt osTxt;
+	CharacterSet setWord;
+	CharacterSet setWordStart;
+public:
+	explicit LexGCode() :
+		DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)),
+		setWord(CharacterSet::setDigits, "GMXYZPIJKF-", 0x80, true),//字母、数字、下划线、. 单词的字符集。
+		setWordStart(CharacterSet::setNone, "GMXYZPIJKF", 0x80, true)
+	{
+		
+	}
+	virtual ~LexGCode() {}
+
+	void SCI_METHOD Release() override {
+		delete this;
+	}
+	int SCI_METHOD Version() const override {
+		return lvSubStyles;
+	}
+	const char *SCI_METHOD PropertyNames() override {
+		return osTxt.PropertyNames();
+	}
+	int SCI_METHOD PropertyType(const char *name) override {
+		return osTxt.PropertyType(name);
+	}
+	const char *SCI_METHOD DescribeProperty(const char *name) override {
+		return osTxt.DescribeProperty(name);
+	}
+	Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override;
+
+	const char *SCI_METHOD DescribeWordListSets() override {
+		return "";
+	}
+	Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override;
+
+	void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
+	void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
+	void *SCI_METHOD PrivateCall(int, void *) override {
+		return 0;
+	}
+	int SCI_METHOD LineEndTypesSupported() override {
+		return SC_LINE_END_TYPE_UNICODE;
+	}
+
+	int SCI_METHOD PrimaryStyleFromStyle(int style) override {
+		return style;
+	}
+
+	int SCI_METHOD DistanceToSecondaryStyles() override {
+		return 0;
+	}
+
+	static ILexer * LexerFactoryGCode() {
+		return new LexGCode();
+	}
+};
+
+Sci_Position SCI_METHOD LexGCode::PropertySet(const char *key, const char *val) {
+	if (osTxt.PropertySet(&options, key, val)) {
+		return 0;
+	}
+	return -1;
+}
+
+Sci_Position SCI_METHOD LexGCode::WordListSet(int n, const char *wl) {
+
+	WordList *wordListN = 0;
+	switch (n) {
+	case 0:
+		wordListN = &keywords;
+		break;
+	case 1:
+		wordListN = &keywords1;
+		break;
+	}
+	Sci_Position firstModification = -1;
+	if (wordListN) {
+		WordList wlNew;
+		wlNew.Set(wl);
+		if (*wordListN != wlNew) {
+			wordListN->Set(wl);
+			firstModification = 0;
+		}
+	}
+	return firstModification;
+}
+
+const int indicatorWhitespace = 1;
+
+inline bool IsAAsciiChar(int ch) {
+	return (ch < 0x80);
+}
+
+inline bool IsAWordStart(int ch, bool unicodeIdentifiers) {
+	if (ch < 0x80)
+		return (isalpha(ch) || ch == '_');
+
+	if (!unicodeIdentifiers)
+		return false;
+
+	return IsXidStart(ch);
+}
+
+//是否是单词分割符号,对于ascii中的数字和字母以外的字符,比如 . @ \t 等,都作为一个单词的分割符号。
+inline bool IsWordSplitChar(int ch) noexcept {
+	return (ch < 0x80) && !isalnum(ch);
+}
+
+inline bool IsLineEol(int ch) noexcept {
+	return ch == '\n' || ch == '\r';
+}
+
+
+
+
+
+//只识别中文和英文两种单词的状态
+void SCI_METHOD LexGCode::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
+	Accessor styler(pAccess, NULL);
+
+	const Sci_Position endPos = startPos + length;
+
+	StyleContext sc(startPos, endPos - startPos, initStyle, styler);
+
+	Sci_Position startIndicator = sc.currentPos;
+
+	bool isDataMatch = false;
+
+	for (; sc.More();) {
+
+		switch (sc.state)
+		{
+			case SCE_GCODE_DEFAULT:
+			{
+				if (!sc.atLineEnd && (sc.ch == ';'))
+				{
+					sc.SetState(SCE_GCODE_IDENTIFIER_COMMENT);
+				}
+				else if (!sc.atLineEnd && setWordStart.Contains(sc.ch)) {
+					//如果不在行尾,而且当前字符是一个单词的开头标识字符,则进入标识符识别状态。
+					if (sc.Match('G') && IsADigit(sc.chNext))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_KEYWORD);
+						sc.Forward();
+					}
+					else if (sc.Match('M') && IsADigit(sc.chNext))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_KEYWORD1);
+						sc.Forward();
+					}
+					else if (sc.Match('X')&& (IsADigit(sc.chNext) || (sc.chNext == '-')))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_POSITION_X);
+						sc.Forward();
+					}
+					else if (sc.Match('Y') && (IsADigit(sc.chNext) || (sc.chNext == '-')))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_POSITION_Y);
+						sc.Forward();
+					}
+					else if (sc.Match('Z') && (IsADigit(sc.chNext) || (sc.chNext == '-')))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_POSITION_Z);
+						sc.Forward();
+					}
+					else if ((sc.Match('I') || sc.Match('J') || sc.Match('K')) && (IsADigit(sc.chNext) || (sc.chNext == '-')))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_OFFSET);
+						sc.Forward();
+					}
+					else if (sc.Match('F') && IsADigit(sc.chNext))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_VELOCITY);
+						sc.Forward();
+					}
+					else if (sc.Match('P') && IsADigit(sc.chNext))
+					{
+						sc.SetState(SCE_GCODE_IDENTIFIER_TIMES);
+						sc.Forward();
+					}
+				}
+				
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_COMMENT:
+			{
+				if (sc.atLineEnd)
+				{
+					sc.ChangeState(SCE_GCODE_COMMNET);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+				break;
+			case SCE_GCODE_IDENTIFIER_KEYWORD:
+			case SCE_GCODE_IDENTIFIER_KEYWORD1:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					char s[1000];
+					//取出当前标识符,注意标识符不会超过512,这是预计,不会有人傻到取名一个超过1000的字符串变量。
+					sc.GetCurrent(s, sizeof(s));
+
+					if (keywords.InList(s)) {
+						sc.ChangeState(SCE_GCODE_KEYWORD);
+					}
+					else if (keywords1.InList(s)) {
+						sc.ChangeState(SCE_GCODE_KEYWORD1);
+					}
+					else
+					{
+						sc.ChangeState(SCE_GCODE_DEFAULT);
+					}
+
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_POSITION_X:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_POSITION_X);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_POSITION_Y:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_POSITION_Y);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_POSITION_Z:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_POSITION_Z);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_OFFSET:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_OFFSET);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_VELOCITY:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_VELOCITY);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+			break;
+			case SCE_GCODE_IDENTIFIER_TIMES:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					sc.ChangeState(SCE_GCODE_TIMES);
+					sc.SetState(SCE_GCODE_DEFAULT);
+				}
+			}
+				break;
+		}
+
+		sc.Forward();
+	}
+	
+	styler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 0);
+	sc.Complete();
+
+}
+
+static bool IsCommentLine(Sci_Position line, Accessor &styler) {
+	Sci_Position pos = styler.LineStart(line);
+	const Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
+	for (Sci_Position i = pos; i < eol_pos; i++) {
+		const char ch = styler[i];
+		if (ch == '#')
+			return true;
+		else if (ch != ' ' && ch != '\t')
+			return false;
+	}
+	return false;
+}
+
+static bool IsQuoteLine(Sci_Position line, const Accessor &styler) {
+	const int style = styler.StyleAt(styler.LineStart(line)) & 31;
+	return false;
+}
+
+
+//不处理任何折叠
+void SCI_METHOD LexGCode::Fold(Sci_PositionU startPos, Sci_Position length, int /*initStyle - unused*/, IDocument *pAccess) {
+	return;
+}
+
+static const char *const txtWordListDesc[] = {
+	0
+};
+
+LexerModule lmGCode(SCLEX_GCode, LexGCode::LexerFactoryGCode, "gcode", txtWordListDesc);

+ 362 - 0
src/qscint/scintilla/lexers/LexLog.cpp

@@ -0,0 +1,362 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <string>
+#include <vector>
+#include <map>
+#include <algorithm>
+#include <regex>
+
+#include "ILexer.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#include "StringCopy.h"
+#include "WordList.h"
+#include "LexAccessor.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "CharacterSet.h"
+#include "CharacterCategory.h"
+#include "LexerModule.h"
+#include "OptionSet.h"
+#include "SubStyles.h"
+#include "DefaultLexer.h"
+#include "LexAccessor.h"
+
+#include "UniConversion.h"
+
+using namespace Scintilla;
+
+//const char styleSubable[] = { SCE_P_IDENTIFIER, 0 };
+
+//Default = 0,//中文
+//Ascii = 1,//英文
+//Keyword = 2, //关键字,只有以TXT为母版的
+
+static LexicalClass lexicalClasses[] = {
+	// Lexer Python SCLEX_PYTHON SCE_P_:
+	0, "SCE_LOG_DEFAULT", "default", "default",
+	1, "SCE_LOG_NUM", "Num", "Num",
+	2, "SCE_LOG_DATE", "Date", "Date",
+	3, "SCE_LOG_KEYWORD", "keyword", "keyword",
+};
+
+enum LOG_STATUS { 
+	SCE_LOG_DEFAULT=0, 
+	SCE_LOG_NUM , 
+	SCE_LOG_DATE, 
+	SCE_LOG_KEYWORD, 
+	SCE_LOG_IDENTIFIER,
+	SCE_LOG_HEX
+};
+
+// Options used for LexerPython
+struct OptionsTxt {
+	bool num;
+	bool data;
+	bool keyword;
+
+	OptionsTxt() {
+		num = true;
+		data = true;
+		keyword = true;
+	}
+
+};
+
+
+struct OptionSetTxt : public OptionSet<OptionsTxt> {
+	OptionSetTxt() {
+		DefineProperty("lexer.log.num", &OptionsTxt::num,
+			"text Unicode string");
+
+		DefineProperty("lexer.txt.data", &OptionsTxt::data,
+			"text literals ascii string");
+
+		DefineProperty("lexer.txt.keyword", &OptionsTxt::keyword,
+			"text keyword");
+	}
+};
+
+class LexLOG :public DefaultLexer
+{
+	WordList keywords;
+	OptionsTxt options;
+	OptionSetTxt osTxt;
+	CharacterSet setWord;
+	CharacterSet setWordStart;
+	CharacterSet hexWord;
+public:
+	explicit LexLOG() :
+		DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)),
+		setWord(CharacterSet::setAlphaNum, "._", 0x80, true),//字母、数字、下划线、. 单词的字符集。
+		setWordStart(CharacterSet::setAlpha, "_", 0x80, true),
+		hexWord(CharacterSet::setDigits, "abcdefABCDEF", 0x80, true)
+	{
+		
+	}
+	virtual ~LexLOG() {}
+
+	void SCI_METHOD Release() override {
+		delete this;
+	}
+	int SCI_METHOD Version() const override {
+		return lvSubStyles;
+	}
+	const char *SCI_METHOD PropertyNames() override {
+		return osTxt.PropertyNames();
+	}
+	int SCI_METHOD PropertyType(const char *name) override {
+		return osTxt.PropertyType(name);
+	}
+	const char *SCI_METHOD DescribeProperty(const char *name) override {
+		return osTxt.DescribeProperty(name);
+	}
+	Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override;
+
+	const char *SCI_METHOD DescribeWordListSets() override {
+		return "";
+	}
+	Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override;
+
+	void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
+	void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
+	void *SCI_METHOD PrivateCall(int, void *) override {
+		return 0;
+	}
+	int SCI_METHOD LineEndTypesSupported() override {
+		return SC_LINE_END_TYPE_UNICODE;
+	}
+
+	int SCI_METHOD PrimaryStyleFromStyle(int style) override {
+		return style;
+	}
+
+	int SCI_METHOD DistanceToSecondaryStyles() override {
+		return 0;
+	}
+
+	static ILexer *LexerFactoryLog() {
+		return new LexLOG();
+	}
+};
+
+Sci_Position SCI_METHOD LexLOG::PropertySet(const char *key, const char *val) {
+	if (osTxt.PropertySet(&options, key, val)) {
+		return 0;
+	}
+	return -1;
+}
+
+Sci_Position SCI_METHOD LexLOG::WordListSet(int n, const char *wl) {
+
+	WordList *wordListN = 0;
+	switch (n) {
+	case 0:
+		wordListN = &keywords;
+		break;
+	}
+	Sci_Position firstModification = -1;
+	if (wordListN) {
+		WordList wlNew;
+		wlNew.Set(wl);
+		if (*wordListN != wlNew) {
+			wordListN->Set(wl);
+			firstModification = 0;
+		}
+	}
+	return firstModification;
+}
+
+const int indicatorWhitespace = 1;
+
+inline bool IsAAsciiChar(int ch) {
+	return (ch < 0x80);
+}
+
+inline bool IsAWordStart(int ch, bool unicodeIdentifiers) {
+	if (ch < 0x80)
+		return (isalpha(ch) || ch == '_');
+
+	if (!unicodeIdentifiers)
+		return false;
+
+	return IsXidStart(ch);
+}
+
+//是否是单词分割符号,对于ascii中的数字和字母以外的字符,比如 . @ \t 等,都作为一个单词的分割符号。
+inline bool IsWordSplitChar(int ch) noexcept {
+	return (ch < 0x80) && !isalnum(ch);
+}
+
+inline bool IsLineEol(int ch) noexcept {
+	return ch == '\n' || ch == '\r';
+}
+
+//获取行,最多获取128个字符串
+static std::string GetLineContents(LexAccessor& styler, Sci_Position start, const int len=128) {
+	std::string lineContent;
+	Sci_Position i = 0;
+	char ch = styler.SafeGetCharAt(start, '\n');
+	const Sci_Position endLine = styler.LineEnd(styler.GetLine(start));
+	while (((start + i) < endLine) && ( i < len)) {
+		const char chNext = styler.SafeGetCharAt(start + i + 1, '\n');
+		lineContent += ch;
+		i++;
+		ch = chNext;
+	}
+	return lineContent;
+}
+
+
+
+//只识别中文和英文两种单词的状态
+void SCI_METHOD LexLOG::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
+	Accessor styler(pAccess, NULL);
+
+	const Sci_Position endPos = startPos + length;
+
+	StyleContext sc(startPos, endPos - startPos, initStyle, styler);
+
+	std::regex patternData ("\\d{4}[-/]\\d{2}[-/]\\d{2} \\d{2}:\\d{2}:\\d{2}[.:]\\d{1,3}");
+
+	Sci_Position startIndicator = sc.currentPos;
+
+	bool isDataMatch = false;
+
+	for (; sc.More();) {
+		//如果是在行开头,则获取64字节,识别出其中的日期。
+		if (sc.atLineStart) {
+			std::string lineContens = GetLineContents(styler, sc.currentPos,64);
+			//匹配里面的日期时间值
+			std::smatch result;
+			std::string::const_iterator iterStart = lineContens.begin();
+			std::string::const_iterator iterEnd = lineContens.end();
+
+			//匹配到日期
+			if (std::regex_search(iterStart, iterEnd, result, patternData))
+			{
+				int start = result[0].first - iterStart;
+				int end = result[0].second - iterStart;
+
+				int i = 0;
+				while (i < start)
+				{
+					sc.Forward();
+					++i;
+				}
+				sc.SetState(SCE_LOG_DATE);
+				while (i < end)
+				{
+					sc.Forward();
+					++i;
+				}
+				sc.SetState(SCE_LOG_DEFAULT);
+			}
+		}
+
+		/*if (!sc.atLineEnd && !setWordStart.Contains(sc.chPrev) && setWordStart.Contains(sc.ch)) {
+			sc.SetState(SCE_LOG_DEFAULT);
+			sc.ChangeState(SCE_LOG_IDENTIFIER);
+		}*/
+		switch (sc.state)
+		{
+		case SCE_LOG_HEX:
+		{
+			if (!hexWord.Contains(sc.ch))
+			{
+				sc.ChangeState(SCE_LOG_NUM);//16进制和10进制一样的格式
+				sc.SetState(SCE_LOG_DEFAULT);
+			}
+		}
+			break;
+			case SCE_LOG_NUM:
+			{
+				if (!IsADigit(sc.ch))
+				{
+					sc.SetState(SCE_LOG_DEFAULT);
+				}
+			}
+			break;
+
+			case SCE_LOG_DEFAULT:
+			{
+				//注意顺序,要先判断数字。
+				if (sc.Match('0','x'))
+				{
+					sc.SetState(SCE_LOG_HEX);
+					sc.Forward();
+				}
+				else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
+					//如果当前字符是数字,或者是.数字,则直接设置当前状态为数字。
+					sc.SetState(SCE_LOG_NUM);
+				}
+				else if (!sc.atLineEnd && setWordStart.Contains(sc.ch)) {
+					//如果不在行尾,而且当前字符是一个单词的开头标识字符,则进入标识符识别状态。
+					sc.SetState(SCE_LOG_IDENTIFIER);
+				}
+			}
+			break;
+			case SCE_LOG_IDENTIFIER:
+			{
+				if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch))
+				{
+					char s[1000];
+					//取出当前标识符,注意标识符不会超过1000,这是预计,不会有人傻到取名一个超过1000的字符串变量。
+					sc.GetCurrentLowered(s, sizeof(s));
+
+					if (keywords.InList(s)) {
+						sc.ChangeState(SCE_LOG_KEYWORD);
+					}
+					else
+					{
+						sc.ChangeState(SCE_LOG_DEFAULT);
+					}
+
+					sc.SetState(SCE_LOG_DEFAULT);
+				}
+			}
+		}
+
+		sc.Forward();
+	}
+	
+	styler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 0);
+	sc.Complete();
+
+}
+
+static bool IsCommentLine(Sci_Position line, Accessor &styler) {
+	Sci_Position pos = styler.LineStart(line);
+	const Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
+	for (Sci_Position i = pos; i < eol_pos; i++) {
+		const char ch = styler[i];
+		if (ch == '#')
+			return true;
+		else if (ch != ' ' && ch != '\t')
+			return false;
+	}
+	return false;
+}
+
+static bool IsQuoteLine(Sci_Position line, const Accessor &styler) {
+	const int style = styler.StyleAt(styler.LineStart(line)) & 31;
+	return false;
+}
+
+
+//不处理任何折叠
+void SCI_METHOD LexLOG::Fold(Sci_PositionU startPos, Sci_Position length, int /*initStyle - unused*/, IDocument *pAccess) {
+	return;
+}
+
+static const char *const txtWordListDesc[] = {
+	0
+};
+
+LexerModule lmLog(SCLEX_LOG, LexLOG::LexerFactoryLog, "log", txtWordListDesc);

+ 20 - 1
src/qscint/scintilla/lexers/LexPerl.cpp

@@ -619,12 +619,14 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
 		// 2: here doc text (lines after the delimiter)
 		int Quote;		// the char after '<<'
 		bool Quoted;		// true if Quote in ('\'','"','`')
+		bool StripIndent;	// true if '<<~' requested to strip leading whitespace
 		int DelimiterLength;	// strlen(Delimiter)
 		char Delimiter[HERE_DELIM_MAX];	// the Delimiter
 		HereDocCls() {
 			State = 0;
 			Quote = 0;
 			Quoted = false;
+			StripIndent = false;
 			DelimiterLength = 0;
 			Delimiter[0] = '\0';
 		}
@@ -885,7 +887,7 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
 			sc.SetState(SCE_PL_DEFAULT);
 			break;
 		case SCE_PL_COMMENTLINE:
-			if (sc.atLineEnd) {
+			if (sc.atLineStart) {
 				sc.SetState(SCE_PL_DEFAULT);
 			}
 			break;
@@ -896,8 +898,14 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
 				HereDoc.State = 1;	// pre-init HERE doc class
 				HereDoc.Quote = sc.chNext;
 				HereDoc.Quoted = false;
+				HereDoc.StripIndent = false;
 				HereDoc.DelimiterLength = 0;
 				HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0';
+				if (delim_ch == '~') { // was actually '<<~'
+					sc.Forward();
+					HereDoc.StripIndent = true;
+					HereDoc.Quote = delim_ch = sc.chNext;
+				}
 				if (IsASpaceOrTab(delim_ch)) {
 					// skip whitespace; legal only for quoted delimiters
 					Sci_PositionU i = sc.currentPos + 1;
@@ -964,6 +972,11 @@ void SCI_METHOD LexerPerl::Lex(Sci_PositionU startPos, Sci_Position length, int
 		case SCE_PL_HERE_QX:
 			// also implies HereDoc.State == 2
 			sc.Complete();
+			if (HereDoc.StripIndent) {
+				// skip whitespace
+				while (IsASpaceOrTab(sc.ch) && !sc.atLineEnd)
+					sc.Forward();
+			}
 			if (HereDoc.DelimiterLength == 0 || sc.Match(HereDoc.Delimiter)) {
 				int c = sc.GetRelative(HereDoc.DelimiterLength);
 				if (c == '\r' || c == '\n') {	// peek first, do not consume match
@@ -1701,6 +1714,12 @@ void SCI_METHOD LexerPerl::Fold(Sci_PositionU startPos, Sci_Position length, int
 			} else if (ch == ']') {
 				levelCurrent--;
 			}
+		} else if (style == SCE_PL_STRING_QW) {
+			// qw
+			if (stylePrevCh != style)
+				levelCurrent++;
+			else if (styleNext != style)
+				levelCurrent--;
 		}
 		// POD folding
 		if (options.foldPOD && atLineStart) {

+ 94 - 91
src/qscint/scintilla/lexers/LexTXT.cpp

@@ -1,4 +1,4 @@
-锘�#include <stdlib.h>
+#include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdarg.h>
@@ -33,9 +33,9 @@ using namespace Scintilla;
 
 //const char styleSubable[] = { SCE_P_IDENTIFIER, 0 };
 
-//Default = 0,//涓�枃
-//Ascii = 1,//鑻辨枃
-//Keyword = 2, //鍏抽敭瀛楋紝鍙�湁浠�XT涓烘瘝鐗堢殑
+//Default = 0,//中文
+//Ascii = 1,//英文
+//Keyword = 2, //关键字,只有以TXT为母版的
 
 LexicalClass lexicalClasses[] = {
 	// Lexer Python SCLEX_PYTHON SCE_P_:
@@ -50,10 +50,12 @@ enum literalsAllowed { litNone = 0, litU = 1, litB = 2, litF = 4 };
 struct OptionsTxt {
 	bool ascii;
 	bool utf8;
+	bool keyword;
 
 	OptionsTxt() {
 		ascii = true;
 		utf8 = true;
+		keyword = true;
 	}
 
 };
@@ -66,6 +68,9 @@ struct OptionSetTxt : public OptionSet<OptionsTxt> {
 
 		DefineProperty("lexer.txt.asciistring", &OptionsTxt::ascii,
 			"text literals ascii string");
+
+		DefineProperty("lexer.txt.keyword", &OptionsTxt::keyword,
+			"text keyword");
 	}
 };
 
@@ -75,9 +80,10 @@ class LexTXT :public DefaultLexer
 	//SubStyles subStyles;
 	OptionsTxt options;
 	OptionSetTxt osTxt;
+	bool isUserDefMode;
 public:
 	explicit LexTXT() :
-		DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses))/*,
+		DefaultLexer(lexicalClasses, ELEMENTS(lexicalClasses)), isUserDefMode(false)/*,
 		subStyles(styleSubable, 0x80, 0x40, 0)*/ {
 	}
 	virtual ~LexTXT() {}
@@ -161,7 +167,7 @@ Sci_Position SCI_METHOD LexTXT::WordListSet(int n, const char *wl) {
 	case 0:
 		wordListN = &keywords;
 		break;
-}
+	}
 	Sci_Position firstModification = -1;
 	if (wordListN) {
 		WordList wlNew;
@@ -170,6 +176,7 @@ Sci_Position SCI_METHOD LexTXT::WordListSet(int n, const char *wl) {
 			wordListN->Set(wl);
 			firstModification = 0;
 		}
+		isUserDefMode = (wordListN->Length() > 0);
 	}
 	return firstModification;
 }
@@ -202,108 +209,104 @@ inline bool IsAWordStart(int ch, bool unicodeIdentifiers) {
 	return IsXidStart(ch);
 }
 
-//鍙�瘑鍒�腑鏂囧拰鑻辨枃涓ょ�鍗曡瘝鐨勭姸鎬�
+//是否是单词分割符号,对于ascii中的数字和字母以外的字符,比如 . @ \t 等,都作为一个单词的分割符号。
+inline bool IsWordSplitChar(int ch) noexcept {
+	//return ch == ' ' || ch == '\t';
+	return (ch < 0x80) && !isalnum(ch);
+}
+
+inline bool IsLineEol(int ch) noexcept {
+	return ch == '\n' || ch == '\r';
+}
+
+//只识别中文和英文两种单词的状态
 void SCI_METHOD LexTXT::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
 	Accessor styler(pAccess, NULL);
 
 	const Sci_Position endPos = startPos + length;
 
-	//// Backtrack to previous line in case need to fix its tab whinging
-	//Sci_Position lineCurrent = styler.GetLine(startPos);
-	//if (startPos > 0) {
-	//	if (lineCurrent > 0) {
-	//		lineCurrent--;
-	//		// Look for backslash-continued lines
-	//		while (lineCurrent > 0) {
-	//			Sci_Position eolPos = styler.LineStart(lineCurrent) - 1;
-	//			const int eolStyle = styler.StyleAt(eolPos);
-	//			if (eolStyle == SCE_P_STRING
-	//				|| eolStyle == SCE_P_CHARACTER
-	//				|| eolStyle == SCE_P_STRINGEOL) {
-	//				lineCurrent -= 1;
-	//			}
-	//			else {
-	//				break;
-	//			}
-	//		}
-	//		startPos = styler.LineStart(lineCurrent);
-	//	}
-	//	initStyle = (startPos == 0 ? SCE_P_DEFAULT : styler.StyleAt(startPos - 1));
-	//}
-
-	//initStyle = initStyle & 31;
-	//if (initStyle == SCE_P_STRINGEOL) {
-	//	initStyle = SCE_P_DEFAULT;
-	//}
+	//const WordClassifier& classifierIdentifiers = subStyles.Classifier(SCE_TXT_IDENTIFIER);
 
 	StyleContext sc(startPos, endPos - startPos, initStyle, styler);
 
 	Sci_Position startIndicator = sc.currentPos;
 
-
-	for (; sc.More();) {
-
-		// Check for a new state starting character
-		if (sc.state == SCE_TXT_DEFAULT)
-		{
-			//閬囧埌涓嬩竴涓狝SCII瀛楃�鐨勬椂鍊欙紝杩涘叆璇嗗埆鐘舵€�
-			if (IsAAsciiChar(sc.ch))
+	if (!isUserDefMode)
+	{
+		for (; sc.More();) {
+			// Check for a new state starting character
+			if (sc.state == SCE_TXT_DEFAULT)
 			{
-				sc.SetState(SCE_TXT_IDENTIFIER);
-				}
-				}
-		else if (sc.state == SCE_TXT_ASCII)
-		{
-			//閬囧埌涓嬩竴涓�潪ASCII瀛楃�鐨勬椂鍊欙紝杩涘叆璇嗗埆鐘舵€�
-			if (!IsAAsciiChar(sc.ch))
+				if (IsAAsciiChar(sc.ch))
+				{
+					sc.SetState(SCE_TXT_ASCII);
+				}
+			}
+			else if (sc.state == SCE_TXT_ASCII)
 			{
-				sc.SetState(SCE_TXT_IDENTIFIER);
+				if (!IsAAsciiChar(sc.ch))
+				{
+					sc.SetState(SCE_TXT_DEFAULT);
+				}
 			}
-		}
-
-		if (sc.state == SCE_TXT_IDENTIFIER) {
-
-			//txt灏变笁绉嶇姸鎬併€佽嫳鏂囥€佷腑鏂囥€佽嚜瀹氫箟鍏抽敭瀛椼€傞粯璁ゆ槸涓�枃銆�
-			//閬囧埌闈炲瓧绗﹀拰闈炴暟瀛楋紝寮€濮嬫�娴嬪崟璇�,鏄�叧閿�瓧鍒欒瘑鍒�负鍏抽敭瀛�;鑻ヤ笉鏄�叧閿�瓧锛屽垯鑲�畾鏄�嫳鏂囧瓧绗�
-	
-			//濡傛灉閬囧埌闈濧SCII瀛楃�锛屽垯寮€濮嬫�鏌�
-			if (!IsAAsciiChar(sc.ch)) {
-				char s[1000];
-				sc.GetCurrent(s, sizeof(s));
-				int style = SCE_TXT_IDENTIFIER;
-				if (keywords.InList(s)) 
-		{
-					style = SCE_TXT_KEYWORD;
-		}
-				else
-		{
-					//涓嶆槸鍏抽敭瀛楋紝灏辨槸鏅�€氱殑鑻辨枃鍗曡瘝
-					style = SCE_TXT_ASCII;
+			sc.Forward();
+		}
+	}
+	else
+	{
+		for (; sc.More();) {
+			// Check for a new state starting character
+			if (sc.state == SCE_TXT_DEFAULT)
+			{
+				if (IsAAsciiChar(sc.ch))
+				{
+					//如果要识别关键字,必须要跳过当前空白字符。否则 中文空格后面第一个关键字无法高亮
+					if (IsWordSplitChar(sc.ch) && IsAWordStart(sc.chNext, false))
+					{
+						//这里切换的时候,ForwardSetState跳过当前空白字符
+						sc.ForwardSetState(SCE_TXT_ASCII);
+						continue;
+					}
+					sc.SetState(SCE_TXT_ASCII);
 				}
-				sc.ChangeState(style);
-
-				//涓嬮潰鍑芥暟杩愯�灏卞凡缁忔妸鍏抽敭瀛楁垨鑻辨枃缁欏崟鐙��缃��鏍间簡銆傛�鏃堕粯璁よ繘鍏ヤ腑鏂囬�鏍肩姸鎬�
-			sc.SetState(SCE_TXT_DEFAULT);
+			}
+			else if (sc.state == SCE_TXT_ASCII)
+			{
+				if (!IsAAsciiChar(sc.ch))
+				{
+					sc.SetState(SCE_TXT_DEFAULT);
+				}
+				else //存在自定义关键字,说明是用户自定义语法。
+				{
+					//下面是识别关键字的逻辑。在英文逻辑下,对单词进行识别。
+					//所谓单词,一定是包围在前后空格或\t中的英文单词
+					if ((IsWordSplitChar(sc.ch) /*|| IsLineEol(sc.ch)*/) && isalpha(sc.chPrev))
+					{
+						char s[512];
+						sc.GetCurrent(s, sizeof(s));
+						if (keywords.InList(s))
+						{
+							sc.ChangeState(SCE_TXT_KEYWORD);
+						}
+						sc.SetState(SCE_TXT_ASCII);
+					}
+
 
-		}
-	}
+					if (IsWordSplitChar(sc.ch) && IsAWordStart(sc.chNext, false))
+					{
+						//这里切换的时候,ForwardSetState跳过当前空白字符
+						sc.ForwardSetState(SCE_TXT_ASCII);
+						continue;
+						//sc.SetState(SCE_TXT_ASCII);
+					}
 
-		sc.Forward();
+				}
+			}
+			sc.Forward();
+		}
 	}
 	
-	//鏈€鍚庝竴娈典笉鑳介仐婕忥紝涔熼渶瑕佽瘑鍒�
-	if (sc.state == SCE_TXT_IDENTIFIER)
-	{
-		if (IsAAsciiChar(sc.chPrev))
-		{
-		sc.ChangeState(SCE_TXT_ASCII);
-	}
-	else
-	{
-		sc.ChangeState(SCE_TXT_DEFAULT);
-	}
-	}
-
+	//最后一段不能遗漏,也需要识别
 	sc.SetState(SCE_TXT_DEFAULT);
 
 	styler.IndicatorFill(startIndicator, sc.currentPos, indicatorWhitespace, 0);
@@ -330,7 +333,7 @@ static bool IsQuoteLine(Sci_Position line, const Accessor &styler) {
 }
 
 
-//涓嶅�鐞嗕换浣曟姌鍙�
+//不处理任何折叠
 void SCI_METHOD LexTXT::Fold(Sci_PositionU startPos, Sci_Position length, int /*initStyle - unused*/, IDocument *pAccess) {
 	return;
 }

+ 2 - 0
src/qscint/scintilla/src/Catalogue.cpp

@@ -190,6 +190,7 @@ int Scintilla_LinkLexers() {
 	LINK_LEXER(lmTEHex);
 	LINK_LEXER(lmTeX);
 	LINK_LEXER(lmTxt);
+	LINK_LEXER(lmLog);
 	LINK_LEXER(lmTxt2tags);
 	LINK_LEXER(lmVB);
 	LINK_LEXER(lmVBScript);
@@ -198,6 +199,7 @@ int Scintilla_LinkLexers() {
 	LINK_LEXER(lmVisualProlog);
 	LINK_LEXER(lmXML);
 	LINK_LEXER(lmYAML);
+	LINK_LEXER(lmGCode);
 
 
 //--Autogenerated -- end of automatically generated section

+ 2 - 0
src/qscint/scintilla/src/Document.cpp

@@ -509,6 +509,8 @@ Sci::Line Document::LineFromPositionIndex(Sci::Position pos, int lineCharacterIn
 }
 
 int SCI_METHOD Document::SetLevel(Sci_Position line, int level) {
+	//20230306 这个标记如果不去掉,那么fold的尾部会包含下面新增的空行,定位一天才定位到此。
+	level &= ~SC_FOLDLEVELWHITEFLAG;
 	const int prev = Levels()->SetLevel(static_cast<Sci::Line>(line), level, LinesTotal());
 	if (prev != level) {
 		DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER,

+ 7 - 1
src/qscint/scintilla/src/EditView.cpp

@@ -833,7 +833,13 @@ static void DrawTextBlob(Surface *surface, const ViewStyle &vsDraw, PRectangle r
 	PRectangle rcChar = rcCChar;
 	rcChar.left++;
 	rcChar.right--;
-	surface->DrawTextClipped(rcChar, ctrlCharsFont,
+	// In the original Scintilla code this was a call to DrawTextClipped().
+	// This caused the clipping to be incorrect (triggered when EOLs are
+	// visible) causing text to overwrite the margins when scrolling.  The
+	// change is consistent with the alternative code paths to where
+	// DrawTextBlob() is called bu tthe root cause maybe in PlatQt.cpp or in Qt
+	// itself.
+	surface->DrawTextNoClip(rcChar, ctrlCharsFont,
 		rcSegment.top + vsDraw.maxAscent, s, static_cast<int>(s ? strlen(s) : 0),
 		textBack, textFore);
 }

+ 32 - 5
src/qscint/scintilla/src/Editor.cpp

@@ -1977,8 +1977,18 @@ void Editor::AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS) {
 			// Also treats \0 and naked trail bytes 0x80 to 0xBF as valid
 			// characters representing themselves.
 		} else {
+
+			//发现这里在macOs下面输入要崩溃。于是把windows macos还是区分一下
 			unsigned int utf32[1] = { 0 };
+
+#if defined(Q_OS_WIN)
 			UTF32FromUTF8(s, len, utf32, ELEMENTS(utf32));
+#elif defined(Q_OS_MAC)
+			//在MAC上面最多输入3个字符。因为一个UTF8编码也就三个字符。而且这里原设计也就只接受一个字符。
+			UTF32FromUTF8(s, (len > 3 ? 3 : len), utf32, ELEMENTS(utf32));
+#elif defined(Q_OS_UNIX)
+			UTF32FromUTF8(s, len, utf32, ELEMENTS(utf32));
+#endif
 			byte = utf32[0];
 		}
 		NotifyChar(byte);
@@ -2836,7 +2846,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lPar
 
 	// Send notification
 	SCNotification scn = {};
-	scn.nmhdr.code = SCN_MACRORECORD;
+	scn.nmhdr.code = SCN_MACRORECORD_ID;
 	scn.message = iMessage;
 	scn.wParam = wParam;
 	scn.lParam = lParam;
@@ -5622,7 +5632,7 @@ void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam
 		vs.styles[wParam].back = ColourDesired(static_cast<int>(lParam));
 		break;
 	case SCI_STYLESETBOLD:
-		vs.styles[wParam].weight = lParam != 0 ? SC_WEIGHT_BOLD : SC_WEIGHT_NORMAL;
+		vs.styles[wParam].weight = ((lParam != 0) ? SC_WEIGHT_BOLD : SC_WEIGHT_NORMAL);
 		break;
 	case SCI_STYLESETWEIGHT:
 		vs.styles[wParam].weight = static_cast<int>(lParam);
@@ -5809,12 +5819,26 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 		return pdoc->Length();
 
 	case SCI_CUT:
-		Cut();
-		SetLastXChosen();
+		if (!sel.Empty())
+		{
+			Cut();
+			SetLastXChosen();
+		}
+		else
+		{
+			KeyCommand(SCI_LINECUT);
+		}
 		break;
 
 	case SCI_COPY:
-		Copy();
+		if (!sel.Empty())
+		{
+			Copy();
+		}
+		else
+		{
+			KeyCommand(SCI_LINECOPY);
+		}
 		break;
 
 	case SCI_COPYALLOWLINE:
@@ -7832,6 +7856,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
 		recordingMacro = false;
 		return 0;
 
+	case SCI_GETRECORSTATUS:
+		return (recordingMacro ? 1 : 0);
+
 	case SCI_MOVECARETINSIDEVIEW:
 		MoveCaretInsideView();
 		break;

+ 1045 - 0
src/qscint/scintilla/src/LexHex.cpp

@@ -0,0 +1,1045 @@
+// Scintilla source code edit control
+/** @file LexHex.cxx
+ ** Lexers for Motorola S-Record, Intel HEX and Tektronix extended HEX.
+ **
+ ** Written by Markus Heidelberg
+ **/
+// Copyright 1998-2001 by Neil Hodgson <[email protected]>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+/*
+ *  Motorola S-Record
+ * ===============================
+ *
+ * Each record (line) is built as follows:
+ *
+ *    field       digits          states
+ *
+ *  +----------+
+ *  | start    |  1 ('S')         SCE_HEX_RECSTART
+ *  +----------+
+ *  | type     |  1               SCE_HEX_RECTYPE, (SCE_HEX_RECTYPE_UNKNOWN)
+ *  +----------+
+ *  | count    |  2               SCE_HEX_BYTECOUNT, SCE_HEX_BYTECOUNT_WRONG
+ *  +----------+
+ *  | address  |  4/6/8           SCE_HEX_NOADDRESS, SCE_HEX_DATAADDRESS, SCE_HEX_RECCOUNT, SCE_HEX_STARTADDRESS, (SCE_HEX_ADDRESSFIELD_UNKNOWN)
+ *  +----------+
+ *  | data     |  0..504/502/500  SCE_HEX_DATA_ODD, SCE_HEX_DATA_EVEN, SCE_HEX_DATA_EMPTY, (SCE_HEX_DATA_UNKNOWN)
+ *  +----------+
+ *  | checksum |  2               SCE_HEX_CHECKSUM, SCE_HEX_CHECKSUM_WRONG
+ *  +----------+
+ *
+ *
+ *  Intel HEX
+ * ===============================
+ *
+ * Each record (line) is built as follows:
+ *
+ *    field       digits          states
+ *
+ *  +----------+
+ *  | start    |  1 (':')         SCE_HEX_RECSTART
+ *  +----------+
+ *  | count    |  2               SCE_HEX_BYTECOUNT, SCE_HEX_BYTECOUNT_WRONG
+ *  +----------+
+ *  | address  |  4               SCE_HEX_NOADDRESS, SCE_HEX_DATAADDRESS, (SCE_HEX_ADDRESSFIELD_UNKNOWN)
+ *  +----------+
+ *  | type     |  2               SCE_HEX_RECTYPE, (SCE_HEX_RECTYPE_UNKNOWN)
+ *  +----------+
+ *  | data     |  0..510          SCE_HEX_DATA_ODD, SCE_HEX_DATA_EVEN, SCE_HEX_DATA_EMPTY, SCE_HEX_EXTENDEDADDRESS, SCE_HEX_STARTADDRESS, (SCE_HEX_DATA_UNKNOWN)
+ *  +----------+
+ *  | checksum |  2               SCE_HEX_CHECKSUM, SCE_HEX_CHECKSUM_WRONG
+ *  +----------+
+ *
+ *
+ * Folding:
+ *
+ *   Data records (type 0x00), which follow an extended address record (type
+ *   0x02 or 0x04), can be folded. The extended address record is the fold
+ *   point at fold level 0, the corresponding data records are set to level 1.
+ *
+ *   Any record, which is not a data record, sets the fold level back to 0.
+ *   Any line, which is not a record (blank lines and lines starting with a
+ *   character other than ':'), leaves the fold level unchanged.
+ *
+ *
+ *  Tektronix extended HEX
+ * ===============================
+ *
+ * Each record (line) is built as follows:
+ *
+ *    field       digits          states
+ *
+ *  +----------+
+ *  | start    |  1 ('%')         SCE_HEX_RECSTART
+ *  +----------+
+ *  | length   |  2               SCE_HEX_BYTECOUNT, SCE_HEX_BYTECOUNT_WRONG
+ *  +----------+
+ *  | type     |  1               SCE_HEX_RECTYPE, (SCE_HEX_RECTYPE_UNKNOWN)
+ *  +----------+
+ *  | checksum |  2               SCE_HEX_CHECKSUM, SCE_HEX_CHECKSUM_WRONG
+ *  +----------+
+ *  | address  |  9               SCE_HEX_DATAADDRESS, SCE_HEX_STARTADDRESS, (SCE_HEX_ADDRESSFIELD_UNKNOWN)
+ *  +----------+
+ *  | data     |  0..241          SCE_HEX_DATA_ODD, SCE_HEX_DATA_EVEN
+ *  +----------+
+ *
+ *
+ *  General notes for all lexers
+ * ===============================
+ *
+ * - Depending on where the helper functions are invoked, some of them have to
+ *   read beyond the current position. In case of malformed data (record too
+ *   short), it has to be ensured that this either does not have bad influence
+ *   or will be captured deliberately.
+ *
+ * - States in parentheses in the upper format descriptions indicate that they
+ *   should not appear in a valid hex file.
+ *
+ * - State SCE_HEX_GARBAGE means garbage data after the intended end of the
+ *   record, the line is too long then. This state is used in all lexers.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "ILexer.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+#include "WordList.h"
+#include "LexAccessor.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "CharacterSet.h"
+#include "LexerModule.h"
+
+using namespace Scintilla;
+
+// prototypes for general helper functions
+static inline bool IsNewline(const int ch);
+static int GetHexaNibble(char hd);
+static int GetHexaChar(char hd1, char hd2);
+static int GetHexaChar(Sci_PositionU pos, Accessor &styler);
+static bool ForwardWithinLine(StyleContext &sc, Sci_Position nb = 1);
+static bool PosInSameRecord(Sci_PositionU pos1, Sci_PositionU pos2, Accessor &styler);
+static Sci_Position CountByteCount(Sci_PositionU startPos, Sci_Position uncountedDigits, Accessor &styler);
+static int CalcChecksum(Sci_PositionU startPos, Sci_Position cnt, bool twosCompl, Accessor &styler);
+
+// prototypes for file format specific helper functions
+static Sci_PositionU GetSrecRecStartPosition(Sci_PositionU pos, Accessor &styler);
+static int GetSrecByteCount(Sci_PositionU recStartPos, Accessor &styler);
+static Sci_Position CountSrecByteCount(Sci_PositionU recStartPos, Accessor &styler);
+static int GetSrecAddressFieldSize(Sci_PositionU recStartPos, Accessor &styler);
+static int GetSrecAddressFieldType(Sci_PositionU recStartPos, Accessor &styler);
+static int GetSrecDataFieldType(Sci_PositionU recStartPos, Accessor &styler);
+static Sci_Position GetSrecRequiredDataFieldSize(Sci_PositionU recStartPos, Accessor &styler);
+static int GetSrecChecksum(Sci_PositionU recStartPos, Accessor &styler);
+static int CalcSrecChecksum(Sci_PositionU recStartPos, Accessor &styler);
+
+static Sci_PositionU GetIHexRecStartPosition(Sci_PositionU pos, Accessor &styler);
+static int GetIHexByteCount(Sci_PositionU recStartPos, Accessor &styler);
+static Sci_Position CountIHexByteCount(Sci_PositionU recStartPos, Accessor &styler);
+static int GetIHexAddressFieldType(Sci_PositionU recStartPos, Accessor &styler);
+static int GetIHexDataFieldType(Sci_PositionU recStartPos, Accessor &styler);
+static int GetIHexRequiredDataFieldSize(Sci_PositionU recStartPos, Accessor &styler);
+static int GetIHexChecksum(Sci_PositionU recStartPos, Accessor &styler);
+static int CalcIHexChecksum(Sci_PositionU recStartPos, Accessor &styler);
+
+static int GetTEHexDigitCount(Sci_PositionU recStartPos, Accessor &styler);
+static Sci_Position CountTEHexDigitCount(Sci_PositionU recStartPos, Accessor &styler);
+static int GetTEHexAddressFieldType(Sci_PositionU recStartPos, Accessor &styler);
+static int GetTEHexChecksum(Sci_PositionU recStartPos, Accessor &styler);
+static int CalcTEHexChecksum(Sci_PositionU recStartPos, Accessor &styler);
+
+static inline bool IsNewline(const int ch)
+{
+    return (ch == '\n' || ch == '\r');
+}
+
+static int GetHexaNibble(char hd)
+{
+	int hexValue = 0;
+
+	if (hd >= '0' && hd <= '9') {
+		hexValue += hd - '0';
+	} else if (hd >= 'A' && hd <= 'F') {
+		hexValue += hd - 'A' + 10;
+	} else if (hd >= 'a' && hd <= 'f') {
+		hexValue += hd - 'a' + 10;
+	} else {
+		return -1;
+	}
+
+	return hexValue;
+}
+
+static int GetHexaChar(char hd1, char hd2)
+{
+	int hexValue = 0;
+
+	if (hd1 >= '0' && hd1 <= '9') {
+		hexValue += 16 * (hd1 - '0');
+	} else if (hd1 >= 'A' && hd1 <= 'F') {
+		hexValue += 16 * (hd1 - 'A' + 10);
+	} else if (hd1 >= 'a' && hd1 <= 'f') {
+		hexValue += 16 * (hd1 - 'a' + 10);
+	} else {
+		return -1;
+	}
+
+	if (hd2 >= '0' && hd2 <= '9') {
+		hexValue += hd2 - '0';
+	} else if (hd2 >= 'A' && hd2 <= 'F') {
+		hexValue += hd2 - 'A' + 10;
+	} else if (hd2 >= 'a' && hd2 <= 'f') {
+		hexValue += hd2 - 'a' + 10;
+	} else {
+		return -1;
+	}
+
+	return hexValue;
+}
+
+static int GetHexaChar(Sci_PositionU pos, Accessor &styler)
+{
+	char highNibble, lowNibble;
+
+	highNibble = styler.SafeGetCharAt(pos);
+	lowNibble = styler.SafeGetCharAt(pos + 1);
+
+	return GetHexaChar(highNibble, lowNibble);
+}
+
+// Forward <nb> characters, but abort (and return false) if hitting the line
+// end. Return true if forwarding within the line was possible.
+// Avoids influence on highlighting of the subsequent line if the current line
+// is malformed (too short).
+static bool ForwardWithinLine(StyleContext &sc, Sci_Position nb)
+{
+	for (Sci_Position i = 0; i < nb; i++) {
+		if (sc.atLineEnd) {
+			// line is too short
+			sc.SetState(SCE_HEX_DEFAULT);
+			sc.Forward();
+			return false;
+		} else {
+			sc.Forward();
+		}
+	}
+
+	return true;
+}
+
+// Checks whether the given positions are in the same record.
+static bool PosInSameRecord(Sci_PositionU pos1, Sci_PositionU pos2, Accessor &styler)
+{
+	return styler.GetLine(pos1) == styler.GetLine(pos2);
+}
+
+// Count the number of digit pairs from <startPos> till end of record, ignoring
+// <uncountedDigits> digits.
+// If the record is too short, a negative count may be returned.
+static Sci_Position CountByteCount(Sci_PositionU startPos, Sci_Position uncountedDigits, Accessor &styler)
+{
+	Sci_Position cnt;
+	Sci_PositionU pos;
+
+	pos = startPos;
+
+	while (!IsNewline(styler.SafeGetCharAt(pos, '\n'))) {
+		pos++;
+	}
+
+	// number of digits in this line minus number of digits of uncounted fields
+	cnt = static_cast<Sci_Position>(pos - startPos) - uncountedDigits;
+
+	// Prepare round up if odd (digit pair incomplete), this way the byte
+	// count is considered to be valid if the checksum is incomplete.
+	if (cnt >= 0) {
+		cnt++;
+	}
+
+	// digit pairs
+	cnt /= 2;
+
+	return cnt;
+}
+
+// Calculate the checksum of the record.
+// <startPos> is the position of the first character of the starting digit
+// pair, <cnt> is the number of digit pairs.
+static int CalcChecksum(Sci_PositionU startPos, Sci_Position cnt, bool twosCompl, Accessor &styler)
+{
+	int cs = 0;
+
+	for (Sci_PositionU pos = startPos; pos < startPos + cnt; pos += 2) {
+		int val = GetHexaChar(pos, styler);
+
+		if (val < 0) {
+			return val;
+		}
+
+		// overflow does not matter
+		cs += val;
+	}
+
+	if (twosCompl) {
+		// low byte of two's complement
+		return -cs & 0xFF;
+	} else {
+		// low byte of one's complement
+		return ~cs & 0xFF;
+	}
+}
+
+// Get the position of the record "start" field (first character in line) in
+// the record around position <pos>.
+static Sci_PositionU GetSrecRecStartPosition(Sci_PositionU pos, Accessor &styler)
+{
+	while (styler.SafeGetCharAt(pos) != 'S') {
+		pos--;
+	}
+
+	return pos;
+}
+
+// Get the value of the "byte count" field, it counts the number of bytes in
+// the subsequent fields ("address", "data" and "checksum" fields).
+static int GetSrecByteCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int val;
+
+	val = GetHexaChar(recStartPos + 2, styler);
+	if (val < 0) {
+	       val = 0;
+	}
+
+	return val;
+}
+
+// Count the number of digit pairs for the "address", "data" and "checksum"
+// fields in this record. Has to be equal to the "byte count" field value.
+// If the record is too short, a negative count may be returned.
+static Sci_Position CountSrecByteCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	return CountByteCount(recStartPos, 4, styler);
+}
+
+// Get the size of the "address" field.
+static int GetSrecAddressFieldSize(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (styler.SafeGetCharAt(recStartPos + 1)) {
+		case '0':
+		case '1':
+		case '5':
+		case '9':
+			return 2; // 16 bit
+
+		case '2':
+		case '6':
+		case '8':
+			return 3; // 24 bit
+
+		case '3':
+		case '7':
+			return 4; // 32 bit
+
+		default:
+			return 0;
+	}
+}
+
+// Get the type of the "address" field content.
+static int GetSrecAddressFieldType(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (styler.SafeGetCharAt(recStartPos + 1)) {
+		case '0':
+			return SCE_HEX_NOADDRESS;
+
+		case '1':
+		case '2':
+		case '3':
+			return SCE_HEX_DATAADDRESS;
+
+		case '5':
+		case '6':
+			return SCE_HEX_RECCOUNT;
+
+		case '7':
+		case '8':
+		case '9':
+			return SCE_HEX_STARTADDRESS;
+
+		default: // handle possible format extension in the future
+			return SCE_HEX_ADDRESSFIELD_UNKNOWN;
+	}
+}
+
+// Get the type of the "data" field content.
+static int GetSrecDataFieldType(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (styler.SafeGetCharAt(recStartPos + 1)) {
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+			return SCE_HEX_DATA_ODD;
+
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+			return SCE_HEX_DATA_EMPTY;
+
+		default: // handle possible format extension in the future
+			return SCE_HEX_DATA_UNKNOWN;
+	}
+}
+
+// Get the required size of the "data" field. Useless for block header and
+// ordinary data records (type S0, S1, S2, S3), return the value calculated
+// from the "byte count" and "address field" size in this case.
+static Sci_Position GetSrecRequiredDataFieldSize(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (styler.SafeGetCharAt(recStartPos + 1)) {
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+			return 0;
+
+		default:
+			return GetSrecByteCount(recStartPos, styler)
+				- GetSrecAddressFieldSize(recStartPos, styler)
+				- 1; // -1 for checksum field
+	}
+}
+
+// Get the value of the "checksum" field.
+static int GetSrecChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int byteCount;
+
+	byteCount = GetSrecByteCount(recStartPos, styler);
+
+	return GetHexaChar(recStartPos + 2 + byteCount * 2, styler);
+}
+
+// Calculate the checksum of the record.
+static int CalcSrecChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	Sci_Position byteCount;
+
+	byteCount = GetSrecByteCount(recStartPos, styler);
+
+	// sum over "byte count", "address" and "data" fields (6..510 digits)
+	return CalcChecksum(recStartPos + 2, byteCount * 2, false, styler);
+}
+
+// Get the position of the record "start" field (first character in line) in
+// the record around position <pos>.
+static Sci_PositionU GetIHexRecStartPosition(Sci_PositionU pos, Accessor &styler)
+{
+	while (styler.SafeGetCharAt(pos) != ':') {
+		pos--;
+	}
+
+	return pos;
+}
+
+// Get the value of the "byte count" field, it counts the number of bytes in
+// the "data" field.
+static int GetIHexByteCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int val;
+
+	val = GetHexaChar(recStartPos + 1, styler);
+	if (val < 0) {
+	       val = 0;
+	}
+
+	return val;
+}
+
+// Count the number of digit pairs for the "data" field in this record. Has to
+// be equal to the "byte count" field value.
+// If the record is too short, a negative count may be returned.
+static Sci_Position CountIHexByteCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	return CountByteCount(recStartPos, 11, styler);
+}
+
+// Get the type of the "address" field content.
+static int GetIHexAddressFieldType(Sci_PositionU recStartPos, Accessor &styler)
+{
+	if (!PosInSameRecord(recStartPos, recStartPos + 7, styler)) {
+		// malformed (record too short)
+		// type cannot be determined
+		return SCE_HEX_ADDRESSFIELD_UNKNOWN;
+	}
+
+	switch (GetHexaChar(recStartPos + 7, styler)) {
+		case 0x00:
+			return SCE_HEX_DATAADDRESS;
+
+		case 0x01:
+		case 0x02:
+		case 0x03:
+		case 0x04:
+		case 0x05:
+			return SCE_HEX_NOADDRESS;
+
+		default: // handle possible format extension in the future
+			return SCE_HEX_ADDRESSFIELD_UNKNOWN;
+	}
+}
+
+// Get the type of the "data" field content.
+static int GetIHexDataFieldType(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (GetHexaChar(recStartPos + 7, styler)) {
+		case 0x00:
+			return SCE_HEX_DATA_ODD;
+
+		case 0x01:
+			return SCE_HEX_DATA_EMPTY;
+
+		case 0x02:
+		case 0x04:
+			return SCE_HEX_EXTENDEDADDRESS;
+
+		case 0x03:
+		case 0x05:
+			return SCE_HEX_STARTADDRESS;
+
+		default: // handle possible format extension in the future
+			return SCE_HEX_DATA_UNKNOWN;
+	}
+}
+
+// Get the required size of the "data" field. Useless for an ordinary data
+// record (type 00), return the "byte count" in this case.
+static int GetIHexRequiredDataFieldSize(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (GetHexaChar(recStartPos + 7, styler)) {
+		case 0x01:
+			return 0;
+
+		case 0x02:
+		case 0x04:
+			return 2;
+
+		case 0x03:
+		case 0x05:
+			return 4;
+
+		default:
+			return GetIHexByteCount(recStartPos, styler);
+	}
+}
+
+// Get the value of the "checksum" field.
+static int GetIHexChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int byteCount;
+
+	byteCount = GetIHexByteCount(recStartPos, styler);
+
+	return GetHexaChar(recStartPos + 9 + byteCount * 2, styler);
+}
+
+// Calculate the checksum of the record.
+static int CalcIHexChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int byteCount;
+
+	byteCount = GetIHexByteCount(recStartPos, styler);
+
+	// sum over "byte count", "address", "type" and "data" fields (8..518 digits)
+	return CalcChecksum(recStartPos + 1, 8 + byteCount * 2, true, styler);
+}
+
+
+// Get the value of the "record length" field, it counts the number of digits in
+// the record excluding the percent.
+static int GetTEHexDigitCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	int val = GetHexaChar(recStartPos + 1, styler);
+	if (val < 0)
+	       val = 0;
+
+	return val;
+}
+
+// Count the number of digits in this record. Has to
+// be equal to the "record length" field value.
+static Sci_Position CountTEHexDigitCount(Sci_PositionU recStartPos, Accessor &styler)
+{
+	Sci_PositionU pos;
+
+	pos = recStartPos+1;
+
+	while (!IsNewline(styler.SafeGetCharAt(pos, '\n'))) {
+		pos++;
+	}
+
+	return static_cast<Sci_Position>(pos - (recStartPos+1));
+}
+
+// Get the type of the "address" field content.
+static int GetTEHexAddressFieldType(Sci_PositionU recStartPos, Accessor &styler)
+{
+	switch (styler.SafeGetCharAt(recStartPos + 3)) {
+		case '6':
+			return SCE_HEX_DATAADDRESS;
+
+		case '8':
+			return SCE_HEX_STARTADDRESS;
+
+		default: // handle possible format extension in the future
+			return SCE_HEX_ADDRESSFIELD_UNKNOWN;
+	}
+}
+
+// Get the value of the "checksum" field.
+static int GetTEHexChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	return GetHexaChar(recStartPos+4, styler);
+}
+
+// Calculate the checksum of the record (excluding the checksum field).
+static int CalcTEHexChecksum(Sci_PositionU recStartPos, Accessor &styler)
+{
+	Sci_PositionU pos = recStartPos +1;
+	Sci_PositionU length = GetTEHexDigitCount(recStartPos, styler);
+
+	int cs = GetHexaNibble(styler.SafeGetCharAt(pos++));//length
+	cs += GetHexaNibble(styler.SafeGetCharAt(pos++));//length
+
+	cs += GetHexaNibble(styler.SafeGetCharAt(pos++));//type
+
+	pos += 2;// jump over CS field
+
+	for (; pos <= recStartPos + length; ++pos) {
+		int val = GetHexaNibble(styler.SafeGetCharAt(pos));
+
+		if (val < 0) {
+			return val;
+		}
+
+		// overflow does not matter
+		cs += val;
+	}
+
+	// low byte
+	return cs & 0xFF;
+
+}
+
+static void ColouriseSrecDoc(Sci_PositionU startPos, Sci_Position length, int initStyle, WordList *[], Accessor &styler)
+{
+	StyleContext sc(startPos, length, initStyle, styler);
+
+	while (sc.More()) {
+		Sci_PositionU recStartPos;
+		Sci_Position reqByteCount;
+		Sci_Position dataFieldSize;
+		int byteCount, addrFieldSize, addrFieldType, dataFieldType;
+		int cs1, cs2;
+
+		switch (sc.state) {
+			case SCE_HEX_DEFAULT:
+				if (sc.atLineStart && sc.Match('S')) {
+					sc.SetState(SCE_HEX_RECSTART);
+				}
+				ForwardWithinLine(sc);
+				break;
+
+			case SCE_HEX_RECSTART:
+				recStartPos = sc.currentPos - 1;
+				addrFieldType = GetSrecAddressFieldType(recStartPos, styler);
+
+				if (addrFieldType == SCE_HEX_ADDRESSFIELD_UNKNOWN) {
+					sc.SetState(SCE_HEX_RECTYPE_UNKNOWN);
+				} else {
+					sc.SetState(SCE_HEX_RECTYPE);
+				}
+
+				ForwardWithinLine(sc);
+				break;
+
+			case SCE_HEX_RECTYPE:
+			case SCE_HEX_RECTYPE_UNKNOWN:
+				recStartPos = sc.currentPos - 2;
+				byteCount = GetSrecByteCount(recStartPos, styler);
+				reqByteCount = GetSrecAddressFieldSize(recStartPos, styler)
+						+ GetSrecRequiredDataFieldSize(recStartPos, styler)
+						+ 1; // +1 for checksum field
+
+				if (byteCount == CountSrecByteCount(recStartPos, styler)
+						&& byteCount == reqByteCount) {
+					sc.SetState(SCE_HEX_BYTECOUNT);
+				} else {
+					sc.SetState(SCE_HEX_BYTECOUNT_WRONG);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_BYTECOUNT:
+			case SCE_HEX_BYTECOUNT_WRONG:
+				recStartPos = sc.currentPos - 4;
+				addrFieldSize = GetSrecAddressFieldSize(recStartPos, styler);
+				addrFieldType = GetSrecAddressFieldType(recStartPos, styler);
+
+				sc.SetState(addrFieldType);
+				ForwardWithinLine(sc, addrFieldSize * 2);
+				break;
+
+			case SCE_HEX_NOADDRESS:
+			case SCE_HEX_DATAADDRESS:
+			case SCE_HEX_RECCOUNT:
+			case SCE_HEX_STARTADDRESS:
+			case SCE_HEX_ADDRESSFIELD_UNKNOWN:
+				recStartPos = GetSrecRecStartPosition(sc.currentPos, styler);
+				dataFieldType = GetSrecDataFieldType(recStartPos, styler);
+
+				// Using the required size here if possible has the effect that the
+				// checksum is highlighted at a fixed position after this field for
+				// specific record types, independent on the "byte count" value.
+				dataFieldSize = GetSrecRequiredDataFieldSize(recStartPos, styler);
+
+				sc.SetState(dataFieldType);
+
+				if (dataFieldType == SCE_HEX_DATA_ODD) {
+					for (int i = 0; i < dataFieldSize * 2; i++) {
+						if ((i & 0x3) == 0) {
+							sc.SetState(SCE_HEX_DATA_ODD);
+						} else if ((i & 0x3) == 2) {
+							sc.SetState(SCE_HEX_DATA_EVEN);
+						}
+
+						if (!ForwardWithinLine(sc)) {
+							break;
+						}
+					}
+				} else {
+					ForwardWithinLine(sc, dataFieldSize * 2);
+				}
+				break;
+
+			case SCE_HEX_DATA_ODD:
+			case SCE_HEX_DATA_EVEN:
+			case SCE_HEX_DATA_EMPTY:
+			case SCE_HEX_DATA_UNKNOWN:
+				recStartPos = GetSrecRecStartPosition(sc.currentPos, styler);
+				cs1 = CalcSrecChecksum(recStartPos, styler);
+				cs2 = GetSrecChecksum(recStartPos, styler);
+
+				if (cs1 != cs2 || cs1 < 0 || cs2 < 0) {
+					sc.SetState(SCE_HEX_CHECKSUM_WRONG);
+				} else {
+					sc.SetState(SCE_HEX_CHECKSUM);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_CHECKSUM:
+			case SCE_HEX_CHECKSUM_WRONG:
+			case SCE_HEX_GARBAGE:
+				// record finished or line too long
+				sc.SetState(SCE_HEX_GARBAGE);
+				ForwardWithinLine(sc);
+				break;
+
+			default:
+				// prevent endless loop in faulty state
+				sc.SetState(SCE_HEX_DEFAULT);
+				break;
+		}
+	}
+	sc.Complete();
+}
+
+static void ColouriseIHexDoc(Sci_PositionU startPos, Sci_Position length, int initStyle, WordList *[], Accessor &styler)
+{
+	StyleContext sc(startPos, length, initStyle, styler);
+
+	while (sc.More()) {
+		Sci_PositionU recStartPos;
+		int byteCount, addrFieldType, dataFieldSize, dataFieldType;
+		int cs1, cs2;
+
+		switch (sc.state) {
+			case SCE_HEX_DEFAULT:
+				if (sc.atLineStart && sc.Match(':')) {
+					sc.SetState(SCE_HEX_RECSTART);
+				}
+				ForwardWithinLine(sc);
+				break;
+
+			case SCE_HEX_RECSTART:
+				recStartPos = sc.currentPos - 1;
+				byteCount = GetIHexByteCount(recStartPos, styler);
+				dataFieldSize = GetIHexRequiredDataFieldSize(recStartPos, styler);
+
+				if (byteCount == CountIHexByteCount(recStartPos, styler)
+						&& byteCount == dataFieldSize) {
+					sc.SetState(SCE_HEX_BYTECOUNT);
+				} else {
+					sc.SetState(SCE_HEX_BYTECOUNT_WRONG);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_BYTECOUNT:
+			case SCE_HEX_BYTECOUNT_WRONG:
+				recStartPos = sc.currentPos - 3;
+				addrFieldType = GetIHexAddressFieldType(recStartPos, styler);
+
+				sc.SetState(addrFieldType);
+				ForwardWithinLine(sc, 4);
+				break;
+
+			case SCE_HEX_NOADDRESS:
+			case SCE_HEX_DATAADDRESS:
+			case SCE_HEX_ADDRESSFIELD_UNKNOWN:
+				recStartPos = sc.currentPos - 7;
+				addrFieldType = GetIHexAddressFieldType(recStartPos, styler);
+
+				if (addrFieldType == SCE_HEX_ADDRESSFIELD_UNKNOWN) {
+					sc.SetState(SCE_HEX_RECTYPE_UNKNOWN);
+				} else {
+					sc.SetState(SCE_HEX_RECTYPE);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_RECTYPE:
+			case SCE_HEX_RECTYPE_UNKNOWN:
+				recStartPos = sc.currentPos - 9;
+				dataFieldType = GetIHexDataFieldType(recStartPos, styler);
+
+				// Using the required size here if possible has the effect that the
+				// checksum is highlighted at a fixed position after this field for
+				// specific record types, independent on the "byte count" value.
+				dataFieldSize = GetIHexRequiredDataFieldSize(recStartPos, styler);
+
+				sc.SetState(dataFieldType);
+
+				if (dataFieldType == SCE_HEX_DATA_ODD) {
+					for (int i = 0; i < dataFieldSize * 2; i++) {
+						if ((i & 0x3) == 0) {
+							sc.SetState(SCE_HEX_DATA_ODD);
+						} else if ((i & 0x3) == 2) {
+							sc.SetState(SCE_HEX_DATA_EVEN);
+						}
+
+						if (!ForwardWithinLine(sc)) {
+							break;
+						}
+					}
+				} else {
+					ForwardWithinLine(sc, dataFieldSize * 2);
+				}
+				break;
+
+			case SCE_HEX_DATA_ODD:
+			case SCE_HEX_DATA_EVEN:
+			case SCE_HEX_DATA_EMPTY:
+			case SCE_HEX_EXTENDEDADDRESS:
+			case SCE_HEX_STARTADDRESS:
+			case SCE_HEX_DATA_UNKNOWN:
+				recStartPos = GetIHexRecStartPosition(sc.currentPos, styler);
+				cs1 = CalcIHexChecksum(recStartPos, styler);
+				cs2 = GetIHexChecksum(recStartPos, styler);
+
+				if (cs1 != cs2 || cs1 < 0 || cs2 < 0) {
+					sc.SetState(SCE_HEX_CHECKSUM_WRONG);
+				} else {
+					sc.SetState(SCE_HEX_CHECKSUM);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_CHECKSUM:
+			case SCE_HEX_CHECKSUM_WRONG:
+			case SCE_HEX_GARBAGE:
+				// record finished or line too long
+				sc.SetState(SCE_HEX_GARBAGE);
+				ForwardWithinLine(sc);
+				break;
+
+			default:
+				// prevent endless loop in faulty state
+				sc.SetState(SCE_HEX_DEFAULT);
+				break;
+		}
+	}
+	sc.Complete();
+}
+
+static void FoldIHexDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler)
+{
+	Sci_PositionU endPos = startPos + length;
+
+	Sci_Position lineCurrent = styler.GetLine(startPos);
+	int levelCurrent = SC_FOLDLEVELBASE;
+	if (lineCurrent > 0)
+		levelCurrent = styler.LevelAt(lineCurrent - 1);
+
+	Sci_PositionU lineStartNext = styler.LineStart(lineCurrent + 1);
+	int levelNext = SC_FOLDLEVELBASE; // default if no specific line found
+
+	for (Sci_PositionU i = startPos; i < endPos; i++) {
+		bool atEOL = i == (lineStartNext - 1);
+		int style = styler.StyleAt(i);
+
+		// search for specific lines
+		if (style == SCE_HEX_EXTENDEDADDRESS) {
+			// extended addres record
+			levelNext = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
+		} else if (style == SCE_HEX_DATAADDRESS
+			|| (style == SCE_HEX_DEFAULT
+				&& i == (Sci_PositionU)styler.LineStart(lineCurrent))) {
+			// data record or no record start code at all
+			if (levelCurrent & SC_FOLDLEVELHEADERFLAG) {
+				levelNext = SC_FOLDLEVELBASE + 1;
+			} else {
+				// continue level 0 or 1, no fold point
+				levelNext = levelCurrent;
+			}
+		}
+
+		if (atEOL || (i == endPos - 1)) {
+			styler.SetLevel(lineCurrent, levelNext);
+
+			lineCurrent++;
+			lineStartNext = styler.LineStart(lineCurrent + 1);
+			levelCurrent = levelNext;
+			levelNext = SC_FOLDLEVELBASE;
+		}
+	}
+}
+
+static void ColouriseTEHexDoc(Sci_PositionU startPos, Sci_Position length, int initStyle, WordList *[], Accessor &styler)
+{
+	StyleContext sc(startPos, length, initStyle, styler);
+
+	while (sc.More()) {
+		Sci_PositionU recStartPos;
+		int digitCount, addrFieldType;
+		int cs1, cs2;
+
+		switch (sc.state) {
+			case SCE_HEX_DEFAULT:
+				if (sc.atLineStart && sc.Match('%')) {
+					sc.SetState(SCE_HEX_RECSTART);
+				}
+				ForwardWithinLine(sc);
+				break;
+
+			case SCE_HEX_RECSTART:
+
+				recStartPos = sc.currentPos - 1;
+
+				if (GetTEHexDigitCount(recStartPos, styler) == CountTEHexDigitCount(recStartPos, styler)) {
+					sc.SetState(SCE_HEX_BYTECOUNT);
+				} else {
+					sc.SetState(SCE_HEX_BYTECOUNT_WRONG);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+			case SCE_HEX_BYTECOUNT:
+			case SCE_HEX_BYTECOUNT_WRONG:
+				recStartPos = sc.currentPos - 3;
+				addrFieldType = GetTEHexAddressFieldType(recStartPos, styler);
+
+				if (addrFieldType == SCE_HEX_ADDRESSFIELD_UNKNOWN) {
+					sc.SetState(SCE_HEX_RECTYPE_UNKNOWN);
+				} else {
+					sc.SetState(SCE_HEX_RECTYPE);
+				}
+
+				ForwardWithinLine(sc);
+				break;
+
+			case SCE_HEX_RECTYPE:
+			case SCE_HEX_RECTYPE_UNKNOWN:
+				recStartPos = sc.currentPos - 4;
+				cs1 = CalcTEHexChecksum(recStartPos, styler);
+				cs2 = GetTEHexChecksum(recStartPos, styler);
+
+				if (cs1 != cs2 || cs1 < 0 || cs2 < 0) {
+					sc.SetState(SCE_HEX_CHECKSUM_WRONG);
+				} else {
+					sc.SetState(SCE_HEX_CHECKSUM);
+				}
+
+				ForwardWithinLine(sc, 2);
+				break;
+
+
+			case SCE_HEX_CHECKSUM:
+			case SCE_HEX_CHECKSUM_WRONG:
+				recStartPos = sc.currentPos - 6;
+				addrFieldType = GetTEHexAddressFieldType(recStartPos, styler);
+
+				sc.SetState(addrFieldType);
+				ForwardWithinLine(sc, 9);
+				break;
+
+			case SCE_HEX_DATAADDRESS:
+			case SCE_HEX_STARTADDRESS:
+			case SCE_HEX_ADDRESSFIELD_UNKNOWN:
+				recStartPos = sc.currentPos - 15;
+				digitCount = GetTEHexDigitCount(recStartPos, styler) - 14;
+
+				sc.SetState(SCE_HEX_DATA_ODD);
+
+				for (int i = 0; i < digitCount; i++) {
+					if ((i & 0x3) == 0) {
+						sc.SetState(SCE_HEX_DATA_ODD);
+					} else if ((i & 0x3) == 2) {
+						sc.SetState(SCE_HEX_DATA_EVEN);
+					}
+
+					if (!ForwardWithinLine(sc)) {
+						break;
+					}
+				}
+				break;
+
+			case SCE_HEX_DATA_ODD:
+			case SCE_HEX_DATA_EVEN:
+			case SCE_HEX_GARBAGE:
+				// record finished or line too long
+				sc.SetState(SCE_HEX_GARBAGE);
+				ForwardWithinLine(sc);
+				break;
+
+			default:
+				// prevent endless loop in faulty state
+				sc.SetState(SCE_HEX_DEFAULT);
+				break;
+		}
+	}
+	sc.Complete();
+}
+
+LexerModule lmSrec(SCLEX_SREC, ColouriseSrecDoc, "srec", 0, NULL);
+LexerModule lmIHex(SCLEX_IHEX, ColouriseIHexDoc, "ihex", FoldIHexDoc, NULL);
+LexerModule lmTEHex(SCLEX_TEHEX, ColouriseTEHexDoc, "tehex", 0, NULL);

+ 312 - 226
src/qscint/scintilla/src/LineMarker.cpp

@@ -1,4 +1,4 @@
-// Scintilla source code edit control
+// Scintilla source code edit control
 /** @file LineMarker.cxx
  ** Defines the look of a line marker in the margin.
  **/
@@ -167,270 +167,356 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac
 		// On textual margins move marker to the left to try to avoid overlapping the text
 		centreX = ircWhole.left + dimOn2 + 1;
 	}
-	if (markType == SC_MARK_ROUNDRECT) {
-		PRectangle rcRounded = rc;
-		rcRounded.left = rc.left + 1;
-		rcRounded.right = rc.right - 1;
-		surface->RoundedRectangle(rcRounded, fore, back);
-	} else if (markType == SC_MARK_CIRCLE) {
-		const PRectangle rcCircle = PRectangle::FromInts(
-			centreX - dimOn2,
-			centreY - dimOn2,
-			centreX + dimOn2,
-			centreY + dimOn2);
-		surface->Ellipse(rcCircle, fore, back);
-	} else if (markType == SC_MARK_ARROW) {
-		Point pts[] = {
-    		Point::FromInts(centreX - dimOn4, centreY - dimOn2),
-    		Point::FromInts(centreX - dimOn4, centreY + dimOn2),
-    		Point::FromInts(centreX + dimOn2 - dimOn4, centreY),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-
-	} else if (markType == SC_MARK_ARROWDOWN) {
-		Point pts[] = {
-    		Point::FromInts(centreX - dimOn2, centreY - dimOn4),
-    		Point::FromInts(centreX + dimOn2, centreY - dimOn4),
-    		Point::FromInts(centreX, centreY + dimOn2 - dimOn4),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-
-	} else if (markType == SC_MARK_PLUS) {
-		Point pts[] = {
-    		Point::FromInts(centreX - armSize, centreY - 1),
-    		Point::FromInts(centreX - 1, centreY - 1),
-    		Point::FromInts(centreX - 1, centreY - armSize),
-    		Point::FromInts(centreX + 1, centreY - armSize),
-    		Point::FromInts(centreX + 1, centreY - 1),
-    		Point::FromInts(centreX + armSize, centreY -1),
-    		Point::FromInts(centreX + armSize, centreY +1),
-    		Point::FromInts(centreX + 1, centreY + 1),
-    		Point::FromInts(centreX + 1, centreY + armSize),
-    		Point::FromInts(centreX - 1, centreY + armSize),
-    		Point::FromInts(centreX - 1, centreY + 1),
-    		Point::FromInts(centreX - armSize, centreY + 1),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-
-	} else if (markType == SC_MARK_MINUS) {
-		Point pts[] = {
-    		Point::FromInts(centreX - armSize, centreY - 1),
-    		Point::FromInts(centreX + armSize, centreY -1),
-    		Point::FromInts(centreX + armSize, centreY +1),
-    		Point::FromInts(centreX - armSize, centreY + 1),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-
-	} else if (markType == SC_MARK_SMALLRECT) {
-		PRectangle rcSmall;
-		rcSmall.left = rc.left + 1;
-		rcSmall.top = rc.top + 2;
-		rcSmall.right = rc.right - 1;
-		rcSmall.bottom = rc.bottom - 2;
-		surface->RectangleDraw(rcSmall, fore, back);
-
-	} else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND ||
-		markType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE) {
-		// An invisible marker so don't draw anything
-
-	} else if (markType == SC_MARK_VLINE) {
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, ircWhole.bottom);
 
-	} else if (markType == SC_MARK_LCORNER) {
-		surface->PenColour(colourTail);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY);
-		surface->LineTo(ircWhole.right - 1, centreY);
+	switch (markType)
+	{
+	case SC_MARK_ROUNDRECT:
+	{
+			PRectangle rcRounded = rc;
+			rcRounded.left = rc.left + 1;
+			rcRounded.right = rc.right - 1;
+			surface->RoundedRectangle(rcRounded, fore, back);
+	}
+	break;
+	case SC_MARK_CIRCLE: 
+	{
+			const PRectangle rcCircle = PRectangle::FromInts(
+				centreX - dimOn2,
+				centreY - dimOn2,
+				centreX + dimOn2,
+				centreY + dimOn2);
+			surface->Ellipse(rcCircle, fore, back);
+	}
+	break;
+	case SC_MARK_ARROW:
+	 {
+			Point pts[] = {
+				Point::FromInts(centreX - dimOn4, centreY - dimOn2),
+				Point::FromInts(centreX - dimOn4, centreY + dimOn2),
+				Point::FromInts(centreX + dimOn2 - dimOn4, centreY),
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
 
-	} else if (markType == SC_MARK_TCORNER) {
-		surface->PenColour(colourTail);
-		surface->MoveTo(centreX, centreY);
-		surface->LineTo(ircWhole.right - 1, centreY);
+		}
+	 break;
+		case SC_MARK_ARROWDOWN:
+		{
+			Point pts[] = {
+				Point::FromInts(centreX - dimOn2, centreY - dimOn4),
+				Point::FromInts(centreX + dimOn2, centreY - dimOn4),
+				Point::FromInts(centreX, centreY + dimOn2 - dimOn4),
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
 
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY + 1);
+		}
+		break;
+		case SC_MARK_PLUS:
+		{
+			Point pts[] = {
+				Point::FromInts(centreX - armSize, centreY - 1),
+				Point::FromInts(centreX - 1, centreY - 1),
+				Point::FromInts(centreX - 1, centreY - armSize),
+				Point::FromInts(centreX + 1, centreY - armSize),
+				Point::FromInts(centreX + 1, centreY - 1),
+				Point::FromInts(centreX + armSize, centreY - 1),
+				Point::FromInts(centreX + armSize, centreY + 1),
+				Point::FromInts(centreX + 1, centreY + 1),
+				Point::FromInts(centreX + 1, centreY + armSize),
+				Point::FromInts(centreX - 1, centreY + armSize),
+				Point::FromInts(centreX - 1, centreY + 1),
+				Point::FromInts(centreX - armSize, centreY + 1),
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
 
-		surface->PenColour(colourHead);
-		surface->LineTo(centreX, ircWhole.bottom);
+		}
+		break;
+		case SC_MARK_MINUS:
+		{
+			Point pts[] = {
+				Point::FromInts(centreX - armSize, centreY - 1),
+				Point::FromInts(centreX + armSize, centreY - 1),
+				Point::FromInts(centreX + armSize, centreY + 1),
+				Point::FromInts(centreX - armSize, centreY + 1),
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
 
-	} else if (markType == SC_MARK_LCORNERCURVE) {
-		surface->PenColour(colourTail);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY-3);
-		surface->LineTo(centreX+3, centreY);
-		surface->LineTo(ircWhole.right - 1, centreY);
+		}
+		break;
+		case SC_MARK_SMALLRECT:
+		{
+			PRectangle rcSmall;
+			rcSmall.left = rc.left + 1;
+			rcSmall.top = rc.top + 2;
+			rcSmall.right = rc.right - 1;
+			rcSmall.bottom = rc.bottom - 2;
+			surface->RectangleDraw(rcSmall, fore, back);
 
-	} else if (markType == SC_MARK_TCORNERCURVE) {
-		surface->PenColour(colourTail);
-		surface->MoveTo(centreX, centreY-3);
-		surface->LineTo(centreX+3, centreY);
-		surface->LineTo(ircWhole.right - 1, centreY);
+		}
+		break;
 
+		case SC_MARK_EMPTY:
+		case SC_MARK_BACKGROUND:
+		case SC_MARK_UNDERLINE:
+		case SC_MARK_AVAILABLE:
+			break;
+		case SC_MARK_VLINE:
+		{
 		surface->PenColour(colourBody);
 		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY-2);
-
-		surface->PenColour(colourHead);
 		surface->LineTo(centreX, ircWhole.bottom);
+		}
+			break;
+		case SC_MARK_LCORNER: 
+		{
+			surface->PenColour(colourTail);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY);
+			surface->LineTo(ircWhole.right - 1, centreY);
 
-	} else if (markType == SC_MARK_BOXPLUS) {
-		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawPlus(surface, centreX, centreY, blobSize, colourTail);
-
-	} else if (markType == SC_MARK_BOXPLUSCONNECTED) {
-		if (tFold == LineMarker::headWithTail)
+		}
+		break;
+		case SC_MARK_TCORNER: 
+		{
 			surface->PenColour(colourTail);
-		else
+			surface->MoveTo(centreX, centreY);
+			surface->LineTo(ircWhole.right - 1, centreY);
+
 			surface->PenColour(colourBody);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY + 1);
 
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY - blobSize);
+			surface->PenColour(colourHead);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawPlus(surface, centreX, centreY, blobSize, colourTail);
+		}
+		break;
+		case SC_MARK_LCORNERCURVE: 
+		{
+			surface->PenColour(colourTail);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - 3);
+			surface->LineTo(centreX + 3, centreY);
+			surface->LineTo(ircWhole.right - 1, centreY);
 
-		if (tFold == LineMarker::body) {
+		}
+		break;
+		case SC_MARK_TCORNERCURVE: 
+		{
 			surface->PenColour(colourTail);
-			surface->MoveTo(centreX + 1, centreY + blobSize);
-			surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
+			surface->MoveTo(centreX, centreY - 3);
+			surface->LineTo(centreX + 3, centreY);
+			surface->LineTo(ircWhole.right - 1, centreY);
+
+			surface->PenColour(colourBody);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - 2);
 
-			surface->MoveTo(centreX + blobSize, centreY + blobSize);
-			surface->LineTo(centreX + blobSize, centreY - blobSize);
+			surface->PenColour(colourHead);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-			surface->MoveTo(centreX + 1, centreY - blobSize);
-			surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
 		}
-	} else if (markType == SC_MARK_BOXMINUS) {
-		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+		break;
+		case SC_MARK_BOXPLUS: 
+		{
+			DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawPlus(surface, centreX, centreY, blobSize, colourTail);
 
-		surface->PenColour(colourHead);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+		}
+		break;
+		case SC_MARK_BOXPLUSCONNECTED: 
+		{
+			if (tFold == LineMarker::headWithTail)
+				surface->PenColour(colourTail);
+			else
+				surface->PenColour(colourBody);
+			surface->MoveTo(centreX, centreY + blobSize);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-	} else if (markType == SC_MARK_BOXMINUSCONNECTED) {
-		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+			surface->PenColour(colourBody);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - blobSize);
 
-		surface->PenColour(colourHead);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+			DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawPlus(surface, centreX, centreY, blobSize, colourTail);
 
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY - blobSize);
+			if (tFold == LineMarker::body) {
+				surface->PenColour(colourTail);
+				surface->MoveTo(centreX + 1, centreY + blobSize);
+				surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
 
-		if (tFold == LineMarker::body) {
-			surface->PenColour(colourTail);
-			surface->MoveTo(centreX + 1, centreY + blobSize);
-			surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
+				surface->MoveTo(centreX + blobSize, centreY + blobSize);
+				surface->LineTo(centreX + blobSize, centreY - blobSize);
+
+				surface->MoveTo(centreX + 1, centreY - blobSize);
+				surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
+			}
+		}
+		break;
+		case SC_MARK_BOXMINUS: 
+		{
+			DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawMinus(surface, centreX, centreY, blobSize, colourTail);
 
-			surface->MoveTo(centreX + blobSize, centreY + blobSize);
-			surface->LineTo(centreX + blobSize, centreY - blobSize);
+			surface->PenColour(colourHead);
+			surface->MoveTo(centreX, centreY + blobSize + 1);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-			surface->MoveTo(centreX + 1, centreY - blobSize);
-			surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
 		}
-	} else if (markType == SC_MARK_CIRCLEPLUS) {
-		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawPlus(surface, centreX, centreY, blobSize, colourTail);
+		break;
+		case SC_MARK_BOXMINUSCONNECTED: 
+		{
+			DrawBox(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+
+			surface->PenColour(colourHead);
+			surface->MoveTo(centreX, centreY + blobSize + 1);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-	} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) {
-		if (tFold == LineMarker::headWithTail)
-			surface->PenColour(colourTail);
-		else
 			surface->PenColour(colourBody);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - blobSize);
 
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY - blobSize);
+			if (tFold == LineMarker::body) {
+				surface->PenColour(colourTail);
+				surface->MoveTo(centreX + 1, centreY + blobSize);
+				surface->LineTo(centreX + blobSize + 1, centreY + blobSize);
 
-		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawPlus(surface, centreX, centreY, blobSize, colourTail);
+				surface->MoveTo(centreX + blobSize, centreY + blobSize);
+				surface->LineTo(centreX + blobSize, centreY - blobSize);
 
-	} else if (markType == SC_MARK_CIRCLEMINUS) {
-		surface->PenColour(colourHead);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+				surface->MoveTo(centreX + 1, centreY - blobSize);
+				surface->LineTo(centreX + blobSize + 1, centreY - blobSize);
+			}
+		}
+		break;
+		case SC_MARK_CIRCLEPLUS: 
+		{
+			DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawPlus(surface, centreX, centreY, blobSize, colourTail);
 
-		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+		}
+		break;
+		case SC_MARK_CIRCLEPLUSCONNECTED: 
+		{
+			if (tFold == LineMarker::headWithTail)
+				surface->PenColour(colourTail);
+			else
+				surface->PenColour(colourBody);
+			surface->MoveTo(centreX, centreY + blobSize);
+			surface->LineTo(centreX, ircWhole.bottom);
 
-	} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {
-		surface->PenColour(colourHead);
-		surface->MoveTo(centreX, centreY + blobSize);
-		surface->LineTo(centreX, ircWhole.bottom);
+			surface->PenColour(colourBody);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - blobSize);
+
+			DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawPlus(surface, centreX, centreY, blobSize, colourTail);
 
-		surface->PenColour(colourBody);
-		surface->MoveTo(centreX, ircWhole.top);
-		surface->LineTo(centreX, centreY - blobSize);
-
-		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
-		DrawMinus(surface, centreX, centreY, blobSize, colourTail);
-
-	} else if (markType >= SC_MARK_CHARACTER) {
-		char character[1];
-		character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);
-		const XYPOSITION width = surface->WidthText(fontForCharacter, character, 1);
-		PRectangle rcText = rc;
-		rcText.left += (rc.Width() - width) / 2;
-		rcText.right = rc.left + width;
-		surface->DrawTextClipped(rcText, fontForCharacter, rcText.bottom - 2,
-			character, 1, fore, back);
-
-	} else if (markType == SC_MARK_DOTDOTDOT) {
-		XYPOSITION right = static_cast<XYPOSITION>(centreX - 6);
-		for (int b=0; b<3; b++) {
-			const PRectangle rcBlob(right, rc.bottom - 4, right + 2, rc.bottom-2);
-			surface->FillRectangle(rcBlob, fore);
-			right += 5.0f;
 		}
-	} else if (markType == SC_MARK_ARROWS) {
-		surface->PenColour(fore);
-		int right = centreX - 2;
-		const int armLength = dimOn2 - 1;
-		for (int b = 0; b<3; b++) {
-			surface->MoveTo(right, centreY);
-			surface->LineTo(right - armLength, centreY - armLength);
-			surface->MoveTo(right, centreY);
-			surface->LineTo(right - armLength, centreY + armLength);
-			right += 4;
+		break;
+		case SC_MARK_CIRCLEMINUS: 
+		{
+			surface->PenColour(colourHead);
+			surface->MoveTo(centreX, centreY + blobSize);
+			surface->LineTo(centreX, ircWhole.bottom);
+
+			DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+
 		}
-	} else if (markType == SC_MARK_SHORTARROW) {
-		Point pts[] = {
-			Point::FromInts(centreX, centreY + dimOn2),
-			Point::FromInts(centreX + dimOn2, centreY),
-			Point::FromInts(centreX, centreY - dimOn2),
-			Point::FromInts(centreX, centreY - dimOn4),
-			Point::FromInts(centreX - dimOn4, centreY - dimOn4),
-			Point::FromInts(centreX - dimOn4, centreY + dimOn4),
+		break;
+		case SC_MARK_CIRCLEMINUSCONNECTED: 
+		{
+			surface->PenColour(colourHead);
+			surface->MoveTo(centreX, centreY + blobSize);
+			surface->LineTo(centreX, ircWhole.bottom);
+
+			surface->PenColour(colourBody);
+			surface->MoveTo(centreX, ircWhole.top);
+			surface->LineTo(centreX, centreY - blobSize);
+
+			DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);
+			DrawMinus(surface, centreX, centreY, blobSize, colourTail);
+
+		}
+		break;
+
+		case SC_MARK_DOTDOTDOT: 
+		{
+			XYPOSITION right = static_cast<XYPOSITION>(centreX - 6);
+			for (int b = 0; b < 3; b++) {
+				const PRectangle rcBlob(right, rc.bottom - 4, right + 2, rc.bottom - 2);
+				surface->FillRectangle(rcBlob, fore);
+				right += 5.0f;
+			}
+		}
+		break;
+		case SC_MARK_ARROWS: 
+		{
+			surface->PenColour(fore);
+			int right = centreX - 2;
+			const int armLength = dimOn2 - 1;
+			for (int b = 0; b < 3; b++) {
+				surface->MoveTo(right, centreY);
+				surface->LineTo(right - armLength, centreY - armLength);
+				surface->MoveTo(right, centreY);
+				surface->LineTo(right - armLength, centreY + armLength);
+				right += 4;
+			}
+		}
+		break;
+		case SC_MARK_SHORTARROW: 
+		{
+			Point pts[] = {
+				Point::FromInts(centreX, centreY + dimOn2),
+				Point::FromInts(centreX + dimOn2, centreY),
+				Point::FromInts(centreX, centreY - dimOn2),
+				Point::FromInts(centreX, centreY - dimOn4),
+				Point::FromInts(centreX - dimOn4, centreY - dimOn4),
+				Point::FromInts(centreX - dimOn4, centreY + dimOn4),
 			Point::FromInts(centreX, centreY + dimOn4),
 			Point::FromInts(centreX, centreY + dimOn2),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-	} else if (markType == SC_MARK_LEFTRECT) {
-		PRectangle rcLeft = rcWhole;
-		rcLeft.right = rcLeft.left + 4;
-		surface->FillRectangle(rcLeft, back);
-	} else if (markType == SC_MARK_BOOKMARK) {
-		const int halfHeight = minDim / 3;
-		Point pts[] = {
-			Point::FromInts(ircWhole.left, centreY-halfHeight),
-			Point::FromInts(ircWhole.right - 3, centreY - halfHeight),
-			Point::FromInts(ircWhole.right - 3 - halfHeight, centreY),
-			Point::FromInts(ircWhole.right - 3, centreY + halfHeight),
-			Point::FromInts(ircWhole.left, centreY + halfHeight),
-		};
-		surface->Polygon(pts, ELEMENTS(pts), fore, back);
-	} else { // SC_MARK_FULLRECT
-		surface->FillRectangle(rcWhole, back);
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
+		}
+		break;
+		case SC_MARK_LEFTRECT: 
+		{
+			PRectangle rcLeft = rcWhole;
+			rcLeft.right = rcLeft.left + 4;
+			surface->FillRectangle(rcLeft, back);
+		}
+		break;
+		case SC_MARK_BOOKMARK: 
+		{
+			const int halfHeight = minDim / 3;
+			Point pts[] = {
+				Point::FromInts(ircWhole.left, centreY - halfHeight),
+				Point::FromInts(ircWhole.right - 3, centreY - halfHeight),
+				Point::FromInts(ircWhole.right - 3 - halfHeight, centreY),
+				Point::FromInts(ircWhole.right - 3, centreY + halfHeight),
+				Point::FromInts(ircWhole.left, centreY + halfHeight),
+			};
+			surface->Polygon(pts, ELEMENTS(pts), fore, back);
+		}
+		break;
+	default:
+		{
+			if (markType >= SC_MARK_CHARACTER) {
+
+			char character[1];
+			character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);
+			const XYPOSITION width = surface->WidthText(fontForCharacter, character, 1);
+			PRectangle rcText = rc;
+			rcText.left += (rc.Width() - width) / 2;
+			rcText.right = rc.left + width;
+			surface->DrawTextClipped(rcText, fontForCharacter, rcText.bottom - 2,
+				character, 1, fore, back);
+
+			}
+			else { // SC_MARK_FULLRECT
+				surface->FillRectangle(rcWhole, back);
+			}
+		}
 	}
 }

+ 8 - 5
src/qscint/scintilla/src/MarginView.cpp

@@ -364,9 +364,11 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
 
 				marks &= vs.ms[margin].mask;
 
-				PRectangle rcMarker = rcSelMargin;
-				rcMarker.top = static_cast<XYPOSITION>(yposScreen);
-				rcMarker.bottom = static_cast<XYPOSITION>(yposScreen + vs.lineHeight);
+				PRectangle rcMarker(
+					rcSelMargin.left,
+					static_cast<XYPOSITION>(yposScreen),
+					rcSelMargin.right,
+					static_cast<XYPOSITION>(yposScreen + vs.lineHeight));
 				if (vs.ms[margin].style == SC_MARGIN_NUMBER) {
 					if (firstSubLine) {
 						std::string sNumber;
@@ -412,11 +414,12 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
 						if (firstSubLine) {
 							surface->FillRectangle(rcMarker,
 								vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
+							PRectangle rcText = rcMarker;
 							if (vs.ms[margin].style == SC_MARGIN_RTEXT) {
 								const int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
-								rcMarker.left = rcMarker.right - width - 3;
+								rcText.left = rcText.right - width - 3;
 							}
-							DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker,
+							DrawStyledText(surface, vs, vs.marginStyleOffset, rcText,
 								stMargin, 0, stMargin.length, drawAll);
 						} else {
 							// if we're displaying annotation lines, color the margin to match the associated document line

+ 8 - 3
src/qscint/scintilla/src/UniConversion.cpp

@@ -1,4 +1,4 @@
-// Scintilla source code edit control
+// Scintilla source code edit control
 /** @file UniConversion.cxx
  ** Functions to handle UTF-8 and UTF-16 strings.
  **/
@@ -166,7 +166,7 @@ size_t UTF32FromUTF8(const char *s, size_t len, unsigned int *tbuf, size_t tlen)
 	size_t ui = 0;
 	for (size_t i = 0; i < len;) {
 		unsigned char ch = s[i];
-		const unsigned int byteCount = UTF8BytesOfLead[ch];
+		unsigned int byteCount = UTF8BytesOfLead[ch];
 		unsigned int value;
 
 		if (i + byteCount > len) {
@@ -179,7 +179,12 @@ size_t UTF32FromUTF8(const char *s, size_t len, unsigned int *tbuf, size_t tlen)
 		}
 
 		if (ui == tlen) {
-			throw std::runtime_error("UTF32FromUTF8: attempted write beyond end");
+			//在macos下面,中文输入shift+_,会导致触发这里的崩溃。发现macos下面输入shift+_,引入的两个字符——,会同时输入。
+			//即这里——长度是6个字符。但是外面来的tlen=1,导致二者没有匹配。但是崩溃总不是一个好的选择。
+			//我们直接强行赋值byteCount=3,然后输出拉倒。20230506
+			//throw std::runtime_error("UTF32FromUTF8: attempted write beyond end");
+			ui = tlen - 1;
+			byteCount = 3;
 		}
 
 		i++;

+ 5 - 2
src/qscint/scintilla/src/UniConversion.h

@@ -1,4 +1,4 @@
-// Scintilla source code edit control
+// Scintilla source code edit control
 /** @file UniConversion.h
  ** Functions to handle UTF-8 and UTF-16 strings.
  **/
@@ -8,6 +8,8 @@
 #ifndef UNICONVERSION_H
 #define UNICONVERSION_H
 
+#include "Qsci/qsciglobal.h"
+
 namespace Scintilla {
 
 const int UTF8MaxBytes = 4;
@@ -48,7 +50,8 @@ inline constexpr bool UTF8IsAscii(int ch) noexcept {
 }
 
 enum { UTF8MaskWidth=0x7, UTF8MaskInvalid=0x8 };
-int UTF8Classify(const unsigned char *us, size_t len) noexcept;
+
+QSCINTILLA_EXPORT int UTF8Classify(const unsigned char *us, size_t len) noexcept;
 
 // Similar to UTF8Classify but returns a length of 1 for invalid bytes
 // instead of setting the invalid flag

+ 23 - 20
src/qscint/src/InputMethod.cpp

@@ -1,4 +1,4 @@
-// Copyright (c) 2021 Riverbank Computing Limited
+// Copyright (c) 2023 Riverbank Computing Limited
 // Copyright (c) 2011 Archaeopteryx Software, Inc.
 // Copyright (c) 1990-2011, Scientific Toolworks, Inc.
 //
@@ -137,44 +137,45 @@ void QsciScintillaBase::inputMethodEvent(QInputMethodEvent *event)
         return;
     }
 
+    bool initialCompose = false;
     if (sci->pdoc->TentativeActive()) {
         sci->pdoc->TentativeUndo();
     } else {
         // No tentative undo means start of this composition so
         // Fill in any virtual spaces.
-        sci->ClearBeforeTentativeStart();
+        initialCompose = true;
     }
 
     sci->view.imeCaretBlockOverride = false;
 
     if (!event->commitString().isEmpty()) {
         const QString commitStr = event->commitString();
-        const unsigned int commitStrLen = commitStr.length();
+        const int commitStrLen = commitStr.length();
 
-        for (unsigned int i = 0; i < commitStrLen;) {
-            const unsigned int ucWidth = commitStr.at(i).isHighSurrogate() ? 2 : 1;
+        for (int i = 0; i < commitStrLen;) {
+            const int ucWidth = commitStr.at(i).isHighSurrogate() ? 2 : 1;
             const QString oneCharUTF16 = commitStr.mid(i, ucWidth);
             const QByteArray oneChar = textAsBytes(oneCharUTF16);
             const int oneCharLen = oneChar.length();
 
-            sci->AddCharUTF(oneChar.data(), oneCharLen);
+            sci->AddCharUTF(oneChar.data(), oneChar.length());
             i += ucWidth;
         }
 
     } else if (!event->preeditString().isEmpty()) {
         const QString preeditStr = event->preeditString();
-        const unsigned int preeditStrLen = preeditStr.length();
-        if ((preeditStrLen == 0) || (preeditStrLen > MAXLENINPUTIME)) {
+        const int preeditStrLen = preeditStr.length();
+        if (preeditStrLen == 0) {
             sci->ShowCaretAtCurrentPosition();
             return;
         }
 
+        if (initialCompose)
+            sci->ClearBeforeTentativeStart();
         sci->pdoc->TentativeStart(); // TentativeActive() from now on.
 
         std::vector<int> imeIndicator = MapImeIndicators(event);
 
-        const bool recording = sci->recordingMacro;
-        sci->recordingMacro = false;
         for (unsigned int i = 0; i < preeditStrLen;) {
             const unsigned int ucWidth = preeditStr.at(i).isHighSurrogate() ? 2 : 1;
             const QString oneCharUTF16 = preeditStr.mid(i, ucWidth);
@@ -186,7 +187,6 @@ void QsciScintillaBase::inputMethodEvent(QInputMethodEvent *event)
             DrawImeIndicator(sci, imeIndicator[i], oneCharLen);
             i += ucWidth;
         }
-        sci->recordingMacro = recording;
 
         // Move IME carets.
         int imeCaretPos = GetImeCaretPos(event);
@@ -252,27 +252,30 @@ QVariant QsciScintillaBase::inputMethodQuery(Qt::InputMethodQuery query) const
         {
             int paraStart = sci->pdoc->ParaUp(pos);
             int paraEnd = sci->pdoc->ParaDown(pos);
-            QVarLengthArray<char,1024> buffer(paraEnd - paraStart + 1);
 
-            Sci_CharacterRange charRange;
-            charRange.cpMin = paraStart;
-            charRange.cpMax = paraEnd;
+            if (paraEnd - paraStart <= 0)
+            {
+                return "";
+            }
+            QByteArray buffer(paraEnd - paraStart + 1,0);
+            //QVarLengthArray<char,1024> buffer(paraEnd - paraStart + 1);
 
             Sci_TextRange textRange;
-            textRange.chrg = charRange;
+            textRange.chrg.cpMin = paraStart;
+            textRange.chrg.cpMax = paraEnd;
             textRange.lpstrText = buffer.data();
 
-            SendScintilla(SCI_GETTEXTRANGE, 0, (sptr_t)&textRange);
+            SendScintilla(SCI_GETTEXTRANGE, 0, &textRange);
 
-            return bytesAsText(buffer.constData());
+            return bytesAsText(buffer.constData(), buffer.size());
         }
 
         case Qt::ImCurrentSelection:
         {
-            QVarLengthArray<char,1024> buffer(SendScintilla(SCI_GETSELTEXT));
+            QVarLengthArray<char,1024> buffer(SendScintilla(SCI_GETSELTEXT) + 1);
             SendScintilla(SCI_GETSELTEXT, 0, (sptr_t)buffer.data());
 
-            return bytesAsText(buffer.constData());
+            return bytesAsText(buffer.constData(), buffer.size() - 1);
         }
 
         default:

+ 2 - 2
src/qscint/src/ListBoxQt.cpp

@@ -1,7 +1,7 @@
-// This module implements the specialisation of QListBox that handles the
+// This module implements the specialisation of QListBox that handles the
 // Scintilla double-click callback.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/ListBoxQt.h

@@ -1,7 +1,7 @@
-// This defines the specialisation of QListBox that handles the Scintilla
+// This defines the specialisation of QListBox that handles the Scintilla
 // double-click callback.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/MacPasteboardMime.cpp

@@ -1,8 +1,8 @@
-// This module implements part of the support for rectangular selections on
+// This module implements part of the support for rectangular selections on
 // macOS.  It is a separate file to avoid clashes between macOS and Scintilla
 // data types.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/PlatQt.cpp

@@ -1,6 +1,6 @@
-// This module implements the portability layer for the Qt port of Scintilla.
+// This module implements the portability layer for the Qt port of Scintilla.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/Qsci/qsciabstractapis.h

@@ -1,6 +1,6 @@
-// This module defines interface to the QsciAbstractAPIs class.
+// This module defines interface to the QsciAbstractAPIs class.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/Qsci/qsciapis.h

@@ -1,6 +1,6 @@
-// This module defines interface to the QsciAPIs class.
+// This module defines interface to the QsciAPIs class.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 2 - 2
src/qscint/src/Qsci/qscicommand.h

@@ -1,6 +1,6 @@
-// This defines the interface to the QsciCommand class.
+// This defines the interface to the QsciCommand class.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 14 - 2
src/qscint/src/Qsci/qscicommandset.h

@@ -1,6 +1,6 @@
-// This defines the interface to the QsciCommandSet class.
+// This defines the interface to the QsciCommandSet class.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 
@@ -35,6 +35,11 @@ QT_END_NAMESPACE
 
 class QsciScintilla;
 
+#ifdef Q_OS_WIN
+//windows系统下面,不允许随意修改默认快捷键。因为加载快捷键会降低启动速度。
+#else
+#define USER_SHUT_CUT_DEF
+#endif
 
 //! \brief The QsciCommandSet class represents the set of all internal editor
 //! commands that may have keys bound.
@@ -84,6 +89,13 @@ private:
 
     QsciCommandSet(const QsciCommandSet &);
     QsciCommandSet &operator=(const QsciCommandSet &);
+
+public:
+#ifdef USER_SHUT_CUT_DEF
+    void readUserShutKey();
+
+    void saveUserDefQsciShutkey();
+#endif
 };
 
 #endif

+ 2 - 2
src/qscint/src/Qsci/qscidocument.h

@@ -1,6 +1,6 @@
-// This defines the interface to the QsciDocument class.
+// This defines the interface to the QsciDocument class.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

+ 1 - 1
src/qscint/src/Qsci/qsciglobal.h

@@ -1,6 +1,6 @@
 // This module defines various things common to all of the Scintilla Qt port.
 //
-// Copyright (c) 2021 Riverbank Computing Limited <[email protected]>
+// Copyright (c) 2023 Riverbank Computing Limited <[email protected]>
 // 
 // This file is part of QScintilla.
 // 

Some files were not shown because too many files changed in this diff