不想使用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)

猜你喜欢

转载自blog.csdn.net/peterbig/article/details/125970175
今日推荐