2011-05-26 15 views
6

¿Hay un modo JS para emacs que sea bastante compatible con npm style?Modo Emacs JS para el estilo npm

Hasta el momento estoy trabajando con una modificación de js2-mode con funciones nativas con intención anuladas y reemplazadas por 'tab key = 2 spaces'. Pero sería bueno tener mi editor sea capaz de manejar sangría así:

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

Como es, js2 modo hace su mayor esfuerzo para sangrar correctamente y ciclos entre las posiciones posibles, pero por ejemplo 'comas se alinearon debajo de r 'no es una de las opciones. Por supuesto, escribir código de sangría decente en emacs es difícil y mi elisp no está hasta el final.

Tenga en cuenta que si alguien conoce otro editor que funcionaría mejor para esto, podría estar dispuesto a cambiar.

Respuesta

1

Emacs 23.2 incluye js-mode, que es un Espresso renombrado y retocado. Sólo hice "guión-región" en su código redunkulous y obtuve esto:

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

supongo que no es exactamente lo que quiere. Las comas se compensan de forma diferente a lo que probablemente te gusta.

(Gosh eso es feo.)


EDITAR
Ok Miré en js-mode y la sangría parece estar hecho por js--proper-indentation. Mira la línea actual y luego trata de tomar decisiones sobre cómo sangrar.

Tiene un montón de condiciones que prueba, para varios patrones de sintaxis. Acabo de poner un cheque por una línea que comienza con una coma, y ​​dieron los siguientes resultados:

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

Creo que eso es lo que quiere, pero todavía se ve totalmente roto a mí. De todos modos, así es como lo hice.

inyectar este cond en la parte superior de la lista para 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)))) 
     .... 

Asegúrese de mantener el resto de las condiciones en las que defun - No sé lo que hacen, pero probablemente es importante the're .

No tengo idea de si esto es robusto, no lo he probado, excepto por su caso de prueba. Pero esto debería ayudarte a empezar.

+0

Sí, la gente a menudo aumentan js2 modo mediante la inclusión de sangría desde Espresso (JS-mode). Pero Espresso tiene exactamente el problema que intento resolver. –

+0

Re: EDITAR Gracias, eso es muy útil. Tendré que hacer algunas pruebas y volver a esto. –

5

Con mucho agradecimiento a la sugerencia de Cheeso, este es un combo de modo algo pirateado que maneja sangría para estilos coma-primero o coma-último en el modo espresso mientras usa el gran análisis y verificación de errores de js2-mode : https://github.com/thomblake/js-mode

Si encuentra algún problema, siéntase libre de presentar informes de errores: pretendo solucionarlos.

EDIT: ahora encontrar en https://github.com/thomblake/js3-mode y llamó js3 modo