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

这篇具有很好参考价值的文章主要介绍了不想使用notepad++,快使用notepad--来替换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

notepad--,qt ,notepad--,编辑器

 notepad--,qt ,notepad--,编辑器

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

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

notepad--,qt ,notepad--,编辑器

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

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


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

notepad--,qt ,notepad--,编辑器

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

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)文章来源地址https://www.toymoban.com/news/detail-571696.html

到了这里,关于不想使用notepad++,快使用notepad--来替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity编辑器实现对选中物体一键替换材质

           最近美术同事在整理模型动画时有一个需求,就是选中部分的模型一件将材质替换成同一个材质球。在编辑器下将这个功能实现了出来。代码放在最后,简单记录一下。 首先对选中进行遍历,拿到所有的子对象; 对每个具体的对象拿到对应的 Mesh Renderer 组件; 对每

    2024年02月13日
    浏览(58)
  • DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

    ---mychat.h---头文件 ---mychar.cpp---源文件 ---main.cpp---测试文件 结果---    

    2024年02月14日
    浏览(47)
  • qt+opencv实现图片编辑器

    借助QLabel容器,进行显示图片作为背景,然后重写QLabel类实现矩形,直线和圆形的实现。opencv板块直接实现相关图片操作。 打开图片 裁切 改变亮度和对比度 顺时针旋转和逆时针旋转 重写的QLabel

    2024年02月16日
    浏览(46)
  • Qt富文本编辑器中表格的操作

    原本计划中的方案时使用Qt的富文本编辑器做一个类Word的编辑器,配合OpenXML实现脱离office软件下对Word软件进行编辑的,但是该方案最终被放弃了,所以最终放到博客上做个记录。程序是在别人的开源代码上改的,原本的文字和图片的样式编辑已经有了,表格方面是我自己做

    2024年02月15日
    浏览(45)
  • 帝国CMS7.5编辑器换行替换为p标记,如何将标签br换成p标签

    第一个在:eadminecmseditorinfoeditorconfig.js; 第二个在:eadminecmseditortempeditorconfig.js; 第三个在:edataecmseditorinfoeditorconfig.js; 你要把这三个文件里面的: config.enterMode = CKEDITOR.ENTER_BR; config.shiftEnterMode = CKEDITOR.ENTER_P; 都改成 config.enterMode = CKEDITOR.ENTER_P; config.shiftEnterMode = CK

    2024年02月03日
    浏览(41)
  • 用QT/C++写一个简易文本编辑器

    学习QT的小练习,先看一下目前实现的效果。   功能: 编辑文本保存为txt。 打开一个txt文本文件,可编辑可保存。 文本编辑功能:剪切,复制,粘贴,加粗,斜体,下划线,设置颜色,字体。 要点: QT Designer的UI可视化设计:基本控件布局,资源导入,菜单动作,信号槽的

    2024年02月05日
    浏览(55)
  • 基于QT4的GPX文件编辑器开发

    GPX文件是记录地理点的文件,本质是一种xml文件。GPX文件目前没有很好的编辑器,因此作者决定开发一款无需安装的绿色编辑器。 在QT4开发中,XML可以用DOM来实现,但其逻辑并不是很清晰。使用模型视图反而会更加可读。因此在开发中,使用model-view模式来实现数据读写。

    2024年02月12日
    浏览(48)
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用 在 Qt 中使用 Label 可以显示文本,但 Label 不止可以显示文本,还可以用于图片的显示。 首

    2024年02月02日
    浏览(46)
  • IDE /Qt Creator 文本编辑器之文件编码设置

    在 Qt Creator 工具 - 选项 - 文本编辑器 - 行为选项卡中,存在一个叫作 “文件编码” 的配置项。其默认配置如下, 我是栽了不少坑之后,才理解到它的用途和作用方式的。这是一个有用的配置项,尤其是在使用 Qt Creator + MSVC 组成的集成开发环境时。我是在整理 《IDE/warning:

    2024年02月13日
    浏览(57)
  • QT Creator更改主题和编辑器风格(附几款黑色主题)

    适用于qtcreator 打开Qt选择\\\"工具\\\"-\\\"选项\\\"; 2. 选择\\\"环境\\\"-\\\"Theme\\\"切换不同的主题风格 这里切换的是外边框的风格,如果编辑器中有同名的风格,编辑器的风格也会被切换  切换为dark风格 3. 选择\\\"文本编辑器\\\"后设置红色下拉框即可设置编辑器风格代码风格。 这里切换的是代码界面

    2024年02月09日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包