보류중인 모든 괄호 닫기


14

lisp 코드를 작성할 때 때때로 중첩 표현식에 깊이 빠져 있으며 누락 된 닫는 괄호를 모두 삽입하기 만하면됩니다. 지금은 일치하지 않는 paren을 얻을 때까지 그냥 삽입하고 있지만 매우 효율적이지 않습니다.
빠진 괄호를 모두 삽입하는 명령이 있습니까?

참고로, smartparens를 사용하여 일치하는 parens를 자동으로 삽입하고 있습니다. 그럼에도 불구하고 때로는이 작업을 수행해야합니다.


2
FWIW, Franz Lisp (CL 이전)는 ]요청에 따라 모든 열린 패런을 닫아 슈퍼 오른쪽 패런으로 작동 하는 기능이있었습니다 .
Drew

2
과거에도 같은 방법을 사용했습니다. 그 이후로 paredit을 사용 하기 시작했습니다. 문제가 시작되기 전에 중지합니다. 유일한 경고는 코드에 붙여 넣을 때 동일한 균형 처리가 이루어지지 않는다는 것입니다.
elarson

답변:


6

닫히지 않은 괄호와 일치하는 쌍을 모두 닫는 함수가 있습니다. 그것은 Emacs의 sexp 파싱에 의존합니다. 단일 문자 일치 쌍만 지원하므로과 같이 {-닫히지 }않고 로 닫습니다 -}. Lisp의 경우에는 중요하지 않습니다.

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

IIUC,이 점은 일치하는 괄호 안에 해당 지점이 없어야합니다. 나는 OQ가 리스프 표현 내부에서 작업하는 데 필요한 인상을 받았으며, 괄호가 일치하지 않지만 다른 괄호는 일치하지 않습니다.
Malabarba

@Malabarba 이전에 열린 모든 괄호는 포인트 후 이미 닫는 괄호가 있는지 여부에 관계없이 닫힙니다. 그것이 내가 그 질문을 이해하는 방법이지만,이 시점에서는 분명하지 않습니다. 해석에 따라 닫는 구분 기호는 어디에 삽입됩니까? 예를 들어 ([-!-foo], ])지점 또는 )이후에 삽입 foo]합니까?
Gilles 'SO- 악마 그만해

내 이해에서, 당신이 가지고 있다면 ([-!-foo], 나는 )후에 삽입 할 것 foo]입니다. 그러나 물론 틀릴 ​​수 있습니다. 어쩌면 @rlazo는 정교 할 수 있습니다.
Malabarba

내 유스 케이스의 경우 @Gilles가 맞습니다. 점 뒤에 구분 기호가 닫혀 있는지 상관하지 않습니다. 포인트 전에 모든 것을 닫고 싶습니다.
rlazo

3

점액이 설치되어 있으면 이것을 수행하라는 명령이 있음을 알았습니다. slime-close-all-parens-in-sexp


흠 ... 그래서 이것은 현재 줄에서 닫히는 것처럼 보입니다. "현재 블록"을 닫는 접근 방식이 있으면 좋을 것입니다. 이것은 파일의 끝으로 이동 한 다음 닫히지 않은 것을 찾을 때까지 sexp를 뒤로 이동하여 얻을 수 있습니다.
Att Righ

1

그렇게하는 매우 원시적 인 (거의 확실하게 잘못된) 방법은

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

다른 제한 사항 중에서 삽입이 필요한 모든 괄호는 다음과 같다고 가정합니다.

  • 닫는 것
  • 현재 위치에서 필요

특정 사용 사례에 유용 할 수있을 것 같습니다.


닫는 괄호가 너무 많으면 무한 루프에 빠지게됩니다.
Emil Vikström

@ EmilVikström yep, 그건 내 첫 번째 제한과 호환되지 않습니다 :)
Sigma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.