
(Ihre Lieblingsprinzessin jetzt in EMACs!)
ELSA ist ein Tool, das Ihren Code analysiert, ohne ihn zu laden oder auszuführen. Es ist 100% freie Effektfreiheit und wir bemühen uns, es so zu halten, sodass Sie jeden ELISP-Code von überall sicher von überall analysieren können.
ELSA fügt ein leistungsstarkes Typsystem über EMACS LISP (vollständig optional) hinzu. In können Typen verfolgen und hilfreiche Hinweise geben, wenn die Dinge nicht übereinstimmen, bevor Sie überhaupt versuchen, den Code auszuführen.
Inhaltsverzeichnis
Dynamische Programmiersprachen wie EMACS Lisp, JavaScript und Python haben viele Vorteile gegenüber statisch typisierten Sprachen wie Java oder C ++. Sie ermöglichen aufgrund ihrer dynamischen Natur eine schnellere Entwicklung und Prototypierung, was es einfacher macht, Code zu schreiben und zu testen.
Dynamische Sprachen fehlen jedoch die Typ -Überprüfungs- und Sicherheitsfunktionen, die statisch getippte Sprachen bieten. Dies kann zu Fehlern führen, die während der Entwicklung schwer zu fangen sind und Probleme in der Produktion verursachen können. Durch Hinzufügen eines Typsystems über eine dynamische Sprache können wir die Vorteile sowohl dynamischer als auch statischer Sprachen genießen.
ELSA ist ein Typsystem und ein Analysator für EMACS LISP, das darauf abzielt, die Vorteile eines Typsystems zu bieten und gleichzeitig die Flexibilität und Ausdruckskraft von Lisp zu erhalten. Es ähnelt dem TypeScript für JavaScript- oder Python -Typ -Tipps für Python, da es eine Möglichkeit bietet, einer dynamisch getippten Sprache eine statische Überprüfung des Typs hinzuzufügen.
ELSA versucht idiomatisch zu sein und so viele verfügbare Informationen wie möglich zu verwenden, wie z.
Wir befinden uns derzeit in einer Beta -Phase. API, das Typsystem und Anmerkungen sind ziemlich stabil. Wir unterstützen mehrere Möglichkeiten, den Analysator zu installieren und auszuführen.
In Elsa fehlen viele Typanmerkungen für integrierte Funktionen (es gibt ungefähr 1500 davon) und Variablen. Die Analyseergebnisse sind daher immer noch suboptimal.
Die Dinge könnten immer noch zu irgendeinem Zeitpunkt brechen.
Hier kommt eine nicht exexhustive Liste einiger interessanter Funktionen.
Die Fehlerhelfer in den Screenshots werden von Elsa Flycheck Extension bereitgestellt.
Alles, was Sie hier sehen, funktioniert tatsächlich, das ist nicht nur für die Show!


















downcase kann eine Zeichenfolge aufnehmen und eine Zeichenfolge zurückgeben oder einen int nehmen und einen int zurückgeben. Da wir eine String -Variable s übergeben, können wir, welche Überlastung der Funktion verwendet werden muss, und den Rückgabetyp der Funktion als string anstelle von (or string int) ableiten.

Wenn wir eine Eingabe übergeben, die keine Überladung entspricht, zeigt ELSA einen hilfreichen Bericht darüber, welche Überladungen verfügbar sind und welches Argument nicht übereinstimmt.

ELSA kann mit Eask, Fass, Makem.sh oder Emake betrieben werden. Bevor Sie eine Analyse durchführen können, finden Sie im Abschnitt Konfiguration zum Konfigurieren des Projekts.
Das ELSA -Projekt unterstützt die Methoden EASK, CASK und LSP. Für Makem.SH und Emake Support wenden Sie sich direkt an die Autoren dieser Pakete.
Wenn Sie Eask oder Cask verwenden, können Sie Flycheck- und Flymake -Integrationen verwenden (siehe unten).
Darüber hinaus implementiert ELSA auch Sprachserverprotokoll (LSP) und kann mit LSP-Modus verwendet werden. Dies ist die beste Option, da der gesamte Status auf dem Server zwischengespeichert wird und alle Vorgänge sehr schnell sind. LSP enthält außerdem Funktionen von ELSA, die sonst nicht verfügbar sind, z. B. Fertigstellung (über lsp-completion-mode ) oder kontextbezogene Schwebentypinformationen.
Die folgende Tabelle fasst die Optionen zusammen:
| Besonderheit | Eask | Fass | Makem.sh | Emake |
|---|---|---|---|---|
| Eigenständige Analyse aus CLI | ✓ | ✓ | ✓ | ✓ |
| Flycheck -Integration | ✓ | ✓ | ⨯ | ⨯ |
| Flymake -Integration | ✓ | ⨯ | ⨯ | ⨯ |
| Sprachserverprotokoll (LSP) | ✓ | ✓ | ⨯ | ⨯ |
Hinweis: Wenn Sie Elsa zum ersten Mal in einem Projekt ausführen, wird empfohlen, sie aus der CLI zu starten, da alle Abhängigkeiten, die Sie verwenden, kriechen und die Analyseergebnisse in Cache -Dateien speichern müssen. Dies kann ein paar Minuten dauern, wenn Sie viele Abhängigkeiten haben (oder wenn Sie so etwas wie org enthalten, das etwa 300 andere Pakete einzieht).
Nachdem die Ergebnisse zwischengespeichert sind, kann ELSA das nächste Mal vom Cache geladen werden, und dies ist im Allgemeinen sehr schnell.
Sie können den LSP sofort starten, aber er reagiert während der Zeit, in der es sich um die erste Analyse handelt.
lint )Der einfachste Weg, Elsa mit Eask auszuführen:
eask lint elsa [PATTERNS]
[PATTERNS] ist optional; Die Standardeinstellung findet alle Ihre Paketdateien ab.
exec )Diese Methode verwendet EASK und installiert ELSA von Melpa.
(depends-on "elsa") in Eask Datei Ihres Projekts hinzu.eask install-deps aus.eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] um die Datei zu analysieren.exec ) Um die Entwicklungsversion von ELSA zu verwenden, können Sie das Repository klonen und die eask link -Funktion verwenden, um den Code aus dem Klon zu verwenden.
git clone https://github.com/emacs-elsa/Elsa.git irgendwo zu Ihrem Computer.(depends-on "elsa") in Eask Datei Ihres Projekts hinzu.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] um die Datei zu analysieren. Diese Methode verwendet Cack und installiert ELSA von Melpa.
(depends-on "elsa") in Cask Datei Ihres Projekts hinzu.cask install ausführen.cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] um die Datei zu analysieren. Um die Entwicklungsversion von ELSA zu verwenden, können Sie das Repository klonen und die cask link -Funktion verwenden, um den Code aus dem Klon zu verwenden.
git clone https://github.com/emacs-elsa/Elsa.git irgendwo zu Ihrem Computer.(depends-on "elsa") in Cask Datei Ihres Projekts hinzu.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] um die Datei zu analysieren. Die LSP -Implementierung von ELSA ist derzeit in Arbeit, aber der Server ist stabil genug, dass es nützlich ist, sie zu haben. Es macht die Linie sehr schnell, da der gesamte Zustand in der Serverinstanz zwischengespeichert wird und wir den gesamten Cache nicht sehr von Grund auf neu lesen müssen (wie beim Durchlaufen von Flycheck oder FlyMake).
ELSA unterstützt derzeit LSP-Modus, ist jedoch noch nicht in LSP-Modus selbst integriert, da es (ELSA LSP) nicht stabil genug ist. Um ELSA LSP, Run (elsa-lsp-register) oder Mx elsa-lsp-register zu verwenden, um den Client mit lsp-mode zu registrieren. Danach startet die Verwendung von Mx lsp in einem ELISP -Puffer einen Arbeitsbereich.
Derzeit werden diese LSP -Funktionen unterstützt
| Fähigkeit | Implementiert |
|---|---|
| HoverProvider | Bietet kontextbezogene Anmerkungen von Formularen unter Punkt |
| textDocumentsync | openclose, sparen |
| Abschlussprovider |
|
Führen Sie diesen Befehl einfach mit makem.sh aus dem Project Root -Verzeichnis aus, in dem ELSA in einer temporären Sandkasten installiert und ausgeführt wird:
./makem.sh --sandbox lint-elsa
Verwenden Sie ein nicht-zeitlichem Sandbox-Verzeichnis mit dem Namen .sandbox und vermeiden Sie es, ELSA auf jedem Lauf zu installieren:
./makem.sh -s.sandbox --install-deps --install-linters ../makem.sh -s.sandbox lint-elsa . Weitere Informationen finden Sie unter makem.sh Dokumentation.
Wenn Sie Emake bereits installiert haben, make lint-elsa . Möglicherweise müssen Sie eine aktuelle Version über EMAKE_SHA1 aktualisieren.
Ansonsten installieren Sie Emake über die üblichen Mittel:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) Dieses Skript fordert Sie für den Namen Ihres Pakets auf und startet sie anschließend. Sie können jetzt Elsas Schecks mit make lint-elsa durchführen.
Wenn Sie Flycheck verwenden, können Sie das Flycheck-Elsa-Paket verwenden, das ELSA in Flycheck integriert.
Für FlyMake können Sie FlyMake-Elsa verwenden.
Im Moment unterstützt ELSA nur sehr wenig Konfiguration. Um Ihr Projekt "Elsa-Enable" zu erhalten, müssen Sie der Wurzel Ihres Projekts eine Elsafile.el hinzufügen.
ELSA hat ein Konzept von Erweiterungen und Regeln, die derzeit hauptsächlich intern existieren und in einen großen "Standard" -Regeln und -Einweiterung eingewickelt sind. Dieses System arbeitet noch in Arbeit.
Das Folgende sind einige Möglichkeiten, wie Sie ELSA heute erweitern können.
Eine Möglichkeit, die ELSA zu erweitern, besteht darin, spezielle Analyseregeln für mehr Formen und Funktionen bereitzustellen, bei denen wir das Wissen darüber ausnutzen können, wie sich die Funktion verhält, um die Analyse mehr einzugrenzen.
Zum Beispiel können wir sagen, dass der Rückgabewert immer nil ist, wenn die Eingabe von not t ist. Dies codiert unser Domänenwissen in Form einer Analyseregel.
Alle Regeln werden in Form von Erweiterungen hinzugefügt. ELSA verfügt über nur wenige Kernerweiterungen für die meisten integrierten Funktionen wie List-Manipulation ( car , nth ...), Prädikate ( stringp , atomp ...), logische Funktionen ( not , ...) und so weiter. Diese werden automatisch geladen, da die Funktionen so üblich sind, dass praktisch jedes Projekt sie verwenden wird.
Für beliebte externe Pakete wie Dash.EL werden zusätzliche Erweiterungen bereitgestellt. Um sie zu verwenden, fügen Sie Ihr Elsafile.el hinzu register-extensions
(register-extensions
dash
; ; more extensions here
) Die Erweiterungen werden automatisch beladen, wenn ELSA auf ein Forderungsformular stößt. Für eine (require 'foo) wird es nach elsa-extension-foo.el suchen und versucht es zu laden. Dies bedeutet, dass Sie in der Praxis niemals Erweiterungen für die meisten Pakete der Drittanbieter registrieren müssen.
Nach der Analyse der Formulare haben wir alle Typinformationen und das AST bereit, durch verschiedene Überprüfungen und Regeln weiter verarbeitet zu werden.
Diese können (nicht exexhustive Liste) sein:
lisp-case zum Benennen anstelle von snake_case verwendet.if mit einem nutzlosen progn nicht ein.if nicht immer auf non-nil bewertet wird (in diesem Fall ist das if Formular nutzlos).ELSA bietet einige integrierte Regeln und mehr kann auch durch Laden von Erweiterungen verwendet werden.
Um einen Regeln zu registrieren, fügen Sie Elsafile.el das folgende Formular hinzu
(register-ruleset
dead-code
style
; ; more rulesets here
)In ELISP sind Benutzer nicht erforderlich, um ihren Code Typanmerkungen anzugeben. Während an vielen Stellen die Typen abgeleitet werden können, gibt es Orte, insbesondere in benutzerdefinierten Funktionen, an denen wir den richtigen Typ nicht erraten können (wir können nur schließen, was wir während der Laufzeit sehen).
Lesen Sie die Dokumentation der Typ -Anmerkungen, um weitere Informationen zum Schreiben Ihrer eigenen Typen zu erhalten.
Öffnen Sie ein Problem, wenn Sie an etwas arbeiten möchten (nicht unbedingt unten in der Roadmap aufgeführt), damit wir die Arbeit nicht duplizieren. Oder geben Sie uns einfach Feedback oder hilfreiche Tipps.
Sie können Typdefinitionen für integrierte Funktionen bereitstellen, indem Sie elsa-typed-builtin.el erweitern. Es gibt viel zu gehen. Einige der Typen, die notwendig sind, um das auszudrücken, was wir wollen, gibt es möglicherweise noch nicht vor, oder eröffnen ein Problem, damit wir diskutieren können, wie Dinge modelliert werden können.
Siehe die Diskussion.
Nach dem Aufrufen (require 'elsa-font-lock) gibt es eine Funktion elsa-setup-font-lock , die von emacs-lisp-mode-hook aufgerufen werden kann, um zusätzliche Schriftart für ELSA-Typen einzurichten.
Die größte Inspiration war das Phpstan -Projekt, das mir den ersten Anstoß für das Start dieses Projekts lieferte. Ich habe ihre Quellen oft durchgesehen, um Inspiration zu finden und Features auszuwählen.
Die zweite Inspiration ist TypeScript, die eine ziemlich uninteressante Sprache in ein Kraftpaket des (nicht nur) Webs verwandelte.
Ich leihe mich stark von beiden Projekten aus und erweitere meine Dankbarkeit und Bewunderung.