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

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

notepad++是挺好用的,但是它不支持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_UNIXQApplication::setStyle(QStyleFactory::create("fusion"));
#endifa.setApplicationDisplayName(c_strTitle);a.setApplicationName(c_strTitle);QStringList arguments = QCoreApplication::arguments();
#ifdef Q_OS_WINQSharedMemory shared("CCNotebook");
#endifif (shared.attach())//共享内存被占用则直接返回{//发现在文件中如果存在空格时,参数不止1个,所以不能单纯用2个参数表示if (arguments.size() > 1){#ifdef Q_OS_WINqlonglong 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));}#elsepid_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));}
#elsepid_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_WINshared.create(32);
#elseshared.create(32);nppShared.create(2048);if(signal(SIGUSR1,sig_usr) == SIG_ERR){qDebug()<<"linux create sign failed";}
#endifQFile 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();
#elseqlonglong winId = (qlonglong)pMainNotepad->effectiveWinId();shared.lock();memcpy(shared.data(), &winId, sizeof(qlonglong));shared.unlock();nppShared.attach();//get proceess id to share memorypid_t pid = getpid();nppShared.lock();memcpy(nppShared.data(), &pid, sizeof(pid_t));nppShared.unlock();
#endif // Q_OS_WINif (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++,快使用notepad--来替换相关推荐

  1. #文本编辑器#卸载Notepad++?除了Notepad++,还有啥能代替的吗?有,必须有!!!

    卸载Notepad++?!用Notepad 3.Sublime.Atom都很香!!! #2019.10.31 广州 天气晴微风# 今早,因为公众号" 二道情报贩子"推送的一篇文章, ...

  2. notepad 生成html,Notepad ++ HTML整洁

    Notepad ++ HTML整洁 Notepad ++的HTML Tidy是否损坏? 除Tidy(第一个)外,所有命令均无效. 即使选择了所有文本,它们也不会显示任何消息. 我真的需要Tidy上班, ...

  3. notepad 的php,notepad是什么

    notepad(记事本)是代码编辑器或WINDOWS中的小程序,用于文本编辑,在文字编辑方面与Windows写字板功能相当.是一款开源.小巧.免费的纯文本编辑器. Notepad内置支持多达 27 种 ...

  4. notepad php格式,notepad怎么格式xml

    当想要使用Notepad++快速的查看从某某处( 比如通过:uiautomatorviewer) 导出的xml文件时,文件一团乱,看的头晕眼花. 大致情形如下图:(推荐学习:notepad使用) 安装 ...

  5. notepad: 怎么在notepad里面,将字符串替换成换行

    用Notepad++可以,利用查找和替换功能,选择正则表达式,查找目标框里输入你想要替换的字符串,替换为框里输入\r,点击替换即可.这是个 很强大的功能,利用还它可以批量替换任何字符串,比如你链接是1 ...

  6. 网络推广方案分享网站想要更快的优化到首页的技巧!

    网络推广方案中网站在上线后,都想让网站的优化排名更高,并得到更多的流量,让网站越来越受欢迎,但要把网站优化到首页并不是件容易的事,它不仅要注意更多的细节,还要做到更适合搜索引擎的优化规则,那么下面网络 ...

  7. delphi 找到某个按钮的句柄_想要又快有准的找到Instagram网红,不妨试试这些方法...

    随着网络的发展,网红成了时下非常流行的词汇,网红的存在,给我们的生活带来了更为丰富个性的色彩,而网红营销更是将网红与经济相结合,成了一种新型的营销方式. 国内有"口红一哥"李佳琦, ...

  8. 如何用notepad写php,notepad新手怎么使用

    新手使用notepad++的几个小技巧: 一.软件始终置于屏幕最前方 有时候我们在运行程序时,需要将notepad++放置到屏幕最前方,此时只需要在工具栏中点击: view--always on to ...

  9. Notepad++如何对比文件 Notepad++对比两个文件代码方法

    大家在使用Notepad++的时候,需要对编辑的两个文件进行比较,找出两个文件代码的区别,快速进行编辑修改,那么Notepad++如何对比文件,下面小编就给大家带来Notepad++对比两个文件代码方 ...

最新文章

  1. Python多阶段框架实现虚拟试衣间,超逼真!
  2. R语言绘制环形树状图
  3. Windows or Linux
  4. 50个数据可视化最有价值的图表(附完整Python代码,建议收藏
  5. 【2016年第2期】大数据背景下的治理现代化:何以可能与何以可为(上)
  6. 003.DNS主从正反解析部署
  7. game with probability problem
  8. 性能测试指标(重要)
  9. 优先队列 priority_queue 用法 (struct,非cmp)
  10. 命令行无法运行php,php文件在命令行可以顺利运行,在浏览器上无法正常运行
  11. Redis安装教程(保姆级详细图文)
  12. android手机鼠标,安卓手机变鼠标以及手机控制电脑图文教程
  13. 计算机网络原理之网络层(解疑答惑)
  14. java微信支付 openid_微信公众号支付(一)如何获取用户openId
  15. 汉诺塔的图解递归算法
  16. python爬虫爬取网站视频_python3爬虫爬取视频(一)
  17. 【MYSQL】ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  18. 弗雷歇距离的原理及python代码实现(动态规划)
  19. URL重写实现会话跟踪
  20. 解决windows电脑蓝屏的方法

热门文章

  1. 25 Top UI Tools for User Interface Engineers
  2. qt5不支持的视频格式:doRender:Unresolved error code 80040266
  3. 年底了,我们都应该这么跟老板谈加薪
  4. 520c语言程序表白,C语言实现520表白代码 祝你表白成功!
  5. 【Codecs系列】几个开源的视频编解码器介绍
  6. HNOI2018 摸鱼记
  7. 我的2015---找寻真实的自己
  8. bitmap灵活存储思维
  9. 修改tp-wr841n-v8的flash
  10. stm32单片机实现多个闹钟_STM32实现对RTC闹钟唤醒的设计