From 93aee538ea3794fea129af0be2b3533fc2ce2cff Mon Sep 17 00:00:00 2001 From: doe300 Date: Sun, 2 Aug 2026 11:59:00 +0200 Subject: [PATCH] Detect some common script languages via shebang --- src/source_base.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/source_base.cpp b/src/source_base.cpp index 132453f..2f141fe 100644 --- a/src/source_base.cpp +++ b/src/source_base.cpp @@ -38,6 +38,24 @@ Glib::RefPtr Source::StyleSchemeManager::get_default() return instance; } +static Glib::RefPtr guess_shebang(const boost::filesystem::path &file_path, Glib::RefPtr &language_manager) { + std::ifstream input(file_path.string(), std::ios::binary); + std::string line; + if(!std::getline(input, line) || line.empty() || line == "#!") + return {}; + + if(line.find("perl") < line.size()) + return language_manager->get_language("perl"); + else if(line.find("python3") < line.size()) + return language_manager->get_language("python3"); + else if(line.find("python") < line.size()) + return language_manager->get_language("python"); + else if(line.find("sh") < line.size()) + return language_manager->get_language("sh"); + + return {}; +} + Glib::RefPtr Source::guess_language(const boost::filesystem::path &file_path) { auto language_manager = LanguageManager::get_default(); bool result_uncertain = false; @@ -81,6 +99,8 @@ Glib::RefPtr Source::guess_language(const boost::filesystem::path std::string tag(5, '\0'); if(input && input.read(&tag[0], static_cast(tag.size())) && tag == "get_language("xml"); + else if(input && starts_with(tag, "#!")) + language = guess_shebang(file_path, language_manager); } } else if(language->get_id() == "cuda") {