Dalam bahasa (julia) yang memiliki blok yang ditentukan oleh kata kunci seperti for..end
,, begin..end
dan tanda kurung, apa cara yang baik untuk melewati blok seperti itu? Selain itu, end
tidak hanya kata kunci blokir, tetapi juga pengidentifikasi yang valid yang digunakan di tempat lain.
Salah satu caranya adalah mencari regex blok awal / penutup, dan melompati semua string, komentar, dan end
s, dll., Tetapi ini agak tidak efisien, dan sedikit jelek.
Apakah ada cara untuk membuat parsing sintaks emacs sendiri mengenali kata kunci blok tersebut, sehingga forward/backward-sexp
secara otomatis akan berfungsi, dan agar orang dapat dengan cepat mengetahui awal blok saat ini dari output, misalnya syntax-ppss
,?
[Catatan: Saya sendiri tidak keberatan mem-parsing file, tetapi dalam hal ini saya masih ingin tahu bagaimana parser saya harus dicolokkan ke sisa emacs.]
ruby-mode
mana melakukan sesuatu yang mirip dengan ruby. Pilihan lain adalah dengan menghubungkan ke smartparens , ia memiliki konfigurasi khusus untuk mode ruby yang dapat Anda gunakan sebagai titik awalJawaban:
Anda dapat melihat perpustakaan SMIE bawaan (kependekan dari Simple-Minded Indentation Engine). Terlepas dari namanya, lekukan hanyalah salah satu fitur yang disediakannya. Ini adalah metode yang digunakan oleh banyak mode (termasuk
ruby-mode
, disebutkan dalam komentar), untuk memberikan gerakan dan lekukan sexp.Menyebarkan SMIE untuk suatu bahasa kira-kira merupakan pekerjaan dua langkah:
Untuk tujuan Anda, hanya langkah pertama yang akan dibutuhkan!
Secara keseluruhan, parser mendefinisikan cara ini dihubungkan dengan baik ke emacs. Sebagai contoh,
show-parens
akan menyoroti ekspresi seperti paren yang didefinisikan dalam tata bahasa SMIE (setidaknya dalam versi emacs yang cukup baru).Perhatikan bahwa Anda masih tidak dapat menggunakan
syntax-ppss
untuk mendapatkan informasi tentang lingkungan terlampir, karena hanya akan memberi Anda hasil parser tabel-sintaks. Tetapi fungsi gerakan sexp (misalnyaup-list
diikuti olehbackward-sexp
) dapat menjadi pengganti.sumber
Saya membuat perpustakaan untuk ini
Setelah ditentukan, banyak perintah tersedia, bergerak maju, mundur, menyalin dll.
Mendefinisikan --in pseudo-code--:
Ketika selesai, itu harus tersedia, yaitu disalin dan dikembalikan seperti ini
sumber