Obsługiwane języki#

Na dzień dzisiejszy program Notepad++ obsługuje/rozpoznaje ponad 80 różnych języków. Pod pojęciem języka # mamy tutaj na myśli:

Wewnętrznie obsługa poszczególnych języków jest realizowana przy użyciu:

Lekser # (lexer), zwany też skanerem (scanner) lub tokenizerem (tokenizer) [WikiEN, WikiPL] to program komputerowy odpowiedzialny za przeprowadzenie analizy leksykalnej # (lexical analysis) [WikiEN, WikiPL] na pewnych danych wejściowych. Lekser jest zwykle łączony z parserem # (parser) [WikiEN, WikiPL], którzy wspólnie analizują składnię języków programowania # (syntax of programming languages) [WikiEN, WikiPL], na przykład w kompilatorach czy silnikach przeglądarek internetowych.

Nie wdając się zbytnio w szczegóły można powiedzieć, że praca leksera polega na wyszukaniu w danych wejściowych (np. z pliku czy innego bufora) pewnych charakterystycznych elementów dla danego języka, np. identyfikatorów (stałe/zmienne), słów kluczowych, operatorów, separatorów, literałów, komentarzy, itd. Dzięki temu pozostałe mechanizmy w programie mogą przetwarzać takie elementy na różne sposoby, np. nadawać im odpowiedni wygląd (poprzez motywy), zwijać/rozwijać bloki w kodzie, automatycznie zamykać nawisy czy podpowiadać słowa kluczowe.

Wybór języka#

Wybór konkretnego języka dla otwieranych plików lub pojedynczego aktywnego pliku można przeprowadzić na wiele sposobów:

Tabela z informacjami o językach#

W poniższej tabeli (86 pozycji) zamieszczam najważniejsze informacje dla wszystkich języków obsługiwanych przez program NPP (źródło). Są to m.in.: nazwa języka, pełna etykieta języka (widoczna na Pasku stanu), identyfikator języka (używany w argumencie -l), domyślne rozszerzenia pliku dla języka i jego lekser (w postaci linku do pliku).

JęzykPełna etykietaIdentyfikatorRozszerzeniaLexer (Scintilla)
Normal textNormal text filenormal.txtLexNull.cxx (Scintilla)
ScintillaEditView.cpp
PHPPHP Hypertext Preprocessor filephp.php .php3 .php4 .php5 .phps .phpt .phtmlLexHTML.cxx (Scintilla)
CC source filec.cLexCPP.cxx (Scintilla)
C++C++ source filecpp.cpp .cxx .cc .h .hh .hpp .hxx .inoLexCPP.cxx (Scintilla)
C#C# source filecs.csLexCPP.cxx (Scintilla)
Objective-CObjective-C source fileobjc.mmLexCPP.cxx (Scintilla)
JavaJava source filejava.javaLexCPP.cxx (Scintilla)
RCWindows Resource filerc.rcLexCPP.cxx (Scintilla)
HTMLHyper Text Markup Language filehtml.html .htm .shtml .shtm .xhtml .xht .htaLexHTML.cxx (Scintilla)
XMLeXtensible Markup Language filexml.xml .xaml .xsl .xslt .xsd .xul .kml .svg .mxml .xsml .wsdl .xlf .xliff .xbl .sxbl .sitemap .gml .gpx .plist .vcproj .vcxproj .csproj .csxproj .vbproj .dbprojLexHTML.cxx (Scintilla)
MakefileMakefilemakefile.mak .mkLexMake.cxx (Scintilla)
PascalPascal source filepascal.pas .pp .p .inc .lprLexPascal.cxx (Scintilla)
BatchBatch filebatch.bat .cmd .ntLexBatch.cxx (Scintilla)
iniMS ini fileini.ini .inf .url .werLexProps.cxx (Scintilla)
NFOMSDOS Style/ASCII Artnfo.nfoLexNull.cxx (Scintilla)
ScintillaEditView.cpp
udfUser Defined language fileudf-LexUser.cxx
ASPActive Server Pages script fileasp.aspLexHTML.cxx (Scintilla)
SQLStructured Query Language filesql.sqlLexSQL.cxx (Scintilla)
Visual BasicVisual Basic filevb.vb .vbsLexVB.cxx (Scintilla)
JavaScriptJavaScript filejavascript-LexCPP.cxx (Scintilla)
CSSCascade Style Sheets Filecss.cssLexCSS.cxx (Scintilla)
PerlPerl source fileperl.pl .pm .plxLexPerl.cxx (Scintilla)
PythonPython filepython.py .pywLexPython.cxx (Scintilla)
LuaLua source Filelua.luaLexLua.cxx (Scintilla)
TeXTeX filetex.texLexTeX.cxx (Scintilla)
Fortran free formFortran free form source filefortran.f .for .f90 .f95 .f2k .f23LexFortran.cxx (Scintilla)
ShellUnix script filebash.bash .sh .bsh .csh .bash_profile .bashrc profileLexBash.cxx (Scintilla)
ActionScriptFlash ActionScript fileactionscript.as .mxLexCPP.cxx (Scintilla)
NSISNullsoft Scriptable Install System script filensis.nsi .nshLexNsis.cxx (Scintilla)
TCLTool Command Language filetcl.tclLexTCL.cxx (Scintilla)
LispList Processing language filelisp.lsp .lispLexLisp.cxx (Scintilla)
SchemeScheme filescheme.scm .smd .ssLexLisp.cxx (Scintilla)
AssemblyAssembly language source fileasm.asmLexAsm.cxx (Scintilla)
DiffDiff filediff.diff .patchLexDiff.cxx (Scintilla)
Properties fileProperties fileprops.propertiesLexProps.cxx (Scintilla)
PostScriptPostScript filepostscript.psLexPS.cxx (Scintilla)
RubyRuby fileruby.rb .rbwLexRuby.cxx (Scintilla)
SmalltalkSmalltalk filesmalltalk.stLexSmalltalk.cxx (Scintilla)
VHDLVHSIC Hardware Description Language filevhdl.vhd .vhdlLexVHDL.cxx (Scintilla)
KiXtartKiXtart filekix.kixLexKix.cxx (Scintilla)
AutoItAutoItautoit.au3LexAU3.cxx (Scintilla)
CAMLCategorical Abstract Machine Languagecaml.ml .mli .sml .thyLexCaml.cxx (Scintilla)
AdaAda fileada.ada .ads .adbLexAda.cxx (Scintilla)
VerilogVerilog fileverilog.v .sv .vh .svhLexVerilog.cxx (Scintilla)
MATLABMATrix LABoratorymatlab.mLexMatlab.cxx (Scintilla)
HaskellHaskellhaskell.hs .lhs .lasLexHaskell.cxx (Scintilla)
Inno SetupInno Setup scriptinno.issLexInno.cxx (Scintilla)
Internal SearchInternal SearchsearchResult-LexSearchResult.cxx
CMakeCMake filecmake.cmakeLexCmake.cxx (Scintilla)
YAMLYAML Ain't Markup Languageyaml.yml .yamlLexYAML.cxx (Scintilla)
COBOLCOmmon Business Oriented Languagecobol.cbl .cbd .cdb .cdc .cob .cpy .copy .lstLexCOBOL.cxx (Scintilla)
Gui4CliGui4Cli filegui4cli-LexGui4Cli.cxx (Scintilla)
DD programming languaged.dLexD.cxx (Scintilla)
PowerShellWindows PowerShellpowershell.ps1 .psm1LexPowerShell.cxx (Scintilla)
RR programming languager.r .s .splusLexR.cxx (Scintilla)
JSPJavaServer Pages script filejsp.jspLexHTML.cxx (Scintilla)
CoffeeScriptCoffeeScript filecoffeescript.coffee .litcoffeeLexCoffeeScript.cxx (Scintilla)
jsonJSON filejson.jsonLexJSON.cxx (Scintilla)
JavaScriptJavaScript filejavascript.js.js .jsm .jsx .ts .tsxLexCPP.cxx (Scintilla)
Fortran fixed formFortran fixed form source filefortran77.f77LexFortran.cxx (Scintilla)
BaanCBaanC Filebaanc.bc .clnLexBaan.cxx (Scintilla)
S-RecordMotorola S-Record binary datasrec.mot .srecLexHex.cxx (Scintilla)
Intel HEXIntel HEX binary dataihex.hexLexHex.cxx (Scintilla)
Tektronix extended HEXTektronix extended HEX binary datatehex.tekLexHex.cxx (Scintilla)
SwiftSwift fileswift.swiftLexCPP.cxx (Scintilla)
ASN.1Abstract Syntax Notation One fileasn1.mibLexAsn1.cxx (Scintilla)
AviSynthAviSynth scripts filesavs.avs .avsiLexAVS.cxx (Scintilla)
BlitzBasicBlitzBasic fileblitzbasic.bbLexBasic.cxx (Scintilla)
PureBasicPureBasic filepurebasic.pbLexBasic.cxx (Scintilla)
FreeBasicFreeBasic filefreebasic.bas .biLexBasic.cxx (Scintilla)
CsoundCsound filecsound.orc .sco .csdLexCsound.cxx (Scintilla)
ErlangErlang fileerlang.rl .hrlLexErlang.cxx (Scintilla)
ESCRIPTESCRIPT fileescript.src .emLexEScript.cxx (Scintilla)
ForthForth fileforth.forthLexForth.cxx (Scintilla)
LaTeXLaTeX filelatex.tex .styLexLaTeX.cxx (Scintilla)
MMIXALMMIXAL filemmixal.mmsLexMMIXAL.cxx (Scintilla)
NimrodNimrod filenimrod.nimLexNimrod.cxx (Scintilla)
Nncrontabextended crontab filenncrontab.tab .spfLexCrontab.cxx (Scintilla)
OScriptOScript source fileoscript.osxLexOScript.cxx (Scintilla)
REBOLREBOL filerebol.r2 .r3 .rebLexRebol.cxx (Scintilla)
registryregistry fileregistry.regLexRegistry.cxx (Scintilla)
RustRust filerust.rsLexRust.cxx (Scintilla)
Spicespice filespice.scp .outLexSpice.cxx (Scintilla)
txt2tagstxt2tags filetxt2tags.t2tLexTxt2tags.cxx (Scintilla)
Visual PrologVisual Prolog filevisualprolog.pro .cl .i .pack .phLexVisualProlog.cxx (Scintilla)
ExternalExternalext-LexNull.cxx (Scintilla)
ScintillaEditView.cpp

Pominięte leksery#

Scintilla udostępnia 115 wszystkich lekserów. W poniższej liście zamieszczam wszystkie te, które nie zostały jeszcze wykorzystane przez program NPP (49 pozycji):

Mieszanie lekserów#

Największym ograniczeniem lekserów jest ich implementacja, gdzie zdecydowana większość działa tylko dla jednego języka. Nie ma możliwości dowolnego uruchamiania kilku lekserów w tym samym czasie dla jednego pliku. Jedynym rozwiązaniem pozostaje napisanie własnego leksera, który obsłuży wszystkie wymagane przez nas języki.

W programie Notepad++ istnieje tylko jeden lekser LexHTML.cxx, który odpowiada za mieszaną obsługę kilku języków: PHP, XML, XHTML, SGML (DTD), JavaScript, Visual Basic Script i Python. Niestety nawet on nie obsługuje często osadzanego języka CSS. W dodatku autouzupełnianie funkcji/słów działa tylko dla jednego języka. Na upartego można się przełączać na konkretny język w tym samym pliku (ręcznie lub skrótem klawiszowym), albo tworzyć kod w osobnych plikach z ustawionym właściwym językiem, i dopiero na koniec kopiować go do docelowego pliku (ręcznie lub w automacie). Żadne z obu wymienionych rozwiązań nie ma nic wspólnego z wygodą czy szeroko pojętą ergonomią pracy. Jest to jeden z najistotniejszych minusów programu Notepad++ (odziedziczony wprost z komponentu Scintilla), który na przestrzeni wielu lat nie został w żaden sposób rozwiązany.

Poniżej znajdują się dodatkowe materiały poruszające problem mieszania różnych języków w programie Notepad++:

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Obsługiwane języki (H1) Wybór języka (H2) Tabela z informacjami o językach (H2) Pominięte leksery (H2) Mieszanie lekserów (H2)