Buat forward-sexp mengenali blok yang ditentukan oleh kata kunci, bukan hanya tanda kurung

10

Dalam bahasa (julia) yang memiliki blok yang ditentukan oleh kata kunci seperti for..end,, begin..enddan tanda kurung, apa cara yang baik untuk melewati blok seperti itu? Selain itu, endtidak 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 ends, 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-sexpsecara 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.]

Kirill
sumber
1
Anda dapat melihat di ruby-modemana 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 awal
Iqbal Ansari

Jawaban:

9

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:

  • tentukan tata bahasa untuk bahasa Anda, bersama dengan lexer token pengenal;
  • mendefinisikan aturan lekukan.

Untuk tujuan Anda, hanya langkah pertama yang akan dibutuhkan!

Secara keseluruhan, parser mendefinisikan cara ini dihubungkan dengan baik ke emacs. Sebagai contoh, show-parensakan 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-ppssuntuk mendapatkan informasi tentang lingkungan terlampir, karena hanya akan memberi Anda hasil parser tabel-sintaks. Tetapi fungsi gerakan sexp (misalnya up-listdiikuti oleh backward-sexp) dapat menjadi pengganti.

T. Verron
sumber
2

Saya membuat perpustakaan untuk ini

Setelah ditentukan, banyak perintah tersedia, bergerak maju, mundur, menyalin dll.

Mendefinisikan --in pseudo-code--:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Ketika selesai, itu harus tersedia, yaitu disalin dan dikembalikan seperti ini

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Andreas Röhler
sumber