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.xmlrozszerzenia działają dla wszystkich motywów, w argumenciefilepathczy 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
-lmoż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)"
