リージョンの周りの括弧を削除します


8

リージョンの周りの括弧を削除するために使用するこの関数のより良い代替手段はありますか?私はEmacsビルトイン、または選択された領域の周りのペアを削除するもの(例:大括弧、中括弧、二重引用符、単一引用符)を削除するものを探しています

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

回答:


8

smartparensをインストールする場合は、関数を使用できます。この関数はsp-splice-sexp、求めていることを正確に実行します。現在のメジャーモードに応じて、中括弧と引用符のすべての有効なタイプで機能します。詳細については、ドキュメントを参照してください。

編集:の主な利点smartparensの上には、paredit(rekadoの答えを参照)ことがあるsmartparenslispの以外の言語のためのより良いサポートしています。また、Pythonの三重引用符やXML / HTMLのタグなど、複数文字の区切り文字も使用できます。


7

ありますparedit機能持っているparedit-splice-sexpあなたがやりたいかもしれません。

この例で|は、ポイントを示しています。

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

次に別の例を示します。

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

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

ただし、最上位で機能しません。これは、無効なs式になるためです。またんていない地域ではなく、S式で動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.