相信越来越多的人已经认识到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>(©data));
}
#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>(©data));
}
#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开源地址:文章来源:https://www.toymoban.com/news/detail-571696.html
ndd: notepad--是一个国产跨平台、简单的文本编辑器,是替换notepad++的一种选择。其内置强大的代码对比功能,让你丢掉付费的beyond compare。 (gitee.com)文章来源地址https://www.toymoban.com/news/detail-571696.html
到了这里,关于不想使用notepad++,快使用notepad--来替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!