Как мне настроить emacs для редактирования HTML-файлов, содержащих Javascript?

94

Я начал болезненные первые шаги использования emacs для редактирования HTML-файла с HTML-тегами и содержимым javascript. Я установил nxhtml и попытался его использовать, то есть настроил режим nxhtml-mumamo-mode для файлов .html. Но мне это не нравится. Когда я редактирую часть кода Javascript, отступы табуляции не работают, как при редактировании кода C / C ++. Он начинает помещать табуляторы в строку, и если вы попытаетесь нажать табуляцию в пустом пространстве перед строкой, он вставит табуляцию, а не повторно табулирует строку.

Еще один аспект, который мне не нравится, заключается в том, что он не окрашивает синтаксис, как это делают обычные режимы C / C ++. Я очень предпочитаю поведение java-режима по умолчанию при редактировании файлов HTML, но это не очень хорошо сочетается с кодом HTML. :-(

1) Есть ли лучший режим для редактирования файлов HTML с частями Javascript?

2) Есть ли способ заставить nxhtml использовать java-режим по умолчанию для частей javascript?

С Уважением,

M

MakeDummy
источник
Я использую MMM-режим, который теоретически делает это, но это отстой, я не очень доволен этим. Я вставил много шепелявых в свою конфигурацию из emacswiki, но на самом деле не потратил на это недели. Я бы хотел, чтобы для тех из нас, кто больше интересовался использованием emacs, чем его настройка, было проще.
Натан
1
Я предполагаю, что обходным путем является создание двух файлов и ссылка на файл javascript с расширением <script src>. Вы можете смотреть их оба с небольшим количеством C-x 2или C-x 3и иметь режим для каждого. : - /
Патрик

Ответы:

41

Другое решение multi-web-mode:

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

который может быть более легко настраиваемым, чем уже упомянутый multi-mode.

Вы просто настраиваете предпочтительные режимы в своем .emacsфайле следующим образом:

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

Подробнее о множественных режимах Emacs (вздох) здесь:

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

ОБНОВЛЕНИЕ: упрощены регулярные выражения для обнаружения областей JavaScript или CSS, чтобы заставить их работать с HTML5 - нет необходимости в сверхточных и хрупких регулярных выражениях.

Кай Карвер
источник
У меня были проблемы с совмещением его с flymake
juanmirocks
для обработки большего количества случаев, таких как html5, теперь я использую более простые и понятные описания тегов для JavaScript и CSS:(js-mode "<script[^>]*>" "</script>") (css-mode "<style[^>]*>" "</style>")
Кай Карвер,
32

Я написал основной режим web-mode.el для такого использования: редактирование HTML-шаблонов, которые включают JS, CSS, Java (JSP), PHP. Вы можете скачать его с http://web-mode.org. Web-mode.el выделяет синтаксис и делает отступы в зависимости от типа блока. Установка проста:

(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.html$" . web-mode))
FXBOIS
источник
1
веб-режим также доступен в виде пакета. По крайней мере, от MELPA.
mcginniwa
Имеет поддержку движка play / razor!
juanmirocks
Привет, fxbois, почему у меня это не работает? Я скопировал web-mode.el в / use / local / share / emacs / site-lisp / (и удалил все остальные файлы .el) и следил за разделом «Установить» на web-mode.org (и только файл .emacs есть эти несколько строк). Не могли бы вы помочь? Спасибо.
Тони Сюй
1
Не могли бы вы загрузить файл we-mode.el в emacs и после веб-режима Mx
fxbois
14

Отличный вопрос. Посмотрите, сколько голосов вы получили за свой первый!

У всех такой же опыт, как и у вас. Я тоже.

Вместо того, чтобы полагаться на nhtml-mode, который продемонстрировал для меня такую ​​же странность, как вы описали, я поискал другой вариант и нашел multi-mode.el . Это своего рода многорежимный каркас общего назначения. Чтобы использовать его, вам нужно указать регулярные выражения, чтобы описать, где начинается один режим и заканчивается другой. Итак, вы ищете, <script...>чтобы запустить блок javascript и <style...>запустить блок css. Затем вы подключаете свои собственные режимы для каждого блока - если вам нравится эспрессо для javascript, используйте его. И так далее для других регулярных выражений, которые определяют другие блоки.

На практике, когда вы перемещаетесь по документу, для каждого блока включается свой режим.

Я использовал многорежимный режим для создания ASP.NET, который позволяет мне редактировать C #, HTML, CSS и Javascript в одном файле с правильным выделением и фонированием в зависимости от того, где находится курсор в буфере. Это не идеально, но я обнаружил, что это заметное улучшение существующих возможностей. На самом деле это может быть то, что вы хотите. Попробуйте сами.

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

Чизо
источник
Я только что попробовал aspx-режим. Это сработало отлично. Единственное, что я сделал, это изменил поддержку javascript с экспресс-режима на javascript-режим.
MakeDummy
7

Не совсем хорошее решение, но быстрое исправление, если вам действительно нужен javascript в вашем html, - это выбрать область, содержащую javascript, и использовать команду narrow-to-region( C-x n n), а затем переключиться в предпочтительный режим javascript. Команда widenвозвращает вас ( C-x n w).

Антонж
источник
0

Похоже, вы неправильно настроили свой nxhtml. Единственная необходимая настройка - это загрузка autostart.elфайла, и тогда все должно работать до определенного уровня. nxhtml никоим образом не идеален, но мой опыт использования его для html / css / javascript / mako довольно хорош, по крайней мере, для всего, кроме mako. Но я почти уверен, что напортачил с мако-партией.

Вот как я инициализирую свой 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))
монотукс
источник