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

This commit is contained in:
zinface 2023-12-21 02:34:25 +08:00
parent 06b4549140
commit 4fedd93d1a
10 changed files with 1169 additions and 13 deletions

View File

@ -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::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
}
#endif

View File

@ -19,20 +19,30 @@ if(USE_NOTEPAD_PLUGIN)
add_subdirectory(template-plugins/base-secondary-menu-ui-plugin-v1)
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)
add_subdirectory(opencc-demo-plugin)
#
add_subdirectory(versionUpdate)
#
add_subdirectory(external-plugin)
# 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)
# # 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)

View File

View File

@ -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");
});
}

View File

@ -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

View File

@ -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

View File

@ -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__

View File

@ -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
```

View File

@ -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
tree Normal file
View File

@ -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