Mungkin dipengaruhi oleh Clojure, saya lebih sering menggunakan daftar properti sebagai struktur data. Emacs sebagian besar waktu indentasi mereka seperti ini,
`(:token ,token
:token-quality ,quality) ,
sementara ini yang saya inginkan
`(:token ,token
:token-quality ,quality) .
Jadi, saya bertanya-tanya, apakah seseorang sudah menangani ini?
Fuco1/lisp-indent-function
dan lakukan(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Jawaban:
Itu dapat dicapai dengan mengubah
lisp-indent-function
mode for emacs-lisp:Dari
lisp-mode.el
dalam sumber emacs,Alternatif
Seperti @wasamasa disebutkan dalam komentar untuk pertanyaan, @ Fuco1 (di github.com) telah memodifikasi default
lisp-indent-function
untuk memperbaiki indentasi kata kunci (dimulai dengan:
).Emacs telah menyediakan variabel
lisp-indent-function
bagi pengguna untuk memilih fungsi apa yang akan digunakan untuk indentasi dalam mode lisp.Alih-alih menimpa definisi fungsi asli, kita dapat membuat fungsi kita sendiri dan menetapkan variabel di atas untuk nama fungsi tersebut.
Dalam contoh ini,
Fuco1/lisp-indent-function
di pengaturan emacs Andaemacs-lisp-mode
:Referensi
Fungsi modded disisipkan di bawah jika sumber yang dirujuk ke github hilang.
sumber
lisp-indent-function
.(setq lisp-backquote-indentation nil)
daftar backquoted (seperti dalam pertanyaan asli).Intro untuk menghitung indentasi-lisp
Solusi yang lebih baik adalah mengganti fungsi
calculate-lisp-indent
. Singkatnya,calculate-lisp-indent
adalah fungsi yang mengembalikan kolom yang barisnya harus di indentasi. Fungsi ini yang menginformasikanlisp-indent-function
berapa banyak setiap baris harus diindentasi. (lihat juga posting saya di reddit untuk informasi lebih lanjut).Perbandingan dengan Jawaban lain
Keuntungan dari jawaban ini dibandingkan dengan menggunakan fungsi Fuco1 yang dimodifikasi adalah bahwa (1) memperbaiki akar masalah yang terletak pada
calculate-lisp-indent
bukan hanya membersihkan setelah lekukan yang salah dikembalikan olehcalculate-lisp-indent
(2) ia menggeneralisasi untuk mengutip dan mengutip kembali daftar (dan itu berfungsi baik mereka dikutip / dikutip ulang secara eksplisit atau dengan'
dan `). Ini juga bekerja dengan kutipan dan backquotes yang disarang secara sewenang-wenang.Keuntungan dari jawaban ini dibandingkan
lisp-indent-function
dengancommon-lisp-indent-function
fungsinya adalah tidak memiliki efek samping mengacaukan lekukan lain. Elisp dan common-lisp dibuat indentasi berbeda.Bagaimana itu bekerja
Bersyarat (dalam hal ini
calculate-lisp-indent
) adalah apa yang memutuskan apakah sexp sebuah menjorok seperti fungsi atau tidak. Apa yang termasuk dalam klausa lain adalah lekukan seperti fungsi. Apa yang termasuk dalam klausa ini adalah indentasi normal (di bawah elemen saat ini). Untuk menjadikannya indentasi daftar yang dikutip sebagai data alih-alih sebagai fungsi, kita perlu menambahkan lebih banyak pemeriksaan untuk kasus-kasus di mana daftar tersebut dikutip dalam predikat bersyarat.Kode ini memeriksa tanda kurung terbuka dari sexp yang sedang indentasi. Jika sexp dengan multiple sexp memeriksa semuanya. Ini mengembalikan t jika ia menemukan sexps yang dikutip atau dikutip kembali.
Bonus
Jika Anda ingin daftar yang dimulai dengan kata kunci diindentasi sebagai data meskipun tidak dikutip, tambahkan ini sebagai cek lain ke predikat bersyarat. Ini mungkin berguna untuk makro di mana daftar tidak dikutip untuk kenyamanan seperti di defhydra .
Contohnya
Cuplikan kode lengkap yang saya poskan di bawah berfungsi dengan case yang Anda sebutkan dan banyak lagi. Silakan dicoba!
Untuk penjelasan yang lebih mendalam tentang cara kerjanya, lihat posting saya di reddit .
Cuplikan Kode Lengkap
Berikut ini cuplikan kode lengkap.
Catatan Akhir
Perlu dicatat bahwa pertanyaan ini akan lebih digeneralisasikan sebagai cara untuk menghentikan emacs dari indentasi daftar yang dikutip dan tidak dikutip sebagai fungsi .
sumber
Untuk alternatif yang jauh lebih peretas dari jawaban kaushalmodi, Anda dapat menimpa yang
lisp-indent-function
serupa dengan yang dilakukan Mark H. Weaver untukscheme-indent-function
memperbaiki perataan kata kunci dalam Skema Guile.Saya baru saja menyalin kode dari http://netris.org/~mhw/scheme-indent-function.el ; satu-satunya perubahan adalah menambahkan
cond
klausa baru . Anda mungkin ingin mengambil kode saat inilisp-indent-function
daripada menggunakan fungsi ini apa adanya.(Sayang sekali bahwa fungsi indentasi tidak mengekspos lebih banyak kait untuk menyederhanakan perubahan kecil seperti ini.)
sumber
lisp-indent-function
? Juga sepertinya tidak ada fungsiemacs-lisp-indent-function
.lisp-indent-function
berisi fungsi indentasi secara default. Menentukan variabel ini identik dengan menimpa fungsi indentasi default untuk mode emacs-lisp. (Anda benar, tidak ada yang istimewaemacs-lisp-indent-function
, hanya sajalisp-indent-function
.)Anda dapat mengganti
lisp-indent-function
dengan cara bukti di masa depan menggunakan el-patch paket saya :Ini memperbaiki masalah bagi saya; melihatnya dalam konteks .
sumber