Remover parênteses na região

8

Existe uma alternativa melhor para essa função que eu uso para remover parênteses em uma região? Estou procurando por um Emacs embutido, ou algo melhor escrito, algo que remova qualquer par da região selecionada (ex: colchetes, colchetes, aspas duplas, aspas simples)

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

Respostas:

8

Se você instalar smartparens , poderá usar a função sp-splice-sexp, que faz exatamente o que você está solicitando. Ele funciona em todos os tipos válidos de chaves e cotações, de acordo com o modo principal atual. Veja os documentos para mais detalhes.

Edit: A principal vantagem do smartparensover paredit(veja a resposta do rekado) é que ele smartparenstem melhor suporte para outros idiomas além do lisp. Ele também permite delimitadores de vários caracteres, como aspas triplas em python ou tags em XML / HTML.

descontinuada
fonte
7

Existe paredituma função paredit-splice-sexpque pode fazer o que você deseja.

Neste exemplo |indica o ponto:

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

Aqui está outro exemplo:

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

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

No entanto, ele não funciona no nível superior, porque isso resultaria em uma expressão s inválida. Ele também não opera em uma região, mas em expressões s.

rekado
fonte