相信越來(lái)越多的人已經(jīng)認(rèn)識(shí)到notepad++作者的可惡了,我曾經(jīng)也是notepad++的使用者,當(dāng)我看到它的作者一個(gè)臺(tái)灣人,明目張膽的利用軟件開始宣傳他的錯(cuò)誤觀點(diǎn)后,便覺(jué)得要做些什么了。
notepad++不過(guò)是一個(gè)小軟件,談不上復(fù)雜,而且不支持mac和linux平臺(tái)。我?guī)缀趺刻於家褂镁庉嬈?,既然這樣,我為何不來(lái)自己做一款呢?順便做一個(gè)跨平臺(tái)版本的。既然他叫notepad++,那我就notepad--吧,減少一些錯(cuò)誤言論,減少一些自以為是,簡(jiǎn)稱ndd。我相信國(guó)內(nèi)有大把的同行,都可以做出這種類似的小軟件。不過(guò)恰好大公司瞧不上,小公司沒(méi)技術(shù),那就我來(lái)做吧。
notepad++ 功能簡(jiǎn)單,只能在windows上使用,不支持linux和mac平臺(tái),而且基于政治方面的原因,notepad++的作者如果再這么繼續(xù)作死下去,notepad++在國(guó)內(nèi)下架是遲早的事情。目前已經(jīng)在網(wǎng)絡(luò)上有大量的言論,都在反對(duì)使用notepad++。但是notepad++的作者依然是我行我素,他以為我大陸沒(méi)人可以治得了它,大家雖然嘴上討厭,但是沒(méi)有可以替換它的同類軟件吧。
在我編寫對(duì)比軟件ccompare的過(guò)程中,我發(fā)現(xiàn)其核心功能,已經(jīng)具備一個(gè)文本編輯器的雛形了。只需要再多花一部分額外的精力,便可以成為一個(gè)功能基本可以替換notepad++的簡(jiǎn)單文本編輯器。
?
?于是說(shuō)干就干吧。一番研究后發(fā)現(xiàn),notepad其實(shí)只是一個(gè)外包裝,其內(nèi)部是大名鼎鼎的開源編輯器核心控件scintilla,所以notepad++作者的水平,其實(shí)也遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到他自以為是的高度。只要解放了國(guó)內(nèi)的996環(huán)境,給程序員更好的個(gè)人時(shí)間,可以想象,國(guó)內(nèi)一定可以冒出一大批優(yōu)秀的自由軟件出來(lái)。
我相信國(guó)內(nèi)至少有百分之十的程序員,是具備編寫操作系統(tǒng)、編譯器、編輯器水平的。不過(guò)大家都被996和幾兩碎銀壓的踹不過(guò)氣來(lái)。只要解放程序員,把他們從低水平的體力活中解放出來(lái),中國(guó)的基礎(chǔ)軟件才能看到希望。
不過(guò)要想短時(shí)間取代notepad++的市場(chǎng),也基本是不可能的。目前國(guó)內(nèi)的應(yīng)用軟件,稍微偏底層的一些東西,比如文本編輯器,解析器、編譯器,更不要提操作系統(tǒng),幾乎全部被國(guó)外所把持。我想作為一個(gè)老的程序員,雖然技術(shù)可能已經(jīng)被潮流淘汰了,但是在底層基礎(chǔ)建設(shè)方面,還是可以發(fā)揮一些余熱。準(zhǔn)備優(yōu)先在國(guó)產(chǎn)統(tǒng)uos系上,發(fā)布并維護(hù)替換Notepad++的同類軟件——notepad--。
至于有沒(méi)有市場(chǎng),會(huì)不會(huì)成功,能不能轉(zhuǎn)換出市場(chǎng)效應(yīng),那就交給時(shí)間吧。
ndd 開源地址:ndd: notepad--是一個(gè)國(guó)產(chǎn)跨平臺(tái)、簡(jiǎn)單的文本編輯器,是替換notepad++的一種選擇。其內(nèi)置強(qiáng)大的代碼對(duì)比功能,讓你丟掉付費(fèi)的beyond compare。 (gitee.com)
還是貼上一些代碼吧,避免被認(rèn)為是低效的文章。
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())//共享內(nèi)存被占用則直接返回
{
//發(fā)現(xiàn)在文件中如果存在空格時(shí),參數(shù)不止1個(gè),所以不能單純用2個(gè)參數(shù)表示
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))
{
//去掉第一個(gè)參數(shù),后續(xù)的參數(shù)拼接起來(lái)。其實(shí)參數(shù)中間有空格還是需要使用""引用起來(lái),避免空格參數(shù)分隔為多個(gè)
arguments.takeFirst();
QString filename = arguments.join("");
QByteArray data = filename.toUtf8();
COPYDATASTRUCT copydata;
copydata.dwData = CUSTOM_TYPE; //自定義類型
copydata.lpData = data.data(); //數(shù)據(jù)大小
copydata.cbData = data.size(); // 指向數(shù)據(jù)的指針
::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
//把窗口設(shè)置到最前
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(); //數(shù)據(jù)大小
copydata.cbData = data.size(); // 指向數(shù)據(jù)的指針
::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,否則會(huì)導(dǎo)致父子對(duì)象不在同一個(gè)線程的錯(cuò)誤
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);
//下面槽函數(shù)會(huì)在workThread刪除的時(shí)候執(zhí)行
QObject::connect(workThread, &QThread::finished, pNetReg, &NetRegister::quit);
//注意下面函數(shù)會(huì)在新線程中執(zhí)行
emit pNetReg->signToLicenceServer();
#ifdef Q_OS_WIN
//HWND hwnd = ::FindWindowA("Qt5QWindowIcon", "CCNotebook");
//發(fā)現(xiàn)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();
//結(jié)束進(jìn)程
workThread->quit();
workThread->wait();
delete workThread;
return 0;
}
ndd開源地址:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-571696.html
ndd: notepad--是一個(gè)國(guó)產(chǎn)跨平臺(tái)、簡(jiǎn)單的文本編輯器,是替換notepad++的一種選擇。其內(nèi)置強(qiáng)大的代碼對(duì)比功能,讓你丟掉付費(fèi)的beyond compare。 (gitee.com)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-571696.html
到了這里,關(guān)于不想使用notepad++,快使用notepad--來(lái)替換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!