Kodu nasıl biçimlendirebilirsiniz (yeni satırları otomatik olarak girin, girinti, vb.)?


24

Ben kullanıyorum spacemacsburada gerekli oluyor ama muhtemelen 's emacs bilgi.

Tek bir uzun satırlı bir JSON dosyasına sahibim, diyelim ki bu JSON'a json.org/example adresinden:

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

Emacs'ın bunu tekrar göndermesini istiyorum, bu da benim satırın en soldaki karakterini uygun girinti seviyesine değiştirmemek, hatta çizgiyi birkaç satırda kesmek anlamına geliyor.

Ben kullanırsanız spacemacs/indent-region-or-buffer( SPC j =) sonra metin hiç değişmez.

Emacs'tan aslında bu uzun çizgiyi kırmasını ve bunun gibi bir şeyi elde etmeyi tekrar istemesini nasıl isteyebilirim:

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

JSON'a özgü bir cevapla ilgilenmiyorum, örneğin intelliJ'in desteklediği herhangi bir dil için (java, json ...) yaptığına inanıyorum. Herhangi bir dil emak için önemli bir modu vardır, ya da en popüler olanları diyelim.

DÜZENLEME keşfettiğim M-x json-reformat-regionbu spacemacsbüyük moduna göre, herhangi bir dil için ve her zaman aynı kısayol o ve çalışmalarla gemileri, ama evet, istiyorum ...

EDIT2 Tamam, yani benim sonucum, çeşitli diller için uygulandığı, en azından JSON ve en azından muhtemelen muhtemelen başkalarının kullandığı ve daha fazlası için kolay olduğu (XML / XHTML, go-fmt olan ve clang kullanan). Ancak, tüm diller için yapacak genel bir fonksiyon adı yoktur. Burada spacemacsçeşitli diller için katmanlar halinde uygulamak için bir boşluk var ... Yine de beni şaşırtan bir X / HTML uygulaması bulamadım.


3
HTML / JS / CSS için: web-beautiful.el. Bu bulduğum en iyisidir, ancak node.js.'ye bağlıdır.
dadı

Yanıtlar:


10

fill-regionGirintiden daha çok işleve ihtiyacınız var gibi görünüyor .

  • Bu çizgiyi seçin ve yapın M-x fill-region.
  • Aynısını seçin, şimdi birden fazla satıra bölün ve yapın M-x indent-region.

Ancak bu, örneğinizde gösterildiği gibi tam noktalara yeni satırlar eklemeyecektir. Sadece çizgiyi dolgu sütunlarına sığdırır.


1
iyi, bu bir şey. Belki de istediğim yine de mümkün değildi. Belki birisinin daha agresif bir girinti için büyülü bir çözümü olması durumunda biraz daha bekleyeceğim ... Başka bir şey çıkmazsa, bunu cevap olarak işaretleyeceğim.
Emmanuel Touzery

@EmmanuelTouzery İstediğiniz şey, newline'ı yerleştirme kuralları tutarlı olduğu sürece little elisp ile elde edilebilir. Biçimlendirilmiş sonucun sizin örnekte, sana sonra bir yeni satır yok olduğunu görüyoruz {içinde {"menu":ancak ardına var {içinde {"id":. JSON'u tanımıyorum ve bu nedenle biçimlendirilmiş yanıtınız muhtemelen eksik olan bir kalıba sahip. Ancak sorunuzu yeni bir satır eklemek için bir dizi kuralla güncelleyebilirseniz, birileri istediğiniz cevabı bulabilir.
Kaushal Modi

Dile özgü kurallar da dahil olmak üzere herhangi bir dil için var olacağını düşündüm. Örneğin, {java için ilk satırda, C # için bir sonraki satırda diyelim.
Emmanuel Touzery

(başka bir deyişle, gofmtherhangi bir dilden başka bir şey gibi ) - gofmt.com
Emmanuel Touzery

19

json.elpaket sağlar json-pretty-print-buffer. Örneğiniz için ne üretiyor:

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

Bana çok iyi geliyor.


2
Evet, aslında github.com/gongo/json-reformat adresinde "Emacs 24.4'tenjson-pretty-print ve json-pretty-print-buffer(benzer özelliklere benzer json-reformat-region) birlikte" olduğunu gördüm . Ancak emacs'ın, her dilde (her popüler ana mod için özel) işe yarayacak bir işlevi olabileceğini düşündüm.
Emmanuel Touzery

bu doğru cevaptır
Joe Heyming

6

Ucu göre burada , kendi Json dosyasında bir bölgeyi biçimlendirmek için harici komutunu kullanabilirsiniz:

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

Tamponun tamamını biçimlendirmek için kolayca genişletebilirsiniz:

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

Emacs, programlama dilleri için ( Lisp hariç ) biçimlendirme aracına sahip değildir , yalnızca girinti komutlarına sahiptir.


1
Ben keşfettim M-x json-reformat-regiono spacemacsve eserleri ile gemi, ama evet, herhangi bir dil için ve belli başlı moduna göre her zaman aynı kısayol, o istiyorum ... ... Bu çok kötü desteklenmediğini görünüyor
Emmanuel Touzery

1
Bir dili düzgün biçimde biçimlendirmek için gerçek bir dil ayrıştırıcısına ihtiyacınız var. Emacs, bazı diller için yerleşik dil ayrıştırıcılarına sahiptir, ancak yalnızca yerleşik Lisp ayrıştırıcısı, yakın zamanda kod yeniden biçimlendirmesi için yukarıdaki demoya bağlantı olarak kullanılır. Eğer harici formatlayıcılar mevcutsa, Emacs ile entegrasyon kolaydır, yani clang-format.
Tu

2

Bu özel senaryo json-pretty-printiçin vurgulanan json yığınını güzelleştirecek.


1

BTW, SMIE'yi girinti motoru olarak kullanan büyük modlar için, bir auto-fill-modedestek biçiminde bunun için ihtiyacınız olanın bir kısmı var . Bence fill-paragraphya fill-regioniyi bir iş yapmayacağım, ancak tek bir satır üzerine kodunuzu koyarsanız, o satırın sonuna gidip yapmak M-: (smie-auto-fill)(muhtemelen, boyunca uzanan tho mükemmel değil) o aklı başında sonuçları vermelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.