コードをきれいにフォーマットする方法(改行の自動挿入、インデントなど)


24

私は使用してspacemacsいますが、おそらくここで必要なのはemacsの知識です。

単一の長い行を持つJSONファイルがあります。json.org/ exampleからのこのJSONを例にとります。

{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}

emacsでこれを再インデントしたいと思います。つまり、行の左端の文字を適切なインデントレベルに変更せずに、行をいくつかの行に分割します。

spacemacs/indent-region-or-bufferSPC j =)を使用すると、テキストはまったく変更されません。

emacsにこの長い行を実際に中断して、このような何かを得るために再インデントするように依頼するにはどうすればよいでしょうか。

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

JSON固有の回答には興味がありません。たとえば、intelliJは、サポートしているすべての言語(java、json ...)に対してそれを行うと考えています。どんな言語のemacsにもメジャーモードがある、または最も人気のあるものについて言えば、それは達成可能だと思います。

編集私はM-x json-reformat-region、それがspacemacs出荷されて動作することを発見しましたが、はい、すべての言語で、メジャーモードに基づいて常に同じショートカットでそれが欲しいです...

EDIT2わかりましたので、私の結論は、それはさまざまな言語、少なくともJSONとLisp、おそらく他の言語に実装されており、さらに簡単になります(XML / XHTML、go-fmtを持ち、clangも使用しています)。ただし、すべての言語でそれを行う汎用関数名はありません。ここにspacemacsは、さまざまな言語のレイヤーで実装するスペースがあります...しかし、X / HTMLの実装は見つかりませんでした。


3
HTML / JS / CSSの場合:web-beautiful.el。これは私が見つけた最高のものですが、node.jsに依存します。
ナニー

回答:


10

fill-regionインデントよりも関数が必要なようです。

  • その行を選択して実行しますM-x fill-region
  • 同じものを選択し、複数の行に分割してくださいM-x indent-region

ただし、これは、例に示すように正確なポイントに新しい行を挿入しません。単純に線が塗りつぶし列に収まるようにします。


1
まあ、それは何かです。とにかく、私が望んでいたものは達成できなかったかもしれません。誰かがよりスマートで積極的なインデントのための魔法の解決策を持っている場合、私はもう少し待つでしょう...他に何も起こらなければ、これを答えとしてマークします。
エマニュエルトーザリー

@EmmanuelTouzery改行を挿入するための規則が一貫している限り、ほとんど何も望みなく達成できます。フォーマットされた結果のあなたの例では、私はあなたが後に改行を持っていないことを確認{{"menu":いますが、次々なければならないの{では{"id":。私はJSONを知らないので、あなたのフォーマットされた答えはおそらく私が見逃しているパターンを持っています。しかし、その新しい行を挿入するための一連のルールで質問を更新できる場合、誰かがあなたが望む答えを思いつくことができます。
カウシャルモディ

言語固有のルールを含め、どの言語にも存在するはずだと思いました。たとえば、javaの最初の行の{、C#の次の行では、などと言います。
エマニュエルトーザリー

(言い換えれば、gofmtどの言語でも似たようなものです)-gofmt.com
Emmanuel Touzery

19

json.elパッケージが提供しますjson-pretty-print-buffer。これはあなたの例のために生成するものです:

{
  "menu": {
    "popup": {
      "menuitem": [
        {
          "onclick": "CreateNewDoc()",
          "value": "New"
        },
        {
          "onclick": "OpenDoc()",
          "value": "Open"
        },
        {
          "onclick": "CloseDoc()",
          "value": "Close"
        }
      ]
    },
    "value": "File",
    "id": "file"
  }
}

私にはかなりまともなようです。


2
はい、実際にはgithub.com/gongo/json-reformatで、「emacs 24.4からjson-pretty-printjson-pretty-print-buffer(と同様の仕様json-reformat-region)がバンドルされていました。」しかし、emacsには(すべての主要なメジャーモード言語に固有の)すべての言語で機能する機能が備わっていると思いましたが、実際には機能しません。
エマニュエルトーザリー

これが正解です
ジョー・ヘイミング

6

ここのヒントによると、外部コマンドを使用して、Jsonファイル内の領域をフォーマットできます。

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (region-beginning)
                             (region-end)
                             "python -m json.tool"
                             (buffer-name)
                             t)))

簡単に拡張して、バッファ全体をフォーマットできます。

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (point-min)
                             (point-max)
                             "python -m json.tool"
                             (buffer-name) t))) 

Emacsには、プログラミング言語用のフォーマットツール(Lispを除く)はなく、インデントコマンドのみがあります。


1
出荷されて動作するM-x json-reformat-regionことを発見しましたspacemacsが、はい、メジャーモードに基づいて、すべての言語で常に同じショートカットを使用したいと思います...これはサポートされていないようです、残念です...
Emmanuel Touzery

1
言語を適切にフォーマットするには、実際の言語パーサーが必要です。Emacsには一部の言語用の組み込み言語パーサーがありますが、上記のデモへのリンクとして、組み込みLispパーサーのみがコードの再フォーマットに最近使用されています。外部フォーマッターが存在する場合、Emacs ieと簡単に統合できclang-formatます。
火ドゥ

2

この特定のシナリオでjson-pretty-printは、強調表示されたjsonの塊をきれいにします。


1

ところで、SMIEをインデントエンジンとして使用するメジャーモードの場合、auto-fill-modeサポートの形で必要なものの一部があります。私は良い仕事をすると思うfill-paragraphか、またはしfill-regionませんが、コードを単一の行に配置し、その行の最後に移動すると、M-: (smie-auto-fill)健全な結果が得られるはずです(おそらく、長いストレッチで完璧ではありません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.