浏览代码

cmake-plugin: 引入第一个 Framework 插件框架兼接口形式的开发模式,包含一个简易实现

zinface 1 年之前
父节点
当前提交
4fedd93d1a

+ 5 - 0
src/include/pluginGl.h

@@ -56,9 +56,14 @@ typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserDat
 	extern "C" {
 	extern "C" {
 #endif
 #endif
 
 
+// v1.x 版本的插件接口
 	NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
 	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* pProcData);
 	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit, 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::function<QsciScintilla* (QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> pluginCallBack, NDD_PROC_DATA* procData);
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 	}
 	}
 #endif
 #endif

+ 23 - 13
src/plugin/CMakeLists.txt

@@ -19,20 +19,30 @@ if(USE_NOTEPAD_PLUGIN)
         add_subdirectory(template-plugins/base-secondary-menu-ui-plugin-v1)
         add_subdirectory(template-plugins/base-secondary-menu-ui-plugin-v1)
     endif(USE_NOTEPAD_PLUGIN_BASE)
     endif(USE_NOTEPAD_PLUGIN_BASE)
 
 
+    # 构建一个简单的基于 framwork 的 framework-helloworld 插件
+
+    include(framework/framework.cmake)
+    # add_framework_plugin [<dir>...] [<file>...]
+    # 构建一个基于 framework 的插件
+        # 基于提供的包含源代码文件的的路径,或指定的要构建的源代码
+    add_framework_plugin(framework-helloworld
+        framework-plugins/helloworld
+    )
+
     # 一个简单的插件示例,但依赖于外部的 opencc 项目(基于 git)
     # 一个简单的插件示例,但依赖于外部的 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)
+    # 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)
 endif(USE_NOTEPAD_PLUGIN)

+ 0 - 0
src/plugin/framework-plugins/README.md


+ 76 - 0
src/plugin/framework-plugins/helloworld/helloworld.cpp

@@ -0,0 +1,76 @@
+#include "helloworld.h"
+#include "qdebug.h"
+
+#include <QAction>
+#include <QMessageBox>
+
+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<QsciScintilla *(QWidget *)> 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");
+    });
+}

+ 49 - 0
src/plugin/framework-plugins/helloworld/helloworld.h

@@ -0,0 +1,49 @@
+#ifndef HELLOWORLD_H
+#define HELLOWORLD_H
+
+#include <QObject>
+#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<QsciScintilla *(QWidget *)> 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<QsciScintilla *(QWidget *)> s_get_cur_edit_callback;
+
+};
+
+#endif // HELLOWORLD_H

+ 70 - 0
src/plugin/framework-plugins/helloworld/helloworldplugin.cpp

@@ -0,0 +1,70 @@
+
+
+// #include "../include/pluginGl.h"
+
+#include "qdebug.h"
+#include <pluginGl.h>
+#include <functional>
+#include <qsciscintilla.h>
+
+//#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::function<QsciScintilla* (QWidget*)>getCurEdit, std::function<bool(QWidget*, int, void*)> 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

+ 106 - 0
src/plugin/framework/IPluginFramework.h

@@ -0,0 +1,106 @@
+#ifndef __IPLUGINFRAMEWORK__H__
+#define __IPLUGINFRAMEWORK__H__
+
+#include <QAction>
+#include <cstddef>
+#include <qmenu.h>
+#include <qobject.h>
+#include <qobjectdefs.h>
+#include <qsciscintilla.h>
+
+#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<QsciScintilla*(QWidget*)> get_cur_edit_callback) = 0;
+
+//protected:
+    /**
+     * @brief s_getCurEdit 为回调函数,用于获取当前编辑器
+     */
+//    std::function<QsciScintilla*(QWidget*)> s_getCurEdit;
+};
+
+Q_DECLARE_INTERFACE(IPluginFramework, IPluginFramework_IID)
+
+#endif  //!__IPLUGINFRAMEWORK__H__

+ 76 - 0
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<IPlugin *>(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
+    ```

+ 63 - 0
src/plugin/framework/framework.cmake

@@ -0,0 +1,63 @@
+
+
+# add_framework_plugin [<dir>...] [<file>...]
+# 构建一个基于 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 $<TARGET_FILE_DIR:${PROJECT_NAME}>/plugin
+            LIBRARY_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:${PROJECT_NAME}>/plugin
+            ARCHIVE_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:${PROJECT_NAME}>/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)

+ 701 - 0
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