Wie konfiguriere ich Emacs zum Bearbeiten von HTML-Dateien, die Javascript enthalten?

94

Ich habe die schmerzhaften ersten Schritte der Verwendung von Emacs zum Bearbeiten einer HTML-Datei mit HTML-Tags und Javascript-Inhalten begonnen. Ich habe nxhtml installiert und versucht, es zu verwenden - dh so eingerichtet, dass es den nxhtml-mumamo-Modus für HTML-Dateien verwendet. Aber ich liebe es nicht. Wenn ich den Javascript-Teil des Codes bearbeite, verhalten sich die Tabulatoreinzüge nicht so wie beim Bearbeiten von C / C ++ - Code. Es beginnt damit, Tabulatoren in die Zeile einzufügen. Wenn Sie versuchen, die Tabulatortaste im Leerzeichen vor einer Zeile zu drücken, wird die Registerkarte eingefügt, anstatt die Zeile erneut zu tabellieren.

Ein weiterer Aspekt, den ich nicht mag, ist, dass es keine Syntaxfärbung wie die üblichen C / C ++ - Modi ausführt. Ich bevorzuge das Verhalten des Standard-Java-Modus beim Bearbeiten von HTML-Dateien, aber das passt nicht gut zum HTML-Code. :-(

1) Gibt es einen besseren Modus zum Bearbeiten von HTML-Dateien mit Javascript-Teilen?

2) Gibt es eine Möglichkeit, nxhtml dazu zu bringen, den Standard-Java-Modus für die Javascript-Teile zu verwenden?

Grüße,

M.

MakeDummy
quelle
Ich benutze den MMM-Modus, der das theoretisch macht, aber es ist irgendwie blöd, ich bin nicht wirklich so glücklich damit. Ich habe viel Lisp von emacswiki in meine Konfiguration eingefügt, aber nicht wirklich Wochen damit verbracht. Ich wünschte, es wäre einfacher für diejenigen von uns, die mehr an der Verwendung von Emacs interessiert sind als an der Konfiguration.
Nathan
1
Ich denke, eine Problemumgehung besteht darin, zwei Dateien zu erstellen und die Javascript-Datei mit einem zu referenzieren <script src>. Sie können beide mit ein bisschen C-x 2oder sehen C-x 3und für jeden einen Modus haben. : - /
Patrick

Antworten:

41

Eine andere Lösung ist multi-web-mode:

https://github.com/fgallina/multi-web-mode

die möglicherweise einfacher zu konfigurieren ist als die bereits erwähnten multi-mode.

Sie konfigurieren einfach Ihre bevorzugten Modi in Ihrer .emacsDatei wie folgt:

(require 'multi-web-mode)
(setq mweb-default-major-mode 'html-mode)
(setq mweb-tags 
  '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
    (js-mode  "<script[^>]*>" "</script>")
    (css-mode "<style[^>]*>" "</style>")))
(setq mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
(multi-web-global-mode 1)

Mehr zu den verschiedenen Modi von Emacs (Seufzer) hier:

http://www.emacswiki.org/emacs/MultipleModes

UPDATE: Vereinfachte die regulären Ausdrücke, um JavaScript- oder CSS-Bereiche zu erkennen, damit sie mit HTML5 funktionieren - keine superpräzisen und fragilen regulären Ausdrücke erforderlich.

Kai Carver
quelle
Ich hatte Probleme, es mit Flymake
Juanmirocks
Um mehr Fälle wie HTML5 zu behandeln, verwende ich jetzt einfachere und verzeihendere Tag-Beschreibungen für JavaScript und CSS:(js-mode "<script[^>]*>" "</script>") (css-mode "<style[^>]*>" "</style>")
Kai Carver
32

Ich habe den Hauptmodus web-mode.el für diese Art der Verwendung geschrieben: Bearbeiten von HTML-Vorlagen, in die JS, CSS, Java (JSP), PHP eingebettet sind. Sie können es unter http://web-mode.org herunterladen. Web-mode.el führt Syntaxhervorhebungen und Einrückungen entsprechend dem Blocktyp durch. Die Installation ist einfach:

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.html$" . web-mode))
fxbois
quelle
1
Der Web-Modus ist auch als Paket verfügbar. Zumindest von MELPA.
Mcginniwa
Hat Unterstützung für Spiel- / Rasierermotoren!
Juanmirocks
Hallo fxbois, warum funktioniert das bei mir nicht? Ich habe web-mode.el in / use / local / share / emacs / site-lisp / kopiert (und alle anderen .el-Dateien entfernt) und bin dem Abschnitt "Installieren" auf web-mode.org (und nur der .emacs-Datei) gefolgt hat diese wenigen Zeilen). Können Sie bitte helfen? Vielen Dank.
Tony Xu
1
Könnten Sie die Datei we-mode.el in Emacs und nach dem Mx-Web-Modus
laden
14

Gute Frage. Schauen Sie, wie viele Upvotes Sie bei Ihrem ersten erhalten haben!

Jeder hat die gleiche Erfahrung wie Sie. Ich auch.

Anstatt mich auf den nhtml-Modus zu verlassen, der für mich die gleiche Art von Fremdheit aufwies wie Sie beschrieben, suchte ich nach einer anderen Option und fand multi-mode.el . Es ist eine Art Allzweck-Multimode-Skelett. Um es zu verwenden, müssen Sie reguläre Ausdrücke angeben, um zu beschreiben, wo ein Modus beginnt und ein anderer endet. Sie suchen also <script...>nach einem Javascript-Block und <style...>einem CSS-Block. Dann schließen Sie Ihre eigenen Modi für jeden Block an - wenn Sie Espresso für Javascript mögen, verwenden Sie ihn. Und so weiter für die anderen regulären Ausdrücke, die andere Blöcke identifizieren.

In der Praxis wird beim Navigieren durch das Dokument für jeden Block ein anderer Modus aktiviert.

Ich habe Multi-Mode verwendet, um ein ASP.NET zu erstellen, mit dem ich C #, HTML, CSS und Javascript in einer einzigen Datei bearbeiten kann. Die richtige Hervorhebung und Schriftart hängt davon ab, wo sich der Cursor im Puffer befindet. Es ist nicht perfekt, aber ich fand es eine deutliche Verbesserung der bestehenden Möglichkeiten. In der Tat kann dies sein, was Sie wollen. Versuch es.

https://code.google.com/p/csharpmode/source/browse/trunk/aspx-mode.el?r=14

Cheeso
quelle
Ich habe gerade den Aspx-Modus ausprobiert. Es hat super funktioniert. Ich habe nur die Javascript-Unterstützung vom Expresso-Modus in den Javascript-Modus geändert.
MakeDummy
7

Keine wirklich gute Lösung, aber eine schnelle Lösung, wenn Sie wirklich Javascript in Ihrem HTML benötigen, besteht darin, die Region auszuwählen, die Javascript enthält, und den Befehl narrow-to-region( C-x n n) zu verwenden und dann in Ihren bevorzugten Javascript-Modus zu wechseln. Der Befehl widenbringt Sie zurück, ( C-x n w).

antonj
quelle
0

Es hört sich so an, als hätten Sie Ihr nxhtml falsch eingerichtet. Das einzige Setup, das erforderlich ist, sollte das Laden der autostart.elDatei sein, und dann sollte alles bis zu einem gewissen Grad funktionieren. nxhtml ist in keiner Weise perfekt, aber meine Erfahrungen mit der Verwendung für html / css / javascript / mako sind ziemlich gut, zumindest für alles außer mako. Aber ich bin mir ziemlich sicher, dass ich den Mako-Teil vermasselt habe.

So initialisiere ich mein nxhtml:

(when (load "autostart.el" t)
  (setq nxhtml-skip-welcome t
        mumamo-chunk-coloring 'submode-colored
        indent-region-mode t
        rng-nxml-auto-validate-flag nil))
Monotux
quelle