From d399c454ff82d64f2a58a9f024eff9953baf46fe Mon Sep 17 00:00:00 2001 From: Gary Wang Date: Sun, 1 Feb 2026 16:23:33 +0800 Subject: [PATCH] better lexer name handling --- documentmanager.cpp | 76 ++++++++++++++++++++++++++++---------------- editorviewhelper.cpp | 4 +++ mainwindow.cpp | 13 +++++++- tabwidget.cpp | 30 ++--------------- 4 files changed, 67 insertions(+), 56 deletions(-) diff --git a/documentmanager.cpp b/documentmanager.cpp index 3e8bb06..70348c0 100644 --- a/documentmanager.cpp +++ b/documentmanager.cpp @@ -25,7 +25,7 @@ int DocumentManager::createNewDocument() doc.filePath = QString(); doc.content = QString(); doc.encoding = "UTF-8"; - doc.language = "Plain Text"; + doc.language = QString(); doc.modified = false; doc.untitled = true; @@ -171,7 +171,7 @@ QString DocumentManager::getDocumentLanguage(int docId) const if (m_documents.contains(docId)) { return m_documents[docId].language; } - return "Plain Text"; + return QString(); } bool DocumentManager::isDocumentModified(int docId) const @@ -247,29 +247,51 @@ QString DocumentManager::generateUntitledName() QString DocumentManager::detectLanguageFromExtension(const QString &filePath) { QFileInfo fileInfo(filePath); - QString extension = fileInfo.suffix().toLower(); - - if (extension == "cpp" || extension == "cxx" || extension == "cc" || extension == "c++") { - return "C++"; - } else if (extension == "c") { - return "C"; - } else if (extension == "h" || extension == "hpp" || extension == "hxx") { - return "C/C++ Header"; - } else if (extension == "py") { - return "Python"; - } else if (extension == "js") { - return "JavaScript"; - } else if (extension == "html" || extension == "htm") { - return "HTML"; - } else if (extension == "css") { - return "CSS"; - } else if (extension == "xml") { - return "XML"; - } else if (extension == "json") { - return "JSON"; - } else if (extension == "txt") { - return "Plain Text"; - } else { - return "Plain Text"; + const QString fileName = fileInfo.fileName(); + const QString extension = fileInfo.suffix().toLower(); + + if (fileName.compare(QStringLiteral("CMakeLists.txt"), Qt::CaseInsensitive) == 0) { + return QStringLiteral("cmake"); } -} \ No newline at end of file + + if (extension == QStringLiteral("cpp") || extension == QStringLiteral("cxx") || + extension == QStringLiteral("cc") || extension == QStringLiteral("c++") || + extension == QStringLiteral("c") || extension == QStringLiteral("h") || + extension == QStringLiteral("hpp") || extension == QStringLiteral("hxx")) { + return QStringLiteral("cpp"); + } + + if (extension == QStringLiteral("py")) { + return QStringLiteral("python"); + } + + if (extension == QStringLiteral("html") || extension == QStringLiteral("htm")) { + return QStringLiteral("hypertext"); + } + + if (extension == QStringLiteral("xml") || extension == QStringLiteral("xsd") || extension == QStringLiteral("xsl")) { + return QStringLiteral("xml"); + } + + if (extension == QStringLiteral("json")) { + return QStringLiteral("json"); + } + + if (extension == QStringLiteral("css")) { + return QStringLiteral("css"); + } + + if (extension == QStringLiteral("cmake")) { + return QStringLiteral("cmake"); + } + + if (extension == QStringLiteral("yaml")) { + return QStringLiteral("yaml"); + } + + if (extension == QStringLiteral("ps1") || extension == QStringLiteral("psm1") || extension == QStringLiteral("psd1")) { + return QStringLiteral("powershell"); + } + + return QString(); +} diff --git a/editorviewhelper.cpp b/editorviewhelper.cpp index 309be58..47ec85e 100644 --- a/editorviewhelper.cpp +++ b/editorviewhelper.cpp @@ -33,8 +33,12 @@ QString LexerGroupActionMenu::displayName(const QString &lexerName) { static const QHash displayNameMap { {"cpp", "C++"}, + {"python", "Python"}, {"cmake", "CMake"}, {"hypertext", "HTML"}, + {"xml", "XML"}, + {"json", "JSON"}, + {"css", "CSS"}, {"powershell", "PowerShell"} }; diff --git a/mainwindow.cpp b/mainwindow.cpp index a9beae3..da05e9f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -111,6 +111,11 @@ void MainWindow::setupActions() connect(lexerNoneAction, &QAction::triggered, this, [this](){ if (SciEdit *editor = m_tabWidget->currentEditor()) { editor->setLexer(nullptr); + const int docId = m_tabWidget->currentDocumentId(); + if (docId >= 0) { + m_documentManager->setDocumentLanguage(docId, QString()); + } + updateStatusBar(); } }); @@ -219,6 +224,11 @@ void MainWindow::applyLexer(const QString &lexerName) if (SciEdit *editor = m_tabWidget->currentEditor()) { Scintilla::ILexer5 * lexer = CreateLexer(lexerName.toStdString().c_str()); editor->setLexer(lexer); + const int docId = m_tabWidget->currentDocumentId(); + if (docId >= 0) { + m_documentManager->setDocumentLanguage(docId, lexerName); + } + updateStatusBar(); } } @@ -326,7 +336,8 @@ void MainWindow::updateStatusBar() int docId = m_tabWidget->currentDocumentId(); if (docId >= 0) { QString encoding = m_documentManager->getDocumentEncoding(docId); - QString language = m_documentManager->getDocumentLanguage(docId); + const QString lexerName = m_documentManager->getDocumentLanguage(docId); + const QString language = lexerName.isEmpty() ? QStringLiteral("Plain Text") : LexerGroupActionMenu::displayName(lexerName); m_encodingStatusLabel->setText(encoding); m_languageStatusLabel->setText(language); diff --git a/tabwidget.cpp b/tabwidget.cpp index c0353d2..fc4c594 100644 --- a/tabwidget.cpp +++ b/tabwidget.cpp @@ -10,32 +10,6 @@ #include #include -static QString lexerNameForDocumentLanguage(const QString &language) -{ - if (language == QStringLiteral("C++") || - language == QStringLiteral("C") || - language == QStringLiteral("C/C++ Header")) { - return QStringLiteral("cpp"); - } - if (language == QStringLiteral("Python")) { - return QStringLiteral("python"); - } - if (language == QStringLiteral("HTML")) { - return QStringLiteral("hypertext"); - } - if (language == QStringLiteral("XML")) { - return QStringLiteral("xml"); - } - if (language == QStringLiteral("JSON")) { - return QStringLiteral("json"); - } - if (language == QStringLiteral("CSS")) { - return QStringLiteral("css"); - } - - return QString(); -} - TabWidget::TabWidget(DocumentManager *documentManager, QWidget *parent) : QTabWidget(parent) , m_documentManager(documentManager) @@ -107,7 +81,7 @@ int TabWidget::openDocument(const QString &filePath) editor->setEditorFont(AppSettings::editorFont()); editor->applyTheme(AppSettings::editorDarkTheme()); - const QString lexerName = lexerNameForDocumentLanguage(m_documentManager->getDocumentLanguage(docId)); + const QString lexerName = m_documentManager->getDocumentLanguage(docId); if (lexerName.isEmpty()) { editor->setLexer(nullptr); } else { @@ -179,7 +153,7 @@ bool TabWidget::saveCurrentDocumentAs() const bool saved = m_documentManager->saveDocumentAs(docId, fileName); if (saved) { - const QString lexerName = lexerNameForDocumentLanguage(m_documentManager->getDocumentLanguage(docId)); + const QString lexerName = m_documentManager->getDocumentLanguage(docId); if (lexerName.isEmpty()) { editor->setLexer(nullptr); } else {