Entfernen Sie Klammern um die Region

8

Gibt es eine bessere Alternative zu dieser Funktion, mit der ich Parens in einer Region entferne? Ich suche nach einem eingebauten Emacs oder etwas Besserem, das alle Paare in der ausgewählten Region entfernt (z. B. Klammern, geschweifte Klammern, doppelte Anführungszeichen, einfache Anführungszeichen).

(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 _
quelle

Antworten:

8

Wenn Sie smartparens installieren , können Sie die Funktion verwenden sp-splice-sexp, die genau das tut, was Sie verlangen. Es funktioniert mit allen gültigen Arten von geschweiften Klammern und Anführungszeichen gemäß dem aktuellen Hauptmodus. Weitere Informationen finden Sie in den Dokumenten .

Bearbeiten: Der Hauptvorteil von smartparensover paredit(siehe die Antwort von rekado) besteht darin, dass smartparensandere Sprachen als lisp besser unterstützt werden. Es ermöglicht auch Trennzeichen mit mehreren Zeichen, z. B. dreifache Anführungszeichen in Python oder Tags in XML / HTML.

veraltet
quelle
7

Es pareditgibt eine Funktion paredit-splice-sexp, die tun kann, was Sie wollen.

In diesem Beispiel |gibt Punkt an:

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

Hier ist ein weiteres Beispiel:

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

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

Es funktioniert jedoch nicht auf der obersten Ebene, da dies zu einem ungültigen s-Ausdruck führen würde. Es funktioniert auch nicht für eine Region, sondern für S-Ausdrücke.

rekado
quelle