Xóa dấu ngoặc quanh vùng


8

Có một sự thay thế tốt hơn cho chức năng này mà tôi sử dụng để loại bỏ các parens quanh một khu vực không? Tôi đang tìm kiếm một nội dung Emacs, hoặc một cái gì đó được viết tốt hơn, thứ gì đó sẽ loại bỏ bất kỳ cặp nào xung quanh khu vực đã chọn (ví dụ: ngoặc, ngoặc nhọn, dấu ngoặc kép, dấu ngoặc đơn)

(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)))))) 

Câu trả lời:


8

Nếu bạn cài đặt smartparens , thì bạn có thể sử dụng chức năng sp-splice-sexp, chính xác những gì bạn đang yêu cầu. Nó hoạt động trên tất cả các loại niềng răng và báo giá hợp lệ, theo chế độ chính hiện tại. Xem các tài liệu để biết thêm chi tiết.

Chỉnh sửa: Ưu điểm chính của smartparenshơn paredit(xem câu trả lời của rekado) là smartparenshỗ trợ tốt hơn cho các ngôn ngữ khác ngoài ngôn ngữ chính. Nó cũng cho phép các dấu phân cách nhiều ký tự như dấu ngoặc kép trong python hoặc các thẻ trong XML / HTML.


7

pareditchức năng paredit-splice-sexp, có thể làm những gì bạn muốn.

Trong ví dụ này |chỉ ra điểm:

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

Đây là một ví dụ khác:

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

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

Tuy nhiên, nó không hoạt động ở cấp cao nhất, vì điều đó sẽ dẫn đến biểu thức s không hợp lệ. Nó cũng không hoạt động trên một khu vực mà trên các biểu thức s.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.