0


不想使用notepad++,快使用notepad--来替换

相信越来越多的人已经认识到notepad++作者的可恶了,我曾经也是notepad++的使用者,当我看到它的作者一个台湾人,明目张胆的利用软件开始宣传他的错误观点后,便觉得要做些什么了。

notepad++不过是一个小软件,谈不上复杂,而且不支持mac和linux平台。我几乎每天都要使用编辑器,既然这样,我为何不来自己做一款呢?顺便做一个跨平台版本的。既然他叫notepad++,那我就notepad--吧,减少一些错误言论,减少一些自以为是,简称ndd。我相信国内有大把的同行,都可以做出这种类似的小软件。不过恰好大公司瞧不上,小公司没技术,那就我来做吧。

notepad++ 功能简单,只能在windows上使用,不支持linux和mac平台,而且基于政治方面的原因,notepad++的作者如果再这么继续作死下去,notepad++在国内下架是迟早的事情。目前已经在网络上有大量的言论,都在反对使用notepad++。但是notepad++的作者依然是我行我素,他以为我大陆没人可以治得了它,大家虽然嘴上讨厌,但是没有可以替换它的同类软件吧。

在我编写对比软件ccompare的过程中,我发现其核心功能,已经具备一个文本编辑器的雏形了。只需要再多花一部分额外的精力,便可以成为一个功能基本可以替换notepad++的简单文本编辑器。

于是说干就干吧。一番研究后发现,notepad其实只是一个外包装,其内部是大名鼎鼎的开源编辑器核心控件scintilla,所以notepad++作者的水平,其实也远远没有达到他自以为是的高度。只要解放了国内的996环境,给程序员更好的个人时间,可以想象,国内一定可以冒出一大批优秀的自由软件出来。

我相信国内至少有百分之十的程序员,是具备编写操作系统、编译器、编辑器水平的。不过大家都被996和几两碎银压的踹不过气来。只要解放程序员,把他们从低水平的体力活中解放出来,中国的基础软件才能看到希望。

不过要想短时间取代notepad++的市场,也基本是不可能的。目前国内的应用软件,稍微偏底层的一些东西,比如文本编辑器,解析器、编译器,更不要提操作系统,几乎全部被国外所把持。我想作为一个老的程序员,虽然技术可能已经被潮流淘汰了,但是在底层基础建设方面,还是可以发挥一些余热。准备优先在国产统uos系上,发布并维护替换Notepad++的同类软件——notepad--。

至于有没有市场,会不会成功,能不能转换出市场效应,那就交给时间吧。

ndd 开源地址:ndd: notepad--是一个国产跨平台、简单的文本编辑器,是替换notepad++的一种选择。其内置强大的代码对比功能,让你丢掉付费的beyond compare。 (gitee.com)

还是贴上一些代码吧,避免被认为是低效的文章。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDir::setCurrent(QCoreApplication::applicationDirPath());

#ifdef Q_OS_UNIX
    QApplication::setStyle(QStyleFactory::create("fusion"));
#endif
    a.setApplicationDisplayName(c_strTitle);
    a.setApplicationName(c_strTitle);
    
    QStringList arguments = QCoreApplication::arguments();
#ifdef Q_OS_WIN
    QSharedMemory shared("CCNotebook");
#endif
    if (shared.attach())//共享内存被占用则直接返回
    {
        //发现在文件中如果存在空格时,参数不止1个,所以不能单纯用2个参数表示
        if (arguments.size() > 1)
        {
        #ifdef Q_OS_WIN

            qlonglong hwndId;
            shared.lock();
            memcpy(&hwndId, shared.data(), sizeof(qlonglong));
            shared.unlock();

            HWND hwnd = (HWND)hwndId;
            if (::IsWindow(hwnd))
            {
                //去掉第一个参数,后续的参数拼接起来。其实参数中间有空格还是需要使用""引用起来,避免空格参数分隔为多个
                arguments.takeFirst();

                QString filename = arguments.join("");
                QByteArray data = filename.toUtf8();

                COPYDATASTRUCT copydata;
                copydata.dwData = CUSTOM_TYPE; //自定义类型
                copydata.lpData = data.data();  //数据大小
                copydata.cbData = data.size();  // 指向数据的指针

                ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>(nullptr), reinterpret_cast<LPARAM>(&copydata));
            }
        #else
            pid_t pid;

            arguments.takeFirst();
            QString filename = arguments.join("");
            QByteArray data = filename.toUtf8();

            nppShared.attach();
            nppShared.lock();
            memcpy(&pid, nppShared.data(), sizeof(pid_t));
            memset((char*)nppShared.data()+sizeof(pid_t),0, 1024-sizeof(pid_t));
            memcpy((char*)nppShared.data()+sizeof(pid_t),data.data(),data.size());
            nppShared.unlock();

            kill(pid,SIGUSR1);
            #endif
        }
        else if (arguments.size() == 1)
        {
#ifdef Q_OS_WIN
            //把窗口设置到最前
            qlonglong hwndId;
            shared.lock();
            memcpy(&hwndId, shared.data(), sizeof(qlonglong));
            shared.unlock();
            HWND hwnd = (HWND)hwndId;
            if (::IsWindow(hwnd))
            {
                QString filename("open");
                QByteArray data = filename.toUtf8();

                COPYDATASTRUCT copydata;
                copydata.dwData = OPEN_NOTEPAD_TYPE; //自定义类型
                copydata.lpData = data.data();  //数据大小
                copydata.cbData = data.size();  // 指向数据的指针

                ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>(nullptr), reinterpret_cast<LPARAM>(&copydata));
            }
#else
            pid_t pid;
            nppShared.attach();
            nppShared.lock();
            memcpy(&pid, nppShared.data(), sizeof(pid_t));
            memset((char*)nppShared.data()+sizeof(pid_t),0, 1024-sizeof(pid_t));
            nppShared.unlock();
            qDebug()<<"empty file send";
            kill(pid,SIGUSR1);
#endif
        }
        return 0;
    }
#ifdef Q_OS_WIN
    shared.create(32);
#else
    shared.create(32);
    nppShared.create(2048);

    if(signal(SIGUSR1,sig_usr) == SIG_ERR)
    {
       qDebug()<<"linux create sign failed";
    }
#endif

    QFile file(":/mystyle.qss"); //qss文件路径
    QString styleSheet;
    if (file.open(QIODevice::Text | QIODevice::ReadOnly))
    {
        styleSheet = file.readAll();
        qApp->setStyleSheet(styleSheet);
    }
    file.close();

    CCNotePad *pMainNotepad = new CCNotePad(true);
    pMainNotepad->setAttribute(Qt::WA_DeleteOnClose);
    pMainNotepad->setShareMem(&shared);
    pMainNotepad->show();

    QThread *workThread = new QThread(&a);
    //QObject::connect(workThread, &QThread::finished, workThread, &QObject::deleteLater);
    workThread->start();

    //这里不能给parent,否则会导致父子对象不在同一个线程的错误
    NetRegister *pNetReg = new NetRegister(nullptr);
    pNetReg->moveToThread(workThread);

    QStatusBar *pStatusBar = pMainNotepad->statusBar();
    QObject::connect(pNetReg, &NetRegister::showMessage, pStatusBar, &QStatusBar::showMessage);
    QObject::connect(pNetReg, &NetRegister::signToLicenceServer, pNetReg, &NetRegister::slot_ToLicenceServer); 
    QObject::connect(pNetReg, &NetRegister::signMsg, pMainNotepad, &CCNotePad::slot_donate);
    //下面槽函数会在workThread删除的时候执行
    QObject::connect(workThread, &QThread::finished, pNetReg, &NetRegister::quit);
    //注意下面函数会在新线程中执行
    emit pNetReg->signToLicenceServer();

#ifdef Q_OS_WIN
    //HWND hwnd = ::FindWindowA("Qt5QWindowIcon", "CCNotebook");
    //发现hwnd就是和effectiveWinId相等的,不需要查询了
    qlonglong winId = (qlonglong)pMainNotepad->effectiveWinId();

    shared.lock();
    memcpy(shared.data(), &winId, sizeof(qlonglong));
    shared.unlock();
#else
    qlonglong winId = (qlonglong)pMainNotepad->effectiveWinId();
    shared.lock();
    memcpy(shared.data(), &winId, sizeof(qlonglong));
    shared.unlock();
    nppShared.attach();
    //get proceess id to share memory
    pid_t pid = getpid();
    nppShared.lock();
    memcpy(nppShared.data(), &pid, sizeof(pid_t));
    nppShared.unlock();
#endif // Q_OS_WIN

    if (arguments.size() == 2)
    {
        pMainNotepad->openFile(arguments[1]);
        pMainNotepad->showNormal();
    }
    else
    {
        pMainNotepad->initTabNewOne();
    }

    a.exec();

    //结束进程
    workThread->quit();
    workThread->wait();
    delete workThread;

    return 0;
}

ndd开源地址:

ndd: notepad--是一个国产跨平台、简单的文本编辑器,是替换notepad++的一种选择。其内置强大的代码对比功能,让你丢掉付费的beyond compare。 (gitee.com)

标签: notepad-- 编辑器

本文转载自: https://blog.csdn.net/peterbig/article/details/125970175
版权归原作者 notepad-- 所有, 如有侵权,请联系我们删除。

“不想使用notepad++,快使用notepad--来替换”的评论:

还没有评论