Hapus tanda kurung di sekitar wilayah

8

Apakah ada alternatif yang lebih baik untuk fungsi ini yang saya gunakan untuk menghapus parens di sekitar suatu wilayah? Saya mencari bawaan Emacs, atau sesuatu yang ditulis lebih baik, sesuatu yang akan menghilangkan pasangan di sekitar wilayah yang dipilih (mis: kurung, kurung keriting, tanda kutip ganda, tanda kutip tunggal)

(defun my-delete-surrounded-parens ()
  (interactive)
  ;; save where region begins & ends                                                                            
  (let ((beginning (region-beginning))
        (end (region-end)))
    (cond ((not (eq (char-after beginning) ?\())
           ;; if region not begins by (, trigger error                                                          
           (error "Char at region-begin not an open-parens"))
          ((not (eq (char-before end) ?\)))
           ;; if region not ends by ), trigger error                                                            
           (error "Char at region-end not a close-parens"))
          ;; save mark, pt, current buffer & execute body                                                       
          ((save-excursion
             (goto-char beginning)
             (forward-sexp)
             (not (eq (point) end)))
           ;; if parens are not balanced, trigger error                                                         
           (error "parens not balanced"))
          (t (save-excursion
               (goto-char end)
               (delete-char -1)
               (goto-char beginning)
               (delete-char 1)))))) 
Nsukami _
sumber

Jawaban:

8

Jika Anda menginstal smartparens , maka Anda dapat menggunakan fungsi sp-splice-sexp, yang melakukan persis apa yang Anda minta. Ini bekerja pada semua jenis kawat gigi dan kutipan yang valid, sesuai dengan mode utama saat ini. Lihat dokumen untuk detail lebih lanjut.

Sunting: Keuntungan utama smartparensover paredit(lihat jawaban rekado) adalah smartparensmemiliki dukungan yang lebih baik untuk bahasa selain lisp. Ini juga memungkinkan pembatas multi-karakter seperti triple-quotes dalam python atau tag dalam XML / HTML.

usang
sumber
7

Ada paredityang memiliki fungsi paredit-splice-sexp, yang mungkin melakukan apa yang Anda inginkan.

Dalam contoh ini |menunjukkan titik:

(hello world "no |way")  ; run paredit-splice-sexp
(hello world no way)

Ini contoh lain:

(let ((a b))
  (fo|rmat #t "meh")) ; run paredit-splice-sexp

(let ((a b))
  format #t "meh")

Namun, itu tidak berfungsi pada level atas, karena itu akan menghasilkan ekspresi s yang tidak valid. Itu juga tidak beroperasi di suatu daerah tetapi pada ekspresi-s.

rekado
sumber