diff --git a/src/include/pluginGl.h b/src/include/pluginGl.h index 065f86c..40aae53 100755 --- a/src/include/pluginGl.h +++ b/src/include/pluginGl.h @@ -56,9 +56,14 @@ typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserDat extern "C" { #endif +// v1.x 版本的插件接口 NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData); NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, NDD_PROC_DATA* pProcData); +// v2.0 版本后的插件接口 + // NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData); + // NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, std::function pluginCallBack, NDD_PROC_DATA* procData); + #ifdef __cplusplus } #endif diff --git a/src/plugin/CMakeLists.txt b/src/plugin/CMakeLists.txt index c9b8d26..62783b8 100644 --- a/src/plugin/CMakeLists.txt +++ b/src/plugin/CMakeLists.txt @@ -19,20 +19,30 @@ if(USE_NOTEPAD_PLUGIN) add_subdirectory(template-plugins/base-secondary-menu-ui-plugin-v1) endif(USE_NOTEPAD_PLUGIN_BASE) - # 一个简单的插件示例,但依赖于外部的 opencc 项目(基于 git) - add_subdirectory(opencc-demo-plugin) - # 一个简单的版本更新检查的插件 - add_subdirectory(versionUpdate) - # 一个简单的可二次扩展的插件 - add_subdirectory(external-plugin) + # 构建一个简单的基于 framwork 的 framework-helloworld 插件 - # Linux 可构建的插件 - if(UNIX AND NOT APPLE) - # 一个简单的 Linux 终端插件,但依赖于外部的 lxqt-qterminal - add_subdirectory(linux-terminal-plugin) - endif(UNIX AND NOT APPLE) + include(framework/framework.cmake) + # add_framework_plugin [...] [...] + # 构建一个基于 framework 的插件 + # 基于提供的包含源代码文件的的路径,或指定的要构建的源代码 + add_framework_plugin(framework-helloworld + framework-plugins/helloworld + ) + + # 一个简单的插件示例,但依赖于外部的 opencc 项目(基于 git) + # add_subdirectory(opencc-demo-plugin) + # # 一个简单的版本更新检查的插件 + # add_subdirectory(versionUpdate) + # # 一个简单的可二次扩展的插件 + # add_subdirectory(external-plugin) + + # # Linux 可构建的插件 + # if(UNIX AND NOT APPLE) + # # 一个简单的 Linux 终端插件,但依赖于外部的 lxqt-qterminal + # add_subdirectory(linux-terminal-plugin) + # endif(UNIX AND NOT APPLE) - # TTS 语音合成 - add_subdirectory(TTS-plugin) + # # TTS 语音合成 + # add_subdirectory(TTS-plugin) endif(USE_NOTEPAD_PLUGIN) diff --git a/src/plugin/framework-plugins/README.md b/src/plugin/framework-plugins/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/framework-plugins/helloworld/helloworld.cpp b/src/plugin/framework-plugins/helloworld/helloworld.cpp new file mode 100644 index 0000000..634a4c4 --- /dev/null +++ b/src/plugin/framework-plugins/helloworld/helloworld.cpp @@ -0,0 +1,76 @@ +#include "helloworld.h" +#include "qdebug.h" + +#include +#include + +HelloWorld::HelloWorld(QObject *parent) + : QObject{parent} +{ + +} + +HelloWorld::~HelloWorld() +{ + +} + +HelloWorld &HelloWorld::instance() +{ + static HelloWorld helloworld; + return helloworld; +} + +QString HelloWorld::PluginName() +{ + return "Framework HelloWorld"; +} + +QString HelloWorld::PluginVersion() +{ + return "v0.1"; +} + +QString HelloWorld::PluginAuthor() +{ + return "zinface"; +} + +QString HelloWorld::PluginComment() +{ + return "这一个基于IPluginFramework 实现的插件"; +} + +IPluginFramework::MenuType HelloWorld::PluginMenuType() +{ + return None; +// return SecondaryMenu; +} + +void HelloWorld::registerNotepad(QWidget *notepad) +{ + s_notepad = notepad; +} + +void HelloWorld::registerCurrentEditCallback(std::function get_cur_edit_callback) +{ + s_get_cur_edit_callback = get_cur_edit_callback; +} + +void HelloWorld::PluginTrigger() +{ + qDebug() << "Triggered"; + QMessageBox::information(nullptr, "提示信息", "您已 trigger 触发此插件"); + + int length = s_get_cur_edit_callback(s_notepad)->text().count(); + + QMessageBox::information(nullptr, "提示信息", QString("您当前编辑器有 %1 个字符").arg(length)); +} + +void HelloWorld::registerPluginActions(QMenu *rootMenu) +{ + QMessageBox::information(nullptr, "提示信息", "您的 MenuType 类型为 1 需要注册 QAction 集合"); + rootMenu->addAction("第一个 QAction", [](){ + QMessageBox::information(nullptr, "提示信息", "您已 trigger 触发插件的第一个 QAction"); + }); +} diff --git a/src/plugin/framework-plugins/helloworld/helloworld.h b/src/plugin/framework-plugins/helloworld/helloworld.h new file mode 100644 index 0000000..12bb9e8 --- /dev/null +++ b/src/plugin/framework-plugins/helloworld/helloworld.h @@ -0,0 +1,49 @@ +#ifndef HELLOWORLD_H +#define HELLOWORLD_H + +#include +#include "framework/IPluginFramework.h" + +class HelloWorld : public QObject, IPluginFramework +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID IPluginFramework_IID) + Q_INTERFACES(IPluginFramework) +public: + explicit HelloWorld(QObject *parent = nullptr); + ~HelloWorld(); + + static HelloWorld &instance(); + + // IPluginFramework interface +public: + QString PluginName(); + QString PluginVersion(); + QString PluginAuthor(); + QString PluginComment(); + MenuType PluginMenuType(); + + // IPluginFramework interface +public: + void registerNotepad(QWidget *notepad); + + // IPluginFramework interface +public: + void registerCurrentEditCallback(std::function get_cur_edit_callback); + + // IPluginFramework interface +public: + void PluginTrigger(); + + // IPluginFramework interface +public: +// void registerTrigger(QAction *action); + void registerPluginActions(QMenu *rootMenu); + +private: + QWidget *s_notepad; + std::function s_get_cur_edit_callback; + +}; + +#endif // HELLOWORLD_H diff --git a/src/plugin/framework-plugins/helloworld/helloworldplugin.cpp b/src/plugin/framework-plugins/helloworld/helloworldplugin.cpp new file mode 100644 index 0000000..afa04ee --- /dev/null +++ b/src/plugin/framework-plugins/helloworld/helloworldplugin.cpp @@ -0,0 +1,70 @@ + + +// #include "../include/pluginGl.h" + +#include "qdebug.h" +#include +#include +#include + +//#ifdef NOTEPAD_PLUGIN_MANAGER + + +#define NDD_EXPORTDLL + +#if defined(Q_OS_WIN) + #if defined(NDD_EXPORTDLL) + #define NDD_EXPORT __declspec(dllexport) + #else + #define NDD_EXPORT __declspec(dllimport) + #endif +#else + #define NDD_EXPORT __attribute__((visibility("default"))) +#endif + +#include "helloworld.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#define plugin HelloWorld::instance() + +NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) { + + qDebug() << (pProcData == NULL); + if(pProcData == NULL) + { + return false; + } + pProcData->m_strPlugName = plugin.PluginName(); + pProcData->m_strComment = plugin.PluginComment(); + pProcData->m_version = plugin.PluginVersion(); + pProcData->m_auther = plugin.PluginAuthor(); + pProcData->m_menuType = plugin.PluginMenuType(); + return true; +} + + +NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, std::function pluginCallBack, NDD_PROC_DATA* procData){ + + plugin.registerNotepad(pNotepad); + plugin.registerCurrentEditCallback(getCurEdit); + + if (plugin.PluginMenuType() == IPluginFramework::None) { + // plugin.registerTrigger(procData->m_pAction); // 已使用 lambda 完成 PluginTrigger + procData->m_pAction->connect(procData->m_pAction, &QAction::triggered, [](){ + plugin.PluginTrigger(); + }); + } else { + plugin.registerPluginActions(procData->m_rootMenu); + } + + qDebug() << strFileName; +} + +#ifdef __cplusplus + } +#endif + +//#endif //NOTEPAD_PLUGIN_MANAGER diff --git a/src/plugin/framework/IPluginFramework.h b/src/plugin/framework/IPluginFramework.h new file mode 100644 index 0000000..5d78eda --- /dev/null +++ b/src/plugin/framework/IPluginFramework.h @@ -0,0 +1,106 @@ +#ifndef __IPLUGINFRAMEWORK__H__ +#define __IPLUGINFRAMEWORK__H__ + +#include +#include +#include +#include +#include +#include + +#define IPluginFramework_IID "com.gitee.ndd.pluginframework" + +class IPluginFramework +{ +public: + // + enum MenuType { + None = 0, + SecondaryMenu = 1, + }; + + /** + * @brief 让编辑器做指定的事 + * @note 目前编辑器支持由插件发出两种指令 + */ + enum Do { + NewEdit, + ChangeSyntax, + }; + + /********************************************* 插件基本信息/ + /** + * @brief 插件名称 + * @return + */ + virtual QString PluginName() = 0; + /** + * @brief 插件版本 + * @return + */ + virtual QString PluginVersion() = 0; + /** + * @brief 插件作者 + * @return + */ + virtual QString PluginAuthor() = 0; + /** + * @brief 插件说明 + * @return + */ + virtual QString PluginComment() = 0; + /** + * @brief 插件菜单类型 + * @note 如仅提供插件,而不实现任何其它菜单功能则建议为 None,否则 + * @return + */ + virtual MenuType PluginMenuType() = 0; + + + /********************************************* 插件的主程序 Notepad 注册*/ + + virtual void registerNotepad(QWidget *notepad) = 0; + + /********************************************* 插件的一级(MenuType=None)或二级(MenuType=SecondaryMenu)菜单触发与注册接口/ + + /** + * @brief 由插件实现的一级菜单触发动作(默认提供的动作) + * @note 由于框架无法在 C 风格函数入口处完成事件注册,则由插件提供者自行在 registerTirgger 中连接信号到此处 + */ + virtual void PluginTrigger() = 0; + + + /** + * @brief 由插件实现的一级菜单注册动作(当 MenuType 为 None 时有效) + * @param action + * @note 由于框架在 C 风格函数入口处使用 lambda 完成事件注册连接到 PluginTrigger,则不需要插件实现此接口 + */ + // virtual void registerTrigger(QAction *action) = 0; + + + /** + * @brief 由插件实现的二级菜单触发动作集合(默认提供的动作) + * @param menu + * @note 由框架在 C 风格函数入口处代为转交,则由插件提供者自行实现来完成提供内部的 QAction 集合 + */ + virtual void registerPluginActions(QMenu *rootMenu) = 0; + + /********************************************* 插件当前编辑器函数回调注册*/ + + /** + * @brief 由框架提供的获取当前编辑器的回调函数注册 + * @param curEdit + * @note 由于框架无法在 C 风格函数入口处完成回调函数注册,则由插件提供者自行在 registerCurrentEditCallback 中连接信号到此处 + */ + virtual void registerCurrentEditCallback(std::function get_cur_edit_callback) = 0; + +//protected: + /** + * @brief s_getCurEdit 为回调函数,用于获取当前编辑器 + */ +// std::function s_getCurEdit; +}; + +Q_DECLARE_INTERFACE(IPluginFramework, IPluginFramework_IID) + +#endif //!__IPLUGINFRAMEWORK__H__ diff --git a/src/plugin/framework/QtPlugin.md b/src/plugin/framework/QtPlugin.md new file mode 100644 index 0000000..db34d93 --- /dev/null +++ b/src/plugin/framework/QtPlugin.md @@ -0,0 +1,76 @@ +# Qt 插件开发 + +> https://gitee.com/zinface/qt.plugin-dev + +- 定义一个插件的接口 + + ```cpp + // 定义一个插件所使用的 IID 名称,被实现的插件也可以使用此宏 + #define IPlugin_IID "com.test.plugin" + + class IPlugin + { + public: + // 定义一个插件时所用的名称 + virtual QString PluginName() = 0; // 插件声明函数必须 = 0 + }; + + Q_DECLARE_INTERFACE(IPlugin, IPlugin_IID) + ``` + +- 实现一个插件 + + ```cpp + #include "iplugin.h" + + class PluginDemo : public QObject, IPlugin + { + Q_OBJECT + Q_PLUGIN_METADATA(IID IPlugin_IID) + Q_INTERFACES(IPlugin) + public: + QString PluginName() override; + }; + ``` + + ```cpp + #include "plugindemo.h" + + QString PluginDemo::PluginName() + { + return QString("插件demo"); + } + ``` + + ``` + # 不过设定好像也没啥问题 + add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") + # 该库编译将产生一个 `libplugindemo.so`,在 cmake 中应当被指定为 SHARED 共享库目标 + ``` + +- 使用插件 + + ```cpp + IPlugin *plugin; + + // 使用 QPluginLoader,参数 argv[1] 表示为插件路径 + QPluginLoader pluginLoader(argv[1]); + // 使用插件加载器加载扩展并尝试创建实例 + QObject *instance = pluginLoader.instance(); + if (instance) { + // 如果实例创建成功,尝试转换对象 + plugin = qobject_cast(instance); + if (plugin) { + QTextStream(stdout) << QString("> 加载插件并调用函数:\n") + << "> plugin->PluginName(): " + << plugin->PluginName() << "\n"; + } + pluginLoader.unload(); + } + ``` + + ```shell + # 将会在 build 目录中,执行以下命令加载插件(因Qt插件机制必须为'绝对路径') + $ ./plugin-loader `realpath libplugindemo.so` + plugin->PluginName: 插件demo + ``` \ No newline at end of file diff --git a/src/plugin/framework/framework.cmake b/src/plugin/framework/framework.cmake new file mode 100644 index 0000000..e68584e --- /dev/null +++ b/src/plugin/framework/framework.cmake @@ -0,0 +1,63 @@ + + +# add_framework_plugin [...] [...] +# 构建一个基于 framework 的插件 + # 基于提供的包含源代码文件的的路径,或指定的要构建的源代码 +macro(add_framework_plugin _target) + + set(${_target}_ARGN ${ARGN}) + # set(${_target}_DIR_OR_SOURCES) + foreach(arg IN LISTS ${_target}_ARGN) + list(APPEND ${_target}_DIR_OR_SOURCES ${arg}) + endforeach(arg IN LISTS ${_target}_ARGN) + + + spark_add_library_path(${_target} SHARED + ${CMAKE_CURRENT_LIST_DIR}/framework + ${${_target}_DIR_OR_SOURCES} + ) + target_include_directories(${_target} PRIVATE + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/src/cceditor + + ${PROJECT_SOURCE_DIR}/src/qscint/src + ${PROJECT_SOURCE_DIR}/src/qscint/src/Qsci + ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/src + ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/include + ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/lexlib + ${PROJECT_SOURCE_DIR}/src/qscint/scintilla/boostregex + ) + # target_link_libraries(${_target} QSci) + target_link_QSci(${_target}) + if(USE_QT6) + # target_link_qt6_Core5Compat(${_target}) # 兼容性: Qt6 可使用 Core5Compat 少量更改 Qt5 部分 + # target_link_qt6_PrintSupport(${_target}) + # target_link_qt6_XmlPatterns(${_target}) # Bug 初期配置时无此依赖要求 + else() + # target_link_qt5_PrintSupport(${_target}) + # target_link_qt5_XmlPatterns(${_target}) + endif(USE_QT6) + + set_target_properties(${_target} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY $/plugin + LIBRARY_OUTPUT_DIRECTORY $/plugin + ARCHIVE_OUTPUT_DIRECTORY $/plugin) + + + if(WIN32 AND NOTEPAD_BUILD_BY_SHARED) + # 在 Windows 中构建时,需要关注此库的构建形式,QScintilla 应该以何种方式编译 + target_compile_definitions(${_target} + PRIVATE + QSCINTILLA_DLL # 目前在 Windows 中使用 QSci 库时应该采用 Q_DECL_IMPORT + # 控制 QSCINTILLA_EXPORT 符号应为 Q_DECL_IMPORT + ) + else() + # 在 Windows 中构建时,需要关注此库的构建形式,QScintilla 应该以何种方式编译 + target_compile_definitions(${_target} + PRIVATE + # QSCINTILLA_DLL # 目前在 Windows 中使用 QSci 库时应该采用 Q_DECL_IMPORT + # 控制 QSCINTILLA_EXPORT 符号应为 Q_DECL_IMPORT + ) + endif(WIN32 AND NOTEPAD_BUILD_BY_SHARED) +endmacro(add_framework_plugin _target) diff --git a/tree b/tree new file mode 100644 index 0000000..9a27473 --- /dev/null +++ b/tree @@ -0,0 +1,701 @@ +build/linux-uos/_CPack_Packages/Linux/DEB/Notepad---2.0.0-Linux/ +├── control +├── control.tar.gz +├── data.tar.gz +├── debian-binary +├── md5sums +├── opt +│   └── apps +│   └── com.hmja.notepad +│   ├── entries +│   │   ├── applications +│   │   │   └── io.gitee.cxasm.notepad--.desktop +│   │   ├── icons +│   │   │   └── hicolor +│   │   │   └── scalable +│   │   │   └── apps +│   │   │   └── ndd.svg +│   │   ├── licenses +│   │   │   └── notepad-- +│   │   │   └── LICENSE +│   │   └── metainfo +│   │   └── io.gitee.cxasm.notepad--.metainfo.xml +│   ├── files +│   │   ├── Notepad-- +│   │   └── themes +│   │   ├── Bespin +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Black board +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Blue light +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── avs.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── coffeescript.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── flash.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── go.ini +│   │   │   ├── html.ini +│   │   │   ├── idl.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── jsp.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── rust.ini +│   │   │   ├── spice.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── typescript.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── Choco +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── DansLeRuSH-Dark +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── coffeescript.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── Deep Black +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── HotFudgeSundae +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── coffeescript.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── lavender +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── avs.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── coffeescript.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── flash.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── go.ini +│   │   │   ├── html.ini +│   │   │   ├── idl.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── jsp.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── rust.ini +│   │   │   ├── spice.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── typescript.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── misty rose +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── avs.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── coffeescript.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── flash.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── go.ini +│   │   │   ├── html.ini +│   │   │   ├── idl.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── jsp.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── rust.ini +│   │   │   ├── spice.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── typescript.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── Mono Industrial +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Monokai +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Obsidian +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   ├── xml.ini +│   │   │   └── yaml.ini +│   │   ├── Plastic Code Wrap +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Ruby Blue +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Twilight +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   ├── Vibrant Ink +│   │   │   ├── AllGlobal.ini +│   │   │   ├── asp.ini +│   │   │   ├── bash.ini +│   │   │   ├── batch.ini +│   │   │   ├── c.ini +│   │   │   ├── cmake.ini +│   │   │   ├── cpp.ini +│   │   │   ├── csharp.ini +│   │   │   ├── css.ini +│   │   │   ├── diff.ini +│   │   │   ├── fortran77.ini +│   │   │   ├── fortran.ini +│   │   │   ├── html.ini +│   │   │   ├── ini.ini +│   │   │   ├── java.ini +│   │   │   ├── javascript.ini +│   │   │   ├── json.ini +│   │   │   ├── lua.ini +│   │   │   ├── makefile.ini +│   │   │   ├── matlab.ini +│   │   │   ├── nsis.ini +│   │   │   ├── objc.ini +│   │   │   ├── pascal.ini +│   │   │   ├── perl.ini +│   │   │   ├── php.ini +│   │   │   ├── props.ini +│   │   │   ├── python.ini +│   │   │   ├── rc.ini +│   │   │   ├── ruby.ini +│   │   │   ├── sql.ini +│   │   │   ├── tcl.ini +│   │   │   ├── txt.ini +│   │   │   ├── vb.ini +│   │   │   ├── verilog.ini +│   │   │   ├── vhdl.ini +│   │   │   └── xml.ini +│   │   └── yellow rice +│   │   ├── AllGlobal.ini +│   │   ├── asp.ini +│   │   ├── avs.ini +│   │   ├── bash.ini +│   │   ├── batch.ini +│   │   ├── c.ini +│   │   ├── cmake.ini +│   │   ├── coffeescript.ini +│   │   ├── cpp.ini +│   │   ├── csharp.ini +│   │   ├── css.ini +│   │   ├── diff.ini +│   │   ├── flash.ini +│   │   ├── fortran77.ini +│   │   ├── fortran.ini +│   │   ├── go.ini +│   │   ├── html.ini +│   │   ├── idl.ini +│   │   ├── ini.ini +│   │   ├── java.ini +│   │   ├── javascript.ini +│   │   ├── json.ini +│   │   ├── jsp.ini +│   │   ├── lua.ini +│   │   ├── makefile.ini +│   │   ├── matlab.ini +│   │   ├── nsis.ini +│   │   ├── objc.ini +│   │   ├── pascal.ini +│   │   ├── perl.ini +│   │   ├── php.ini +│   │   ├── props.ini +│   │   ├── python.ini +│   │   ├── rc.ini +│   │   ├── ruby.ini +│   │   ├── rust.ini +│   │   ├── spice.ini +│   │   ├── sql.ini +│   │   ├── tcl.ini +│   │   ├── txt.ini +│   │   ├── typescript.ini +│   │   ├── vb.ini +│   │   ├── verilog.ini +│   │   ├── vhdl.ini +│   │   ├── xml.ini +│   │   └── yaml.ini +│   └── info +└── usr + +32 directories, 666 files