Como configuro o emacs para editar arquivos HTML que contêm Javascript?

94

Eu comecei os primeiros passos dolorosos de usar emacs para editar um arquivo HTML com tags HTML e conteúdo javascript. Instalei o nxhtml e tentei usá-lo - ou seja, configurei o modo nxhtml-mumamo-mode para arquivos .html. Mas eu não estou amando isso. Quando estou editando a parte Javascript do código, os recuos de tabulação não se comportam como na edição de código C / C ++. Ele começa a colocar tabulações dentro da linha e se você tentar clicar em tab no espaço em branco que precede uma linha, ele insere a tabulação em vez de tabular novamente a linha.

Outro aspecto que não gosto é que ele não faz coloração de sintaxe como os modos C / C ++ usuais fazem. Eu prefiro muito mais o comportamento do modo java padrão ao editar arquivos HTML, mas isso não funciona bem com o código HTML. :-(

1) Existe um modo melhor para editar arquivos HTML com partes Javascript?

2) Existe uma maneira de fazer o nxhtml usar o modo java padrão para as partes do javascript?

Saudações,

M

MakeDummy
fonte
Eu uso o modo MMM, que em teoria faz isso, mas é meio ruim, não estou muito feliz com isso. Eu colei muitos lisp em minha configuração do emacswiki, mas realmente não gastei semanas nisso. Eu gostaria que fosse mais simples para aqueles de nós mais interessados ​​em usar o emacs do que configurá-lo.
Nathan
1
Acho que uma solução alternativa é criar dois arquivos e fazer referência ao arquivo javascript com um <script src>. Você pode assistir a ambos com um pouco de C-x 2ou C-x 3e ter um modo para cada um. : - /
Patrick

Respostas:

41

Outra solução é multi-web-mode:

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

que pode ser mais facilmente configurável do que o já mencionado multi-mode.

Você apenas configura seus modos preferidos em seu .emacsarquivo desta forma:

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

Mais sobre os múltiplos modos múltiplos do Emacs (suspiro) aqui:

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

ATUALIZAÇÃO: simplificou as expressões regulares para detectar áreas de JavaScript ou CSS para fazê-las funcionar com HTML5 - sem necessidade de expressões regulares superprecisas e frágeis.

Kai Carver
fonte
Tive problemas para combiná-lo com flymake
juanmirocks
para lidar com mais casos, como html5, agora uso descrições de tag mais simples e mais tolerantes para JavaScript e CSS:(js-mode "<script[^>]*>" "</script>") (css-mode "<style[^>]*>" "</style>")
Kai Carver
32

Eu escrevi o modo principal web-mode.el para este tipo de uso: edição de modelos HTML que incorporam JS, CSS, Java (JSP), PHP. Você pode baixá-lo em http://web-mode.org Web-mode.el faz realce de sintaxe e indentação de acordo com o tipo de bloco. A instalação é simples:

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.html$" . web-mode))
fxbois
fonte
1
o modo web também está disponível como um pacote. Pelo menos da MELPA.
mcginniwa
Tem suporte para play / razor engine!
juanmirocks de
Oi fxbois, por que isso não funciona para mim? Copiei web-mode.el em / use / local / share / emacs / site-lisp / (e removi todos os outros arquivos .el) e segui a seção "Instalar" em web-mode.org (e arquivos .emacs apenas tem essas poucas linhas). Você pode por favor ajudar? Obrigado.
Tony Xu
1
Você poderia carregar o arquivo we-mode.el dentro do emacs e depois do Mx web-mode
fxbois
14

Ótima pergunta. Olha quantos votos favoráveis ​​você conseguiu no primeiro!

Todos têm a mesma experiência que você. Eu também.

Em vez de confiar no nhtml-mode, que exibiu para mim o mesmo tipo de estranheza que você descreveu, procurei outra opção e encontrei multi-mode.el . É uma espécie de esqueleto multi-modo de uso geral. Para usá-lo, você precisa especificar expressões regulares para descrever onde um modo começa e outro termina. Então, você procura <script...>iniciar um bloco de javascript, e <style...>iniciar um bloco de css. Então você conecta seus próprios modos para cada bloco - se você gosta de espresso para javascript, use-o. E assim por diante para as outras regexes que identificam outros blocos.

Na prática, conforme você navega pelo documento, um modo diferente é ativado para cada bloco.

Usei multimodo para produzir um ASP.NET, que me permite editar C #, HTML, CSS e Javascript em um único arquivo, com o realce e a fonte adequados dependendo de onde o cursor está no buffer. Não é perfeito, mas descobri que é uma melhoria significativa nas possibilidades existentes. Na verdade, isso pode ser o que você deseja. Experimente.

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

Cheeso
fonte
Acabei de experimentar o modo aspx. Funcionou muito bem. A única coisa que fiz foi mudar o suporte a javascript do modo expresso para o modo javascript.
MakeDummy de
7

Não é realmente uma boa solução, mas uma solução rápida se você realmente precisa ter javascript em seu html é selecionar a região que contém javascript e usar o comando narrow-to-region( C-x n n) e, em seguida, alternar para o modo javascript de sua preferência. O comando widentraz você de volta, ( C-x n w).

antonj
fonte
0

Parece que você configurou seu nxhtml incorretamente. A única configuração necessária deve ser carregar o autostart.elarquivo, e então tudo deve funcionar em algum nível. nxhtml não é perfeito de forma alguma, mas minhas experiências de usá-lo para html / css / javascript / mako são muito boas, pelo menos para tudo menos para mako. Mas tenho quase certeza de que estraguei tudo com a parte mako.

É assim que inicializo meu 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
fonte