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:
- język programowania (programming language) [WikiEN, WikiPL] - przykładowo C, C++, Java, Python, JavaScript.
- język znaczników (markup language) [WikiEN, WikiPL] - przykładowo XML, XHTML, HTML, LaTeX.
- jakąś gramatykę formalną (formal grammar) [WikiEN, WikiPL] - przykładowo CSS, JSON, specyficzne pliki (INI czy NFO).
Wewnętrznie obsługa poszczególnych języków jest realizowana przy użyciu:
- Lekserów pochodzących z komponentu Scintilla.
- Dodatkowych definicji UDL.
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:
Jeśli otwieramy plik w sposób standardowy i istnieje on fizycznie na dysku twardym (tzn. został on przynajmniej raz zapisany) to program Notepad++ wybierze język w oparciu o jego rozszerzenie #. Deklaracje rozszerzeń dla każdego języka znajdują się w pliku
NPP\langs.model.xml
(używany przy pierwszym uruchomieniu NPP) lubNPP\langs.xml
(używany przy kolejnych uruchomieniach NPP). Przykładowo dla HTML-a deklaracja jest następująca:<Language name="html" ext="html htm shtml shtm xhtml xht hta" commentLine="" commentStart="<!--" commentEnd="-->">
Jeśli ciągle pracujemy na plikach, których rozszerzenie nie widnieje w regule dla danego języka to wystarczy uzupełnić argument
ext=""
o kolejne wpisy. Rozszerzenia podajemy bez znaku kropki i rozdzielamy je od siebie spacją. Zmiany zwykle wprowadza się w plikuNPP\langs.xml
, ale wszystko tak naprawdę zależy od późniejszego sposobu aktualizacji programu NPP do nowszych wersji.Metoda ta jest o tyle wygodna, że działa globalnie, tzn. ustawione w pliku
NPP\langs.xml
rozszerzenia działają dla wszystkich motywów, w argumenciefilepath
czy pozostałych metodach otwierających pliki.Alternatywnie dla powyższej metody można skorzystać także z okna Konfigurator stylów. Każdy motyw ma własne ustawienia rozszerzeń dla obsługiwanych przez siebie języków. Wystarczy w polu
Roz. użyt.:
dopisać brakujące rozszerzenia (bez kropki i rozdzielone spacją).Rysunek. Notepad++ - dodatkowe rozszerzenia dla języków w konkretnym motywie ustawione w oknie Konfigurator stylów
Można też ręcznie wyedytować konkretny plik motywu i dopisać brakujące rozszerzenia w argumencie
ext=""
wewnątrz znacznika<LexerType>
reprezentującego dany język:<LexerType name="html" desc="HTML" ext="">
Trzeba wyraźnie zaznaczyć, że w tym sposobie zmiany obejmują tylko ten jeden konkretny motyw, i aby były widoczne w pozostałych motywach to każdy z nich należy uzupełnić osobno, co nie jest szczególnie wygodne.
Dla nowego niezapisanego jeszcze dokumentu, który można utworzyć wybierając u góry na Pasku menu kolejno
Pliki >> Nowy
(domyślny skrótCtrl+N
) lub dwukrotnie klikając lewym przyciskiem myszy na pustym miejscu na Pasku kart wybrany zostaje domyślny język ustawiony w oknie Preferencje.- Pliki z rozszerzeniem nieprzypisanym do żadnego języka używają po prostu języka Normal text (tj. są traktowane jak normalny plik tekstowy).
- Uruchamiając program z argumentem
-l
możemy wskazać, który język zostanie użyty dla przekazanych danych (tj. plików lub tekstu podanego wprost). Dla każdego otwartego pliku możemy ustawić dowolny język poprzez Pasek stanu (pierwsze pole z lewej) lub Pasek menu (sekcja
Składnia
). Istotne jest to, że wybrany język dla danego pliku zostaje zapamiętany także w pliku sesji. Dzięki temu możemy sobie zapisywać różne stany z wieloma plikami, które stosują odmienne języki niż wynikałoby to z ich rozszerzeń, bez konieczności modyfikowania ogólnych plików konfiguracyjnych programu NPP.Przypomnę raz jeszcze, że do zarządzania wieloma plikami sesji najlepiej użyć jakieś dedykowane rozwiązanie.
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ęzyk | Pełna etykieta | Identyfikator | Rozszerzenia | Lexer (Scintilla) |
---|---|---|---|---|
Normal text | Normal text file | normal | .txt | LexNull.cxx (Scintilla) ScintillaEditView.cpp |
PHP | PHP Hypertext Preprocessor file | php | .php .php3 .php4 .php5 .phps .phpt .phtml | LexHTML.cxx (Scintilla) |
C | C source file | c | .c | LexCPP.cxx (Scintilla) |
C++ | C++ source file | cpp | .cpp .cxx .cc .h .hh .hpp .hxx .ino | LexCPP.cxx (Scintilla) |
C# | C# source file | cs | .cs | LexCPP.cxx (Scintilla) |
Objective-C | Objective-C source file | objc | .mm | LexCPP.cxx (Scintilla) |
Java | Java source file | java | .java | LexCPP.cxx (Scintilla) |
RC | Windows Resource file | rc | .rc | LexCPP.cxx (Scintilla) |
HTML | Hyper Text Markup Language file | html | .html .htm .shtml .shtm .xhtml .xht .hta | LexHTML.cxx (Scintilla) |
XML | eXtensible Markup Language file | xml | .xml .xaml .xsl .xslt .xsd .xul .kml .svg .mxml .xsml .wsdl .xlf .xliff .xbl .sxbl .sitemap .gml .gpx .plist .vcproj .vcxproj .csproj .csxproj .vbproj .dbproj | LexHTML.cxx (Scintilla) |
Makefile | Makefile | makefile | .mak .mk | LexMake.cxx (Scintilla) |
Pascal | Pascal source file | pascal | .pas .pp .p .inc .lpr | LexPascal.cxx (Scintilla) |
Batch | Batch file | batch | .bat .cmd .nt | LexBatch.cxx (Scintilla) |
ini | MS ini file | ini | .ini .inf .url .wer | LexProps.cxx (Scintilla) |
NFO | MSDOS Style/ASCII Art | nfo | .nfo | LexNull.cxx (Scintilla) ScintillaEditView.cpp |
udf | User Defined language file | udf | - | LexUser.cxx |
ASP | Active Server Pages script file | asp | .asp | LexHTML.cxx (Scintilla) |
SQL | Structured Query Language file | sql | .sql | LexSQL.cxx (Scintilla) |
Visual Basic | Visual Basic file | vb | .vb .vbs | LexVB.cxx (Scintilla) |
JavaScript | JavaScript file | javascript | - | LexCPP.cxx (Scintilla) |
CSS | Cascade Style Sheets File | css | .css | LexCSS.cxx (Scintilla) |
Perl | Perl source file | perl | .pl .pm .plx | LexPerl.cxx (Scintilla) |
Python | Python file | python | .py .pyw | LexPython.cxx (Scintilla) |
Lua | Lua source File | lua | .lua | LexLua.cxx (Scintilla) |
TeX | TeX file | tex | .tex | LexTeX.cxx (Scintilla) |
Fortran free form | Fortran free form source file | fortran | .f .for .f90 .f95 .f2k .f23 | LexFortran.cxx (Scintilla) |
Shell | Unix script file | bash | .bash .sh .bsh .csh .bash_profile .bashrc profile | LexBash.cxx (Scintilla) |
ActionScript | Flash ActionScript file | actionscript | .as .mx | LexCPP.cxx (Scintilla) |
NSIS | Nullsoft Scriptable Install System script file | nsis | .nsi .nsh | LexNsis.cxx (Scintilla) |
TCL | Tool Command Language file | tcl | .tcl | LexTCL.cxx (Scintilla) |
Lisp | List Processing language file | lisp | .lsp .lisp | LexLisp.cxx (Scintilla) |
Scheme | Scheme file | scheme | .scm .smd .ss | LexLisp.cxx (Scintilla) |
Assembly | Assembly language source file | asm | .asm | LexAsm.cxx (Scintilla) |
Diff | Diff file | diff | .diff .patch | LexDiff.cxx (Scintilla) |
Properties file | Properties file | props | .properties | LexProps.cxx (Scintilla) |
PostScript | PostScript file | postscript | .ps | LexPS.cxx (Scintilla) |
Ruby | Ruby file | ruby | .rb .rbw | LexRuby.cxx (Scintilla) |
Smalltalk | Smalltalk file | smalltalk | .st | LexSmalltalk.cxx (Scintilla) |
VHDL | VHSIC Hardware Description Language file | vhdl | .vhd .vhdl | LexVHDL.cxx (Scintilla) |
KiXtart | KiXtart file | kix | .kix | LexKix.cxx (Scintilla) |
AutoIt | AutoIt | autoit | .au3 | LexAU3.cxx (Scintilla) |
CAML | Categorical Abstract Machine Language | caml | .ml .mli .sml .thy | LexCaml.cxx (Scintilla) |
Ada | Ada file | ada | .ada .ads .adb | LexAda.cxx (Scintilla) |
Verilog | Verilog file | verilog | .v .sv .vh .svh | LexVerilog.cxx (Scintilla) |
MATLAB | MATrix LABoratory | matlab | .m | LexMatlab.cxx (Scintilla) |
Haskell | Haskell | haskell | .hs .lhs .las | LexHaskell.cxx (Scintilla) |
Inno Setup | Inno Setup script | inno | .iss | LexInno.cxx (Scintilla) |
Internal Search | Internal Search | searchResult | - | LexSearchResult.cxx |
CMake | CMake file | cmake | .cmake | LexCmake.cxx (Scintilla) |
YAML | YAML Ain't Markup Language | yaml | .yml .yaml | LexYAML.cxx (Scintilla) |
COBOL | COmmon Business Oriented Language | cobol | .cbl .cbd .cdb .cdc .cob .cpy .copy .lst | LexCOBOL.cxx (Scintilla) |
Gui4Cli | Gui4Cli file | gui4cli | - | LexGui4Cli.cxx (Scintilla) |
D | D programming language | d | .d | LexD.cxx (Scintilla) |
PowerShell | Windows PowerShell | powershell | .ps1 .psm1 | LexPowerShell.cxx (Scintilla) |
R | R programming language | r | .r .s .splus | LexR.cxx (Scintilla) |
JSP | JavaServer Pages script file | jsp | .jsp | LexHTML.cxx (Scintilla) |
CoffeeScript | CoffeeScript file | coffeescript | .coffee .litcoffee | LexCoffeeScript.cxx (Scintilla) |
json | JSON file | json | .json | LexJSON.cxx (Scintilla) |
JavaScript | JavaScript file | javascript.js | .js .jsm .jsx .ts .tsx | LexCPP.cxx (Scintilla) |
Fortran fixed form | Fortran fixed form source file | fortran77 | .f77 | LexFortran.cxx (Scintilla) |
BaanC | BaanC File | baanc | .bc .cln | LexBaan.cxx (Scintilla) |
S-Record | Motorola S-Record binary data | srec | .mot .srec | LexHex.cxx (Scintilla) |
Intel HEX | Intel HEX binary data | ihex | .hex | LexHex.cxx (Scintilla) |
Tektronix extended HEX | Tektronix extended HEX binary data | tehex | .tek | LexHex.cxx (Scintilla) |
Swift | Swift file | swift | .swift | LexCPP.cxx (Scintilla) |
ASN.1 | Abstract Syntax Notation One file | asn1 | .mib | LexAsn1.cxx (Scintilla) |
AviSynth | AviSynth scripts files | avs | .avs .avsi | LexAVS.cxx (Scintilla) |
BlitzBasic | BlitzBasic file | blitzbasic | .bb | LexBasic.cxx (Scintilla) |
PureBasic | PureBasic file | purebasic | .pb | LexBasic.cxx (Scintilla) |
FreeBasic | FreeBasic file | freebasic | .bas .bi | LexBasic.cxx (Scintilla) |
Csound | Csound file | csound | .orc .sco .csd | LexCsound.cxx (Scintilla) |
Erlang | Erlang file | erlang | .rl .hrl | LexErlang.cxx (Scintilla) |
ESCRIPT | ESCRIPT file | escript | .src .em | LexEScript.cxx (Scintilla) |
Forth | Forth file | forth | .forth | LexForth.cxx (Scintilla) |
LaTeX | LaTeX file | latex | .tex .sty | LexLaTeX.cxx (Scintilla) |
MMIXAL | MMIXAL file | mmixal | .mms | LexMMIXAL.cxx (Scintilla) |
Nimrod | Nimrod file | nimrod | .nim | LexNimrod.cxx (Scintilla) |
Nncrontab | extended crontab file | nncrontab | .tab .spf | LexCrontab.cxx (Scintilla) |
OScript | OScript source file | oscript | .osx | LexOScript.cxx (Scintilla) |
REBOL | REBOL file | rebol | .r2 .r3 .reb | LexRebol.cxx (Scintilla) |
registry | registry file | registry | .reg | LexRegistry.cxx (Scintilla) |
Rust | Rust file | rust | .rs | LexRust.cxx (Scintilla) |
Spice | spice file | spice | .scp .out | LexSpice.cxx (Scintilla) |
txt2tags | txt2tags file | txt2tags | .t2t | LexTxt2tags.cxx (Scintilla) |
Visual Prolog | Visual Prolog file | visualprolog | .pro .cl .i .pack .ph | LexVisualProlog.cxx (Scintilla) |
External | External | ext | - | 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):
LexA68k.cxx
(Scintilla)
LexAPDL.cxx
(Scintilla)
LexASY.cxx
(Scintilla)
LexAVE.cxx
(Scintilla)
LexAbaqus.cxx
(Scintilla)
LexBibTeX.cxx
(Scintilla)
LexBullant.cxx
(Scintilla)
LexCIL.cxx
(Scintilla)
LexCLW.cxx
(Scintilla)
LexConf.cxx
(Scintilla)
LexDMAP.cxx
(Scintilla)
LexDMIS.cxx
(Scintilla)
LexDataflex.cxx
(Scintilla)
LexECL.cxx
(Scintilla)
LexEDIFACT.cxx
(Scintilla)
LexEiffel.cxx
(Scintilla)
LexErrorList.cxx
(Scintilla)
LexFlagship.cxx
(Scintilla)
LexGAP.cxx
(Scintilla)
LexIndent.cxx
(Scintilla)
LexKVIrc.cxx
(Scintilla)
LexLout.cxx
(Scintilla)
LexMPT.cxx
(Scintilla)
LexMSSQL.cxx
(Scintilla)
LexMagik.cxx
(Scintilla)
LexMarkdown.cxx
(Scintilla)
LexMaxima.cxx
(Scintilla)
LexMetapost.cxx
(Scintilla)
LexModula.cxx
(Scintilla)
LexMySQL.cxx
(Scintilla)
LexObjC.cxx
(Scintilla)
LexOpal.cxx
(Scintilla)
LexPB.cxx
(Scintilla)
LexPLM.cxx
(Scintilla)
LexPOV.cxx
(Scintilla)
LexPowerPro.cxx
(Scintilla)
LexProgress.cxx
(Scintilla)
LexSAS.cxx
(Scintilla)
LexSML.cxx
(Scintilla)
LexSTTXT.cxx
(Scintilla)
LexScriptol.cxx
(Scintilla)
LexSorcus.cxx
(Scintilla)
LexSpecman.cxx
(Scintilla)
LexStata.cxx
(Scintilla)
LexTACL.cxx
(Scintilla)
LexTADS3.cxx
(Scintilla)
LexTAL.cxx
(Scintilla)
LexTCMD.cxx
(Scintilla)
LexX12.cxx
(Scintilla)
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++:
- "Scintilla / Bugs / #341 No CSS highlighting inside HTML file"
- "CSS and Javascript in HTML files"
- "Multiple (highlight) languages in one file ((PHP +) HTML + CSS + JS)"
- "Different language syntax highlighting within same file"
- "How to display CSS style on a PHP page?"
- "Highlight CSS codes in PHP files in Notepad++"
- "Is there anyway to have Notepad++ highlight both PHP and HTML at the same time?"
- "Syntax highlighting of multiline php echo statement in notepad++"
- "Notepad++ syntax highlight of embedded SQL in PHP files"
- "Python - combining syntax highlighting in notepad++"
- "Is there a way to have multiple languages in a single file?"
- "Extending language definitions (for code highlighting) in notepad++"
- "Assign Language by Line"
- "Autocomplete on multiple languages combined in a single file?"
- "How can I add autocomplete in notepad++ for javascript in an .html file? (stackoverflow)"
- "How can I add autocomplete in notepad++ for javascript in an .html file? (superuser)"