6

npm スタイルとほぼ互換性のある emacs 用の JS モードはありますか?

これまでのところ、ネイティブの意図した機能をオーバーライドして「タブ キー = 2 スペース」に置き換えたjs2-modeの変更に取り組んでいます。しかし、エディタで次のようにインデントを処理できると便利です。

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

現状では、js2-mode は正しくインデントするために最善を尽くし、可能な位置を循環しますが、たとえば「r の下にカンマを並べる」というオプションはありません。もちろん、emacs でまともなインデント コードを書くのは難しく、私の elisp はそこまでは行き届いていません。

これに適した別のエディターを誰かが知っている場合は、切り替えても構わないことに注意してください。

4

3 に答える 3

5

Cheeso の提案のおかげで、js2-mode の優れた解析とエラー チェックを使用しながら、espresso の方法でコンマが最初または最後にコンマ スタイルのインデントを処理する、ややハッキングされたモード コンボがあります: https:/ /github.com/thomblake/js-mode

問題が発生した場合は、お気軽にバグ レポートを提出してください。修正するつもりです。

編集: https://github.com/thomblake/js3-modeで見つかり、js3-mode と呼ばれるようになりました

于 2011-06-02T21:20:41.250 に答える
2

改善された js2-mode forkを見てください。通常のモードよりもインデントを少しうまく処理できるようです。

于 2011-05-28T23:18:04.283 に答える
1

Emacs 23.2にはjs-modeが含まれています。これは、名前が変更され、修正されたEspressoです。私はあなたの冗長なコードで「インデント領域」を実行し、これを取得しました:

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

私はそれがあなたが望んでいるものではないと思います。カンマは、おそらくお好みとは異なる方法でオフセットされます。

(それは醜いです。)


編集
OK私はjs-modeを調べましたが、インデントはによって行われているようjs--proper-indentationです。現在の行を見て、インデントする方法を決定しようとします。

さまざまな構文パターンについて、テストする一連の条件があります。カンマで始まる行をチェックすると、次の結果が得られます。

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

それはあなたが望むものだと思いますが、それでも私には完全に壊れているように見えます。とにかく、これは私がそれをした方法です。

この条件をリストの一番上に挿入します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))))
         ....

残りの条件は、その楽しい状態に保つようにしてください。それらが何をするのかはわかりませんが、おそらく重要です。

これが堅牢かどうかはわかりません。1つのテストケースを除いて、テストしていません。しかし、このはずがあなたを始めさせます。

于 2011-05-27T04:13:38.490 に答える