Come configuro emacs per modificare file HTML che contengono Javascript?


94

Ho iniziato i primi dolorosi passaggi dell'utilizzo di emacs per modificare un file HTML con tag HTML e contenuto javascript. Ho installato nxhtml e ho provato a usarlo, ovvero configurato per utilizzare la modalità nxhtml-mumamo per i file .html. Ma non lo amo. Quando modifico la parte Javascript del codice, i rientri di tabulazione non si comportano come fanno quando modifico il codice C / C ++. Inizia mettendo le tabulazioni all'interno della linea e se provi a premere tab nello spazio bianco che precede una linea, inserisce la tabulazione invece di ri-tabificare la linea.

Un altro aspetto che non mi piace è che non fa la colorazione della sintassi come fanno le solite modalità C / C ++. Preferisco di gran lunga il comportamento della modalità java predefinita durante la modifica dei file HTML, ma non funziona bene con il codice HTML. :-(

1) Esiste una modalità migliore per modificare i file HTML con porzioni Javascript?

2) C'è un modo per ottenere nxhtml per utilizzare la modalità java predefinita per le parti javascript?

Saluti,

M


Uso la modalità MMM, che in teoria lo fa, ma è un po 'schifoso, non ne sono molto contento. Ho incollato un sacco di lisp nella mia configurazione da emacswiki ma non ci ho passato settimane. Vorrei che fosse più semplice per quelli di noi più interessati a usare emacs che a configurarlo.
Nathan

1
Immagino che una soluzione alternativa sia la creazione di due file e il riferimento al file javascript con estensione <script src>. Puoi guardarli entrambi con un po 'di C-x 2o C-x 3e avere una modalità per ciascuno. : - /
Patrick

Risposte:


41

Un'altra soluzione è multi-web-mode:

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

che può essere più facilmente configurabile del già citato multi-mode.

Devi solo configurare le tue modalità preferite nel tuo .emacsfile in questo modo:

(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)

Maggiori informazioni sulle molteplici modalità multiple di Emacs (sigh) qui:

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

AGGIORNAMENTO: semplificate le espressioni regolari per rilevare aree JavaScript o CSS per farle funzionare con HTML5, senza bisogno di espressioni regolari estremamente precise e fragili.


Ho avuto problemi combinandolo con flymake
juanmirocks

per gestire più casi, come html5, ora uso descrizioni di tag più semplici e tolleranti per JavaScript e CSS:(js-mode "<script[^>]*>" "</script>") (css-mode "<style[^>]*>" "</style>")
Kai Carver

32

Ho scritto la modalità principale web-mode.el per questo tipo di utilizzo: modifica di modelli HTML che incorporano JS, CSS, Java (JSP), PHP. Puoi scaricarlo su http://web-mode.org Web-mode.el esegue l'evidenziazione della sintassi e l'indentazione in base al tipo di blocco. L'installazione è semplice:

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.html$" . web-mode))

1
la modalità web è disponibile anche come pacchetto. Almeno da MELPA.
mcginniwa

Ha il supporto del motore di riproduzione / rasoio!
juanmirocks

Ciao fxbois, perché non funziona per me? Ho copiato web-mode.el in / use / local / share / emacs / site-lisp / (e ho rimosso tutti gli altri file .el) e ho seguito la sezione "Installa" su web-mode.org (e solo il file .emacs ha quelle poche righe). Puoi per favore aiutare? Grazie.
Tony Xu

1
Potresti caricare il file we-mode.el all'interno di emacs e dopo Mx web-mode
fxbois

14

Ottima domanda. Guarda quanti voti positivi hai ricevuto sul tuo primo!

Tutti hanno la tua stessa esperienza. Anch'io.

Piuttosto che fare affidamento su nhtml-mode che mostrava per me lo stesso tipo di stranezza che hai descritto, ho cercato un'altra opzione e ho trovato multi-mode.el . È una sorta di scheletro multi-modalità generico. Per usarlo, è necessario specificare espressioni regolari per descrivere dove inizia una modalità e dove finisce un'altra. Quindi, cerchi per <script...>avviare un blocco javascript e <style...>per avviare un blocco css. Quindi inserisci le tue modalità per ogni blocco: se ti piace l'espresso per javascript, usalo. E così via per le altre espressioni regolari che identificano altri blocchi.

In pratica, durante la navigazione nel documento, viene abilitata una modalità diversa per ogni blocco.

Ho usato la multi-modalità per produrre un ASP.NET, che mi permette di modificare C #, HTML, CSS e Javascript in un unico file, con l'evidenziazione e la fontificazione appropriate a seconda di dove si trova il cursore nel buffer. Non è perfetto, ma ho trovato che sia un netto miglioramento delle possibilità esistenti. In effetti questo potrebbe essere quello che vuoi. Provalo.

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


Sono appena riuscito a provare la modalità aspx. Ha funzionato benissimo. L'unica cosa che ho fatto è stata cambiare il supporto javascript da modalità espresso a modalità javascript.
MakeDummy

7

Non è proprio una buona soluzione, ma una soluzione rapida se hai davvero bisogno di avere javascript nel tuo html è selezionare la regione contenente javascript e utilizzare il comando narrow-to-region( C-x n n) e quindi passare alla modalità javascript preferita. Il comando widenti riporta indietro, ( C-x n w).


0

Sembra che tu abbia impostato il tuo nxhtml in modo errato. L'unica configurazione necessaria dovrebbe essere il caricamento del autostart.elfile, quindi tutto dovrebbe funzionare a un certo livello. nxhtml non è perfetto in alcun modo, ma la mia esperienza nell'usarlo per html / css / javascript / mako è abbastanza buona, almeno per tutto tranne mako. Ma sono abbastanza sicuro di aver sbagliato con la parte mako.

Ecco come inizializzo il mio 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.