2011-05-26 13 views
6

Esiste una modalità JS per emacs che è praticamente compatibile con npm style?Emacs Modalità JS per stile npm

Finora sto lavorando con una modifica di js2-mode con funzionalità di sviluppo native sostituite e sostituite con "chiave di tabulazione = 2 spazi". Ma sarebbe bello avere il mio editore in grado di gestire il rientro in questo modo:

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

Così com'è, js2-mode fa del suo meglio per far rientrare correttamente e cicli tra le possibili posizioni, ma per esempio 'virgola in fila sotto r 'non è una delle opzioni. Ovviamente, scrivere codice decente per indenting in emacs è difficile e il mio elis non è all'altezza.

Si noti che se qualcuno conosce un altro editor che funzionerebbe meglio per questo, potrei essere aperto al passaggio.

risposta

1

Emacs 23.2 include js-mode, che è un Espresso rinominato e ritoccato. Ho appena fatto "trattino-regione" sul vostro codice redunkulous e ottenuto questo:

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

Immagino che non è esattamente quello che vuoi. Le virgole vengono compensate in modo diverso rispetto a quello che probabilmente ti piace.

(Gosh che è brutto.)


EDIT
Ok ho guardato in js-mode e il rientro sembra essere fatto da js--proper-indentation. Esamina la riga corrente e quindi tenta di prendere decisioni su come indentare.

Ha un sacco di condizioni testate, per vari schemi di sintassi. Ho appena messo in un assegno per una riga che inizia con una virgola, ed ho ottenuto questi risultati:

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

Credo che questo sia ciò che si vuole, ma ancora sembra totalmente rotto a me. Comunque è così che l'ho fatto.

Iniettare questo cond in cima alla lista per 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)))) 
     .... 

Assicurarsi di mantenere il resto delle condizioni in quel defun - non so quello che fanno, ma probabilmente the're importante .

Non ho idea se questo è robusto, non l'ho testato tranne per il tuo caso di test. Ma questo dovrebbe iniziare.

+0

Sì, la gente spesso aumentano js2 modalità includendo indentazione da Espresso (js-mode). Ma Espresso ha esattamente il problema che sto cercando di risolvere. –

+0

Ri: EDIT Grazie, è molto utile. Dovrò fare dei test e tornare a questo. –

2

Si dovrebbe dare un'occhiata a the improved js2-mode fork, sembra essere in grado di gestire indentazione un po 'meglio rispetto alle modalità ordinarie.

5

Con molto grazie al suggerimento di Cheeso, ecco una combinazione di modalità un po 'hacked-insieme che gestisce il rientro per gli stili virgola-prima o virgola-ultima nel modo espresso mentre si utilizza l'analisi e il controllo degli errori della modalità js2 : https://github.com/thomblake/js-mode

Se si verificano problemi, non esitare a presentare segnalazioni di errori - ho intenzione di risolverli.

EDIT: ora trovato a https://github.com/thomblake/js3-mode e chiamato JS3-mode