Режим Emacs JS для стиля npm - PullRequest
6 голосов
/ 27 мая 2011

Существует ли режим JS для emacs, который в значительной степени совместим со стилем npm ?

Пока что я работаю с модификацией js2-mode с внутренними целевыми функциями, которые были переопределены и заменены на 'tab key = 2 Пробелы'. Но было бы неплохо, чтобы мой редактор мог обрабатывать отступы так:

var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

Как таковой, js2-mode старается правильно делать отступы и циклически переключается между возможными позициями, но, например, «запятая под r» не является одним из вариантов. Конечно, написать приличный код отступа в emacs сложно, и мой elisp не собирается его использовать.

Обратите внимание, что если кто-то знает другой редактор, который бы работал лучше для этого, я мог бы быть открыт для переключения.

Ответы [ 3 ]

5 голосов
/ 03 июня 2011

Большое спасибо предложению Cheeso, вот несколько взломанный комбинированный режим, который обрабатывает отступ для стилей в начале и в конце запятой способом эспрессо, используя отличный анализ и проверку ошибок в js2-mode: https://github.com/thomblake/js-mode

Если возникнут какие-либо проблемы, не стесняйтесь подавать отчеты об ошибках - я собираюсь их исправить.

РЕДАКТИРОВАТЬ: теперь находится в https://github.com/thomblake/js3-mode и называется js3-mode

2 голосов
/ 29 мая 2011

Вы должны взглянуть на улучшенный форк js2-mode , похоже, он способен справляться с отступами немного лучше, чем обычные режимы.

1 голос
/ 27 мая 2011

Emacs 23.2 включает в себя js-mode, переименованный и обновленный Espresso. Я просто сделал "indent-region" для вашего кода с ошибками и получил это:

var o = { foo : 'bar'
          , baz : 'foo'
        }
, p
, q = new Squash( o
                  , { start: 0
                      , limit: 50
                    }
                )

Я думаю, это не совсем то, что вы хотите. Запятые смещены по-другому, чем вам, вероятно, нравится.

(Черт возьми, это ужасно.)


EDIT
Хорошо, я заглянул в js-mode, и отступ, похоже, сделан с помощью js--proper-indentation. Он смотрит на текущую строку, а затем пытается принять решение о том, как сделать отступ.

У него есть куча условий, которые он тестирует, для различных синтаксических паттернов. Я просто проверил строку, начинающуюся с запятой, и получил следующие результаты:

var o = { foo : 'bar'
        , baz : 'foo'
        }
  , p
  , q = new Squash( o
                  , { start: 0
                    , limit: 50
                    }
                  )

Я думаю, что это то, что вы хотите, но это все еще выглядит совершенно сломленным для меня. Во всяком случае, так я это сделал.

Вставить этот cond в верхнюю часть списка для js--proper-indentation:

(defun js--proper-indentation (parse-status)
  "Return the proper indentation for the current line."
  (save-excursion
    (back-to-indentation)
    (cond
          ((looking-at ",")
           (let ((spos
                  (save-excursion
                    (while (looking-back "}[\t\n ]*")
                      (backward-sexp)
                      (if (looking-back ",[\t\n ]*")
                          (re-search-backward ",[\t\n ]*")))

                    (cond
                     ((looking-back "\\(,\\|(\\)[ \t]*\\<\\([^:=\n\t ]+\\)[ \t\n]*")
                      (re-search-backward "\\(,\\|(\\)[ \t]*\\<\\([^:=\n\t ]+\\)[ \t\n]*" (point-min) t)
                      (+ (current-column) 2))

                     ((re-search-backward "\\<\\([^:=\n\t ]+\\)[ \t]*\\(:\\|=\\)" (point-min) t)
                      (current-column))
                     (t 
                      nil)))))
             (if spos
                 (- spos 2)
               (+ js-indent-level js-expr-indent-offset))))
         ....

Обязательно соблюдайте остальные условия в этом defun - я не знаю, что они делают, но они, вероятно, важны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...